문제

개발자가 실제로 테스트 한 소프트웨어 버전을 해제하는 것이 낫다고 생각합니다. 따라서 프로젝트/makefile에서 '디버그'대상을 삭제하는 경향이 있으므로 구축 및 테스트 및 디버깅 및 릴리스 할 수있는 버전이 하나뿐입니다.

비슷한 이유로, 나는 '어설 션'을 사용하지 않습니다 (또한 참조 주장은 항상 나쁜가요? ...).

그곳의 한 사람은 '디버그'버전의 이유는 디버그하기가 더 쉽기 때문이라고 주장했다. 그러나, 나는 당신이 릴리스 된 것을 지원하고 디버깅하고 싶을 수도 있다고 주장했다. 그래서 당신은 릴리스를 구축해야한다. 필요한 경우 디버그 할 수 있습니다 ... 이는 '릴리스'빌드에서도 디버그 기호를 활성화하고 일부 최적화를 비활성화 할 수 있습니다.

다른 사람은 "이것은 그렇게 나쁜 생각입니다"라고 말했습니다. 몇 년 전에 진화 한 정책입니다.

  • 일부 개발자가 디버그를 테스트하지만 릴리스 버전을 테스트합니다.
  • 릴리스 버전에만 표시되는 일부 개발자의 쓰기 버그
  • 부적절한 테스트 후 회사가 릴리스 버전을 출시합니다 ( 항상 전적으로 충분합니까?)
  • 릴리스 버전을 디버깅하기 위해 호출됩니다

그 이후로 나는 다른 개발 상점 이이 관행을 따르는 것을 보았습니다 (즉, 별도의 디버그 및 릴리스 빌드가 없습니다).

당신의 정책은 무엇입니까?

도움이 되었습니까?

해결책

이것은 사소할 수 있지만 다른 사람들이 여기서 말한 것에 추가합니다. QA 테스트 릴리스를 구축하는 것의 장점 중 하나는 시간이 지남에 따라 QA에서 문제가 발생하는 이유를 파악 해야하는 개발자의 요구로 인해 소프트웨어의 내장 디버깅 및 로깅 기능이 발전한다는 것입니다.

개발자가 릴리스 빌드를 디버그해야할수록 고객이 문제가 발생할 때 나중에 더 나은 도구를 갖습니다. 물론 개발자가 개발주기의 일환으로 릴리스 빌드에서 작업 할 이유가 없습니다.

또한 QA를 디버그에서 릴리스로 전환하는 오버 헤드가 버전 테스트 기간의 중간에 빌드를 제공하기에 충분한주기가있는 소프트웨어 회사를 모릅니다. 전체 QA 사이클을 수행하는 것은 너무 자주 거의 거의 발생하지 않는 것입니다.

다른 팁

별도의 디버그 및 릴리스 빌드를 갖는 것은 개발이 쉬워지기 때문에 좋은 생각입니다.

그러나 디버그 빌드는 테스트가 아닌 개발 전용이어야합니다. 테스트 릴리스 빌드 만 있습니다. 또한 개발자를 사용하여 해당 빌드를 테스트하지 않고 테스터를 사용합니다.

두 세계의 최선을 다하는 간단한 정책입니다.

편집하다: 의견에 대한 응답으로 디버그 및 릴리스 빌드 (CAN)가 다른 코드를 생성하는 것이 분명하다고 생각합니다. "-ddebug"대 "-dndebug"및 "#if defined (debug)"등을 생각하십시오.

따라서 배송을 끝내는 코드를 테스트하는 것이 중요합니다. 만약 너라면 하다 디버그 및 릴리스 빌드에서 다른 코드를 생성하면 동일한 사람이 테스트했는지 여부에 관계없이 두 번 테스트합니다.

그러나 디버그 기호는 그다지 큰 문제가 아닙니다. 항상 디버깅 기호로 빌드하고, 벗겨지는 바이너리의 사본을 보관하지만 벗겨진 바이너리를 해제하십시오. 어떻게 든 빌드 번호로 각 바이너리를 태그하는 한, 당신은 항상 당신이 디버깅 해야하는 스트리핑 된 바이너리에 해당하는 어떤 스트리핑 된 바이너리에 해당하는지 항상 식별 할 수 있어야합니다 ...

외부 소스에서 디버거에서 바이너리와로드 기호를 제거하는 방법은 플랫폼에 따라 다릅니다.

