2011-03-01 5 views
1

GCC ARM 크로스 컴파일러 (arm-none-eabi-*)를 사용하고 있으며 독점 ​​디버거를 사용하고 있습니다. 디버거는 선택한 소스 행에 대한 결과 어셈블리를 강조 표시 할 수 있습니다. nm 및 objdump를 사용하면 이진 파일에 두 개 이상의 .debug_* 섹션이 있음을 알 수 있습니다. 디버거가이 섹션에 포함 된 정보를 사용하여 소스 행을 디스 어셈블리에 매핑한다는 결론을 내릴 수 있습니다 (반대의 경우도 마찬가지 임). 하지만 어떻게하고 싶습니다. 이 섹션에 포함 된 정보, 정보의 관련성 및 정보를 이해하는 방법에 대해 알고 싶습니다. 간단히 말해, 디버거 (또는 적어도 이러한 매핑을 표시 할 수있는 도구 : 소스를 디스 어셈블리로, 다시 소스 행당 디스 어셈블리 행 수)를 작성하는 경우 섹션을 읽고 사용하는 방법은 무엇입니까? . 제로 컴파일 최적화를 가정합니다.GCC 디버그 정보

아마도이 섹션의 형식을 설명하는 문서가 있습니까?

+0

[DWARF] (http://en.wikipedia.org/wiki/DWARF)? – Offirmo

답변

0

.debug_ * 섹션에는 DWARF 디버깅 표준에서 설명하는 형식의 데이터가 들어 있습니다. 이 표준은이 표준 사양을 다운로드 할 수있는 웹 사이트가 있습니다 http://www.dwarfstd.org/

(매우 공간을 절약하기 위해 응축) 저장 형식을 구문 분석에 사용할 라이브러리를 하나의 가능한 여기 libdwarf입니다있다 : http://reality.sgiweb.org/davea/dwarf.html

즉, 서로 다른 섹션에는 소스 프로그램의 다양한 측면과 대상 시스템 아키텍처 (코드 및 데이터 주소)에 매핑되는 방법이 포함되어 있습니다. 일반적으로 컴파일 프로세스에서 손실되는 정보는 식별 태그가있는 구조 인 디버그 정보 항목 트리 및 다양한 속성으로 표시됩니다. 예를 들어 변수 선언의 DIE는 DW_TAG_variable 태그가있는 DIE로 표시되며 이름, 파일/행/열이 선언 된 위치, 객체 파일의 메모리 위치 등의 속성을 가질 수 있습니다.

.debug_info 및 .debug_abbrev 섹션은 함께 디버그 정보 항목 트리를 나타냅니다. .debug_line 섹션에는 디버거가 소스 코드 행을 객체 코드 주소로 매핑하는 완전한 테이블을 재구성 할 수있는 정보가 들어 있습니다 (소스 코드 행이 명령문의 시작인지 아닌지와 같은 기타 정보가 들어 있습니다. 기본 블록 등).

다른 섹션에는 호출 프레임 정보와 변수 DIE 및 유형을 이름별로 빠르게 찾는 빠른 표가 있습니다. 모든 것이 표준에 설명되어 있습니다.