2009-08-06 4 views
12

릴리스 모드와 디버그 빌드 모드의 차이점을 이해한다고 생각합니다. 주요 차이점은 디버그 모드에서 생성 된 실행 파일이 최적화되지 않아 디버깅 기호가 포함되어 있기 때문입니다.빌드 모드 : RelWithDebInfo

WinMerge에 대한 외부 종속성 중 하나 인 PCRE를 빌드하면서 이전에 보지 못했던 빌드 모드 인 RelWithDebInfo를 발견했습니다.

디버그와 RelWithDebInfo의 차이점은 여기에 있습니다 : http://www.cmake.org/pipermail/cmake/2001-October/002479.html. 발췌 : "RelwithDebInfo는 릴리스 모드와 매우 유사하며 완전히 최적화 된 코드를 생성하지만 프로그램 데이터베이스도 빌드하고 디버거 라인 정보를 삽입하여 디버거가 언제 어디서나 코드를 추측 할 수있는 좋은 기회를 제공합니다. "

이것은 실제로 좋은 생각처럼 들리지만 설정하는 방법이 반드시 명확하지는 않습니다. 이 링크는 VC++에서 이것을 활성화하는 방법을 설명합니다 : http://www.cygnus-software.com/papers/release_debugging.html

누락되었거나 모든 릴리스 코드를 RelWithDebInfo로 컴파일하는 것이 적절하지 않습니까?

답변

4

오전 뭔가 누락, 또는 메이크업 감각 RelWithDebInfo 모든 릴리스 코드 를 컴파일하지 않는 이유는 무엇입니까?

디버깅 정보로 고객을 얼마나 신뢰하는지에 따라 다릅니다.

추가 정보 :

GCC는 오브젝트 코드에 디버깅 정보를 인코딩합니다. 그 cmake 박스에서이 방법을 지원하기 위해 표시되지 않습니다,

How to generate gcc debug symbol outside the build target?

참고 :

다음은 GCC에 대한 PDB에 해당합니다.

+1

고객에게 디버그 정보를 제공 할 필요는 없습니다 (바이너리에 포함 된 플랫폼에 대해 언급 한 경우를 제외하고). –

+0

컴파일러가 디버거 정보 _besides_ (VC와 같은) 실행 파일을 넣으면이 이슈. – sbi

+1

크로스 플랫폼 개발을 수행합니다. Visual C++ 사람들이 다른 플랫폼에서 대상의 결과를 이해하기를 바랍니다. 필자는 서면 문서가 불완전하다는 이유로 cmake 사용자가 cmake 메일 링리스트를 사용하는 것을 권장합니다. – Juan

12

필자는 생산 문제를 디버깅 할 때 사내에 저장된 해당 디버그 심볼을 사용하지 않고 고객에게 코드를 전달하는 것이 탈모의 처방임을 설명합니다.

디버깅 디버그 기호로 릴리스 빌드를 디버그 디버그 빌드와 거의 다르지 않으므로 항상이 작업을 수행하는 것이 좋습니다.

그렇다면 단점이 있는지 나는 알 수 없다. 그렇다면 듣는 것이 재미있을 것입니다.

+0

gcc (4.8?)는 최적화 된 빌드에 대한 디버그 정보를 훨씬 더 잘 지원하므로이 조언 만 더 관련성이 높아집니다. [gcc 문서] (http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options)의 -fvar-tracking 및 -fvar-tracking-assignments를 참조하십시오. 즉, 디버그 정보는 이제 메모리와 레지스터 사이의 데이터 이동을 추적 할 수 있으며 특정 명령어 포인터가 있으면 주어진 변수를 찾을 위치를 알 수 있습니다. – doug65536

2

생산 코드는 디버깅 정보가 운반하는 크기가 팽창 할 필요가 없습니다.

+0

디버그 정보가 여전히 실행 파일에 풋 프린트를 남겨 둡니까? 나는 PDB가 모든 정보를 가지고 있다고 생각했다 ... –

+1

리눅스에서는이 정보가 바이너리 및 공유 라이브러리의 객체 코드에 들어있다. – Juan

5

최적화 된 릴리스 빌드를 디버깅하려고하면 다른 방법이없는 경우에만이 기능을 사용하려는 이유가 무엇인지 알 수 있습니다. 당신이해야 할 때

는 기본적으로, 나는 두 가지 사례를 참조하십시오

  • 당신이 릴리스 당신은이
  • 를 구축 디버깅 할 수 있도록 디버그에 표시되지 않는 문제가 구축 한 고객에게 충돌을 일으키고 로컬에 저장된 디버그 정보를 사용하여 충돌을 이해합니다.

나는 당신에 대해 잘 모르지만, 지난 10 년 동안 두 번 또는 세 번이나 릴리스 코드를 디버깅해야했고 고객의 충돌이 문제가되지 않는 회사에서 일할 수있었습니다.

그래, 아마도 릴리스 빌드에 대한 디버그 정보를 가지고있는 것이 좋습니다.하지만 VS는 이러한 방식으로 설정하지 않으며 필요한 경우 10 년마다 두 가지 경우에 대해 설정할 가치가 없습니다 이 때마다 수동으로 CMake가 무료로 제공하기 때문에 그렇게하십시오.

+1

나는 그것이 어떤 종류의 코드를 사용하는지에 달려 있다고 생각한다 - 나는 최적화 된 빌드의 디버그 심볼을 위해 많은 것을 사용 해왔다. 적어도 우리는 예기치 않은 예외가 발생했을 때 미니 덤프를 생성하고 기호와 함께 모든 스레드에 대해 완전한 읽을 수있는 콜 스택을 제공하기 때문입니다. 어쨌든 디버깅을 시작하기에 좋은 곳입니다. –

+2

김, 나는 거의 충돌을 본 적이 없다. 나는 그것이 코딩 스타일에 온다고 생각한다. 대규모 프로젝트에서 오랫동안 (몇 년 동안) 일 해왔다. 다른 파트보다 일반적인 충돌 지점과 테스트 중에 충돌이 발생한 부분이 5 년 만에 한 번 발생했던 부분이 있었다. 충돌 가능성은 수동 리소스 관리의 양과 분명히 관련이 있습니다. – sbi

+0

귀하의 답변이 2009 년에 작성되었지만 현재 VS2008이 내 바탕 화면에 있습니다. 실제로 기본적으로 (예 : 마법사로 프로젝트 생성), 릴리스 (Win32 및 콘솔 응용 프로그램 모두)에서 PDB가 생성됩니다. – paercebal

0

디버그 정보가 릴리스 빌드 용으로 생성되는 경우에도 디버그 빌드보다 디버깅 목적에 훨씬 유용하지 않습니다. 그 이유는 많은 변수와 중간식이 최적화되어 디버거에서는 사용할 수 없기 때문입니다.

관련 문제