우리의 정책은 개발자가 디버그 빌드에 대한 작업을 수행하도록하는 것이지만 다른 모든 사람 (QA, BAS, 판매 등)은 릴리스 버전을 실행합니다. 어제 나는 릴리스 빌드에서만 나타나는 버그를 수정해야했는데, 릴리스에만 나타 났기 때문에 단순히 무슨 일이 있었는지 분명했습니다.

이 가게에서 첫 번째 것이며 18 개월 정도 여기에있었습니다.

릴리스 빌드가 디버그 빌드와는 다른 일을 할 때 일이 털이 발생하는 곳입니다. 예, 저는 지옥에 가서 매우 오래된 매우 로피 프로덕션 코드에서 이것을 보았습니다.

구성 사이의 유일한 차이가 디버그 기호와 최적화라면 둘 다 가지 않을 이유가 없습니다.

따라서 필요한 경우 디버그 할 수있는 릴리스를 작성해야합니다. 이는 '릴리스'빌드에서도 디버그 기호를 활성화하고 일부 최적화를 비활성화하는 것을 의미 할 수 있습니다.

음 ... 당신이 나에게 디버그 빌드를하고있는 것 같네요 ... 맞죠?

당신이 잘못한 부분은이 진술입니다.

개발자가 실제로 테스트 한 소프트웨어 버전을 해제하는 것이 낫다고 생각합니다.

개발자는 코드를 테스트하지 않습니다. 테스트 테스트 코드.

단위 테스트는 테스트해야합니다 모두 구성을 빌드하십시오. 개발자가 한 손으로 등 뒤로 묶어 두지 않도록하십시오. 그들이 처분하는 모든 디버깅 도구를 사용하도록하십시오. 디버그 빌드는이 중 하나입니다.

Asserts와 관련하여 : 어설 션의 사용은 계약별로 프로그램인지 아닌지에 크게 달려 있습니다. 그렇다면, 주장은 단지 디버그 빌드에서 계약을 확인합니다.

링크 된 스레드의 답변에 따라 매우 유사한 이유로 디버그 및 릴리스를 위해 동일한 빌드를 사용합니다. Optimiser의 10% -20% 성능 이득은 알고리즘 수준에서 수동 최적화와 비교할 때 매우 작은 경향이 있습니다. 단일 빌드는 많은 잠재적 인 버그를 제거합니다. 구체적으로;

  • 비 초기 변수 및 작은 버퍼 오버 플로우는 디버그 및 최적화 된 릴리스 빌드에서 매우 다른 결과로 끝날 수 있습니다.

  • 사용 가능한 기호 정보가 있더라도 객체가 소스와 일치하지 않기 때문에 최적화 된 릴리스를 디버깅하는 것은 어려울 수 있습니다. 예를 들어 변수는 최적화되었고 코드가 다시 정리되었을 수 있습니다. 따라서 테스트 된 릴리스 빌드에서보고 된 버그는 더 어려울 수 있으며, 따라서 시간이 소요될 수 있습니다.

자동화 된 회귀 테스트에서 최적화되지 않은 최적화 및 최적화 된 빌드를 비교 한 결과, 최적화에 의해 제공되는 성능 이득은 제 경우에는 두 개의 빌드를 갖기에 충분한 추가 값을 제공하지 않습니다. 내가 개발 한 소프트웨어는 매우 CPU 배가 고프다는 점에 주목할 가치가 있습니다 (예 : 대형 표면 모델을 생성하고 조작하는).

Java로 발전 할 때는 비 데그 버전을 싫어합니다. 예외가 발생하면 버그를 추적하기가 어렵거나 불가능한 라인 정보를 얻지 못합니다. 또한 Debug와 Non-Debug의 런타임 차이는 Java 5 이상에서 약 5%이므로 실제로는 문제가되지 않으며 오늘의 하드 디스크에서는 더 이상 크기가 중요하지 않습니다.

디버그 버전을 사용하여 플러스 측면에서 :

  • 스택 추적에는 필요한 모든 정보가 포함되어 있습니다
  • 변수를 검사 할 수 있습니다
  • 프로덕션에 문제가있는 경우 서버를 먼저 중지하지 않고도 디버그 버전을 설치하지 않고도 실행중인 프로세스에 연결할 수 있습니다.
  • 영리한 최적화 버그로 잡히지 않을 것입니다
  • 빌드는 더 간단합니다 (하나의 아티팩트 만)

