디버깅 옵션 -g는 바이너리 실행 파일을 어떻게 변경합니까?

StackOverflow https://stackoverflow.com/questions/89603

  •  01-07-2019
  •  | 
  •  

문제

C/C++ 코드를 작성할 때 바이너리 실행 파일을 디버깅하려면 컴파일러/링커에서 디버그 옵션을 활성화해야 합니다.GCC의 경우 옵션은 -g입니다.디버그 옵션이 활성화되면 바이너리 실행 파일에 어떤 영향을 미치나요?디버거 기능을 그대로 허용하는 파일에는 어떤 추가 데이터가 저장됩니까?

도움이 되었습니까?

해결책

-g는 컴파일러에게 실행 파일에 기호 테이블 정보를 저장하도록 지시합니다.여기에는 다음이 포함됩니다.

  • 기호 이름
  • 기호에 대한 유형 정보
  • 기호가 나온 파일 및 줄 번호

디버거는 이 정보를 사용하여 기호에 대한 의미 있는 이름을 출력하고 명령을 소스의 특정 줄과 연결합니다.

일부 컴파일러의 경우 -g를 제공하면 특정 최적화가 비활성화됩니다.예를 들어, -O[123]를 명시적으로 지정하지 않는 한 icc는 -g를 사용하여 기본 최적화 수준을 -O0으로 설정합니다.또한 -O[123]을 제공하더라도 스택 추적을 방지하는 최적화는 여전히 비활성화됩니다(예:스택 프레임에서 프레임 포인터를 제거합니다.이는 성능에 미미한 영향만 미칩니다.)

일부 컴파일러의 경우 -g는 기호의 출처를 혼동할 수 있는 최적화(명령어 재정렬, 루프 풀기, 인라인 등)를 비활성화합니다.최적화를 통해 디버깅하려면 gcc와 함께 -g3을 사용하여 이 문제를 해결할 수 있습니다.인라인되었을 수 있는 매크로, 확장 및 함수에 대한 추가 디버그 정보가 포함됩니다.이를 통해 디버거와 성능 도구가 최적화된 코드를 원본 소스에 매핑할 수 있지만 이는 최선의 노력입니다.일부 최적화는 실제로 코드를 엉망으로 만듭니다.

자세한 내용은 다음을 참조하세요. 난쟁이, 원래 ELF(Linux 및 기타 OS용 바이너리 형식)와 함께 사용하도록 설계된 디버깅 형식입니다.

다른 팁

함수/변수 이름을 데이터 위치에 매핑하는 기호 테이블이 실행 파일에 추가되므로 디버거는 단순한 포인터가 아닌 의미 있는 정보를 다시 보고할 수 있습니다.이는 프로그램 속도에 영향을 주지 않으며 'strip' 명령을 사용하여 기호 테이블을 제거할 수 있습니다.

디버깅 및 기호 정보 외에도
Google DWARF(ELF에 대한 개발자 농담)

기본적으로 대부분의 컴파일러 최적화는 디버깅이 활성화되면 꺼집니다.
따라서 코드는 릴리스 바이너리에 적용되는 고도로 전문화된 많은 변환의 결과가 아니라 소스를 기계 코드로 순수하게 변환한 것입니다.

하지만 가장 중요한 차이점은 (내 생각에는)
디버그 빌드의 메모리는 일반적으로 디버깅을 용이하게 하기 위해 일부 컴파일러 특정 값으로 초기화됩니다.릴리스 빌드에서는 애플리케이션 코드에서 명시적으로 초기화하지 않는 한 메모리가 초기화되지 않습니다.

자세한 내용은 컴파일러 설명서를 확인하세요.
그러나 DevStudio의 예는 다음과 같습니다.

  • 0xCDCDCDCD 힙에 할당되었지만 초기화되지 않았습니다.
  • 0xDDDDDDDD 힙 메모리가 해제되었습니다.
  • 0xFDFDFDFD "NoMansLand" 펜스가 힙 메모리 경계에 자동으로 배치됩니다.절대 덮어쓰면 안 됩니다.하나를 덮어쓰면 아마도 배열의 끝을 벗어나게 될 것입니다.
  • 0xCCCCCCCC 스택에 할당되었지만 초기화되지 않았습니다.

-g는 변수 이름, 함수 이름, 줄 번호 등 실행 파일에 디버깅 정보를 추가합니다.이를 통해 gdb와 같은 디버거는 코드를 한 줄씩 단계별로 실행하고, 중단점을 설정하고, 변수 값을 검사할 수 있습니다.-g를 사용하면 이러한 추가 정보로 인해 실행 파일의 크기가 늘어납니다.

또한 gcc에서는 최적화를 활성화하는 -O 플래그와 함께 -g를 사용할 수 있습니다.변수가 최적화되거나 명령이 다른 순서로 실행될 수 있으므로 최적화된 실행 파일을 디버깅하는 것은 매우 까다로울 수 있습니다.일반적으로 -g를 사용할 때는 코드 속도가 훨씬 느려지더라도 최적화를 끄는 것이 좋습니다.

이거랑 겹치는 부분이 좀 있네 질문 상대방의 문제를 다루는 것입니다.

흥미롭게도 hexeditor를 열고 다음으로 생성된 실행 파일을 살펴볼 수 있습니다. -g 그리고 없는 것 하나.추가된 기호와 사물을 볼 수 있습니다.어셈블리가 변경될 수 있습니다(-S)도 있지만 확실하지 않습니다.

일부 운영 체제(예: z/OS) 디버그 기호가 포함된 "사이드 파일"을 생성합니다.이렇게 하면 추가 정보로 인해 실행 파일이 부풀어오르는 것을 방지할 수 있습니다.

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