2013-08-21 18 views
4

나는 Clang을 사용하여 디버그 정보가 활성화 된 함수를 컴파일했습니다. Instruction에는 편리한 getDebugLoc()이 있지만 Function에는 해당 사항이 없습니다. Function 인스턴스가 주어지면 어떻게 디버그 정보를 얻을 수 있습니까 (저는 DISubProgram 양식으로 추측합니다).함수에서 디버그 정보를 얻으려면 어떻게해야합니까?

나는 the guide entry explaining how that debug information is represented을 보았으며 메타 데이터에는 해당 기능에 대한 링크가 포함되어 있지만 분명히 다시 링크가 없습니다. 모듈의 모든 메타 데이터를 반복해야합니까?

답변

2

나는 현재 더 쉬운 방법이 있다고 생각하지 않습니다. 이전에는 모든 함수 메타 데이터 항목 (llvm.dbg.sp)을 수집하는 전역 메타 데이터 노드가 있었지만 잠시 전에 DWARF 구조를보다 자세히 반영하는 llvm.dbg.cu을 사용하여 제거되었습니다.

디버그 메타 데이터의 일반적인 용도는 기능별 조회가 필요없고 제거 할 수있는 추가 정보 인 이 삭제되었다고 가정합니다. 공간 절약은 중요하고 IR의 메타 데이터는 이미 너무 큰 방식이므로 .

9

DebugInfoFinder를 사용해야한다고 생각합니다. 다음은 샘플 코드입니다.

DebugInfoFinder Finder; 
Finder.processModule(M); 
for (DebugInfoFinder::iterator i = Finder.subprogram_begin(), 
        e = Finder.subprogram_end(); 
        i != e; ++i) { 
       DISubprogram S(*i); 

       if (S.getFunction() == F) { 
        errs() << S.getLineNumber(); << "\n"; 
       } 
      } 

여기서 F는 찾고있는 기능입니다.

관련 문제