개발자는 Debug Builds, QA 및 기타 모든 사람이 "프로덕션"이라고하는 릴리스 버전을 사용합니다. 이것의 주요 장점은 디버그 빌드에서 많은 추가 코드와 어설 션을 추가 할 수 있다는 것입니다. 일부 개체에는 디버거에서 코드를 볼 때 제외하고는 사용하지 않는 추가 정보가 포함되어 있습니다. 일부 객체는 모든 상태 정보가 일관되도록하기 위해 정기적으로 자체 검증을합니다. 이러한 것들은 디버그 버전을 훨씬 느리게 만들지 만 생산 빌드에서 찾을 수있는 버그의 끝을 찾지 못했습니다.

내가 말했듯이, 모든 QA 및 성능 테스트는 프로덕션 빌드를 사용하며 때로는 생산에 나타나지 만 디버그에 포함되지 않은 문제가 발생합니다. 그러나 그것들은 비교적 드문 일이며 개발자로서 생산 빌드보다는 디버그 빌드를 디버깅하는 것의 장점이 그 문제보다 훨씬 큽니다.

프로젝트 규모와 사용중인 빌드 시스템 및 테스트 유형에 달려 있다고 생각합니다.

자동화 된 빌드 시스템이 제자리에 있고 주어진 빌드에서 단위를 실행하는 것이 간단한 경우 여러 빌드 유형에 아무런 문제가 없어야합니다.

나는 항상 "당신이 디버깅하는 것을 선박으로 배송하기 때문에 배송 내용을 디버깅 할 수 있습니다"접근 방식을 구독했습니다.

제 생각 에이 토론은 매우 중요한 점을 놓쳤습니다.

그것은 실제로 어떤 종류의 프로젝트인지에 달려 있습니다!

네이티브 (C/C ++) 프로젝트를 작성하는 경우 실제로 컴파일러 최적화로 인해 디버깅을 거의 불가능하게 만들 수 있기 때문에 디버그 빌드를 만들어야합니다.

웹 애플리케이션을 작성하는 경우 런타임 동안 로깅 기능을 활성화 할 수있는 하나의 빌드 (일부 웹 애플리케이션에 대해 오히려 오히려 오히려 오도)를 갖기를 원할 수도 있습니다.

기본 C ++ 프로젝트와 PHP 웹 애플리케이션이 분명히 존재하는 모든 종류의 프로젝트는 아니지만 내 요점이 다가 오길 바랍니다.

추신 : C#을 위해 개발할 때는 디버그 빌드를 사용하는 것이 컴파일러 최적화를 비활성화하지만 내 경험상 C ++와 마찬가지로 거의 차이가 거의 없기 때문에 테두리 케이스가 발생합니다.

여기서 우리는 디버그 모드에서 개발하고 모든 단위 테스트를 릴리스 모드로 수행합니다. 우리는 클래식 ASP, ASP.NET, VB.NET 및 C#의 다양한 지원을위한 몇 가지 (12 세 미만) 응용 프로그램을 갖춘 소규모 상점입니다. 또한 모든 테스트를 처리 할 수있는 전용 담당자가 있으며 디버깅 된 문제는 개발자에게 다시 던져집니다.

우리는 항상 그렇게하지 않는 것을 고려하지도 않습니다. 디버그 옵션을 활성화하면 코드 크기가 증가하고 성능이 느려집니다. 테스트 할 때 소프트웨어 유형에 문제가되지 않지만 고객이 코드와 5 개의 다른 앱을 실행하는 경우 어떻게해야합니까?

자동화 된 테스트를 사용하여 테스트 문제를 해결할 수 있으므로 출시 준비가되었을 때 릴리스 빌드를 쉽게 테스트 할 수 있습니다. 개발자 나 회사가 릴리스 빌드를 올바르게 테스트하지 못하는 것은 릴리스 및 디버그 빌드 아이디어가 아니라 개발자 및 회사에서 실패한 것입니다.

마지막 시점에서, 나는 릴리스 빌드를 디버깅하라는 요청을받지 못했습니다.

트레이드 오프입니다. CPU 사이클이 저렴하고 저렴 해지는 동안 인간주기는 비싸지 않다는 점을 감안할 때, 크고 복잡한 프로그램 인 Debug (Gable) 버전의 단일 버전 만 유지하는 것이 의미가 있습니다.

