2016-10-08 10 views
1

DWARF DI 형식에 대한 내 질문에 대한 좋은 설명서가없는 것 같습니다. C로 컴파일되는 언어를 작성하고 있습니다. DWARF 디버그 정보를 C 코드로 생성 할 수있는 방법이 있습니까?생성 된 C 코드가있는 DWARF DI입니까?

불가능 같은 #line#file 지시 좋지 않다 원시적 인 재료를 사용하는 것보다 다른 일부 (생성) C 코드에 디버그 정보를 추가 할 수 있나요?

답변

0

생성 된 C를 디버그 정보 (-g)로 컴파일 할 것입니다. 따라서 고수준 언어를 설명하는 추가 DWARF 레코드를 갖는 방법을 묻는 것입니다. 생각할 수있는 접근법 :

(1) C 코드에 대한 DWARF 레코드를 보강하기 위해 오브젝트 파일을 편집하십시오. 나는 기존 공구에 대해 모른다. libdwarf 또는 pyelftools 일 가능성이있다.

(2) 컴파일러를 통해 추가 DWARF 레코드를 "밀수"하는 방법을 찾으십시오. #pragma를 통해 링커 명령을 줄 수 있습니다. 그러나 나는 이것을 지원하는 컴파일러를 모른다.

(3) LLVM은 IR representation에 디버그 레코드를 지원합니다. clang을 사용하여 생성 된 C를 IR (clang foo.c -S -emit-llvm -target arm -o foo.ll)으로 컴파일 한 다음 foo.ll을 추가 한 다음 .o (llc foo.ll)를 생성하여 링크 할 수 있습니다.

세 번째 옵션이 가장 쉬울 것 같습니다.

+0

아이디어에 감사드립니다. 나는 제 3의 선택권을 줄지도 모른다! –

2

컴파일러에서 어셈블리를 내보낼 수 있다고 가정하면 몇 가지 작업을 수행 할 수 있습니다. 이에 대한 예는 my favorite gdb test case을 참조하십시오.

일반적으로이 작업은 수행되지 않습니다. 옳다는 것은 상당히 어려울 수 있습니다. 요즘에는 컴파일러를 GCC 또는 LLVM의 직접 프론트 엔드로 작성하는 것이 좋습니다. 또는 생성 된 C 코드를 더 간단하게 디버깅하도록 gdb 또는 lldb 도우미 스크립트를 작성하십시오.

+0

"제대로 작동하기가 어려울 수 있습니다."- DWARF 데이터 작업에 대해 정규화 된 어려움도 있습니다. –

+0

그래, 그건 실용적인 솔루션이 아니야, 더 재미있는 트릭 같아. –