항상 주장을 사용하는 것은 항상 사용하지 않는 것보다 더 안전한 정책입니다. 별도의 디버그 및 릴리스 버전을 생성하는 경우 다시 활성화 할 수 있습니다. #defineD 기호 릴리스 버전에서 어설 션이 활성화되어 있음을 보장해야합니다.

트레이드 오프는 간단하다고 생각합니다. 예, 릴리스 빌드 만 있으면 실제로 배송되는 내용을 실제로 테스트합니다. 반면에, 당신은 개발자를 위해 디버깅을 편하게하기 쉽고 사용자를위한 성능을 지불하므로 두 경우를 모두 확인하는 것이 귀하에게 달려 있습니다.

대부분의 중간 규모의 대규모 프로젝트에서 디버깅의 용이성 ~ 할 것이다 결국 사용자에게 더 나은 제품을 보장하십시오.

이것 좀 봐 가장 논란의 여지가있는 프로그래밍 의견은 무엇입니까?

인용하다:

의견 : "디버그"와 "릴리스"빌드 사이에 다른 코드가 없습니다.

주된 이유는 릴리스 코드가 거의 테스트되지 않습니다. 야생과 동일한 코드를 테스트하는 것이 좋습니다.

"디버그 대상"을 제거하면 개발자가 소프트웨어 릴리스 버전을 디버그하도록 강요하고 있습니다. 실제로 그 probaly가 의미하는 것은 두 가지입니다.

1) "릴리스 빌드"는 최적화를 비활성화합니다 (기타 복사 개발자는 디버거를 사용할 수 없습니다).

2) 빌드에는 특별한 사전 처리기 매크로가 실행을 변경하지 않습니다.

따라서 실제로 할 일은 "디버그"모드 만 제거하는 대신 릴리스 및 디버그 구성을 병합하는 것입니다.

나는 개인적으로 불신없이 iOS 개발을 통해 이것을 해냈습니다. 서면 코드에 소요되는 시간은 실제로 일어나는 일의 1% 미만이므로 최적화는 크게 기여하지 않았습니다. 이 경우, 그들은 실제로 버그가 증가하는 것처럼 보였지만, 그렇지 않은 경우에도 한 가지 방법으로 테스트 한 다음 다른 코드를 QA에 제공하면 문제로 고려해야 할 한 가지 요소가 더 소개됩니다.

반면에 최적화가 필요한 경우, 유용한 곳, 둘 다 테스트 할 시간이 충분한 경우가 있습니다. 일반적으로 디버그와 릴리스의 변경 사항은 너무 사소하여 아무도 문제를 일으키지 않습니다.

당신이 물건을 완전히 테스트 할 수있는 실제 QA 그룹이 있다면, 릴리스에 가까워 질 때까지 디버그 빌드를 만들고 같은 빌드에서 전체 QA 사이클이 완료되어 있는지 확인하고 싶습니다. 문 밖으로 나가.

적어도 하나의 경우에 우리는 여전히 디버그 코드가있는 것을 공개했습니다. 유일한 결과는 조금 느리게 진행되었고 로그 파일은 꽤 크다는 것이 었습니다.

우리 회사에는 디버그와 릴리스가 모두 있습니다. - 개발자는 디버그 버전을 사용하여 버그를 올바르게 찾아 수정합니다. - 우리는 TDD를 사용하고 있으므로 서버에서 실행하는 대형 테스트 스위트가있어 디버그 및 릴리스 빌드 구성 및 64/32 빌드를 모두 테스트합니다.

따라서 "디버그"구성을 사용하면 개발자가 버그를 더 빨리 찾는 데 도움이되는 경우 코드가 서버로 들어가거나 (추가 테스트를 받기 위해) 사용하지 않을 이유가 없습니다. 또는 "릴리스"를 사용합니다.

릴리스 버전을 디버깅 할 수 있도록 오래 전에 .pdb 파일로 릴리스 버전을 작성하는 법을 배웠습니다. 많은 프로그래머가 잊어 버리는 경향이있는 것은 디버그 버전을 실행할 때 모든 최적화가 꺼지면 다른 프로그램을 모두 디버깅한다는 것입니다. 릴리스 빌드처럼 (대부분) 작동 할 수 있지만 여전히 릴리스 빌드와는 다른 프로그램입니다.

또한 릴리스 빌드를 디버깅하는 것은 그리 어렵지 않습니다. 그리고 충돌 덤프를 받으면 어쨌든 그것을 할 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top