2011-02-13 1 views
2

함수 이름과 줄 번호를 GCC의 메모리 주소로 어떻게 매핑 할 수 있습니까?함수 이름과 행 번호를 메모리 주소로 C 언어로 매핑하는 방법은 무엇입니까?

즉 C 언어의 프로토 타입 가정 :

void func() { 
    // Get the address of caller , maybe this could be avoided 
    MemoryAddress = get_call_address(); 

    // Which line from source code is executing , which calls func() 
    LineNumber = get_lineno_from_symbol (&MemoryAddress); 

    // Grab the name who calls func() 
    FunctionName = get_func_from_symbol (&MemoryAddress); 
} 

그래서 GCC 또는 무엇이든에서 제공하는 기존의 API가, 내 요구 사항을 충족 할 수 있습니까? 당신은 당신이를 검색 할 backtrace_symbols()를 호출 라인의 주소를 결정하기 위해 backtrace() function을 사용하고 있습니다 헤더를

#include <execinfo.h> 

을 포함 할 경우 중 하나가 ;-P

+1

소프트웨어에 기능이 필요합니까 아니면 디버깅 용입니까? 디버깅 용이라면 맵 파일이나 미리 정의 된 _ _ LINE _ _ 및 _ _ FILE _ _ 매크로를 사용할 수 있습니다. – Dave

+1

프리 프로세서는 파일 & 라인 번호를 줄 수 있습니다. 예 : \t fprintf (stdout, "% s % d \ n", _ _ FIL E_ _, _ _ LINE _ _); 이중 밑줄 사이에 간격이 없습니다. ;-) –

+0

아니요, __LINE__은 전혀 도움이되지 않습니다. 나는 동적으로 소스 코드의 일부가 실패한 정보와 backtrace() 메모리 주소를 제공 할 필요가있다. psmears가 가장 좋은 해결책을 주었다. 모두 감사한다. -P – daisy

답변

5

을 응답

많은 감사 함수의 이름. 그러나 이것은 라인 번호를 알려주지는 않습니다 (디버깅에 도움이되는 충분한 정보를 제공 할지라도 필요한 경우).

  • 이 프로그램 (및 모든 라이브러리) (GCC에 -g 플래그)
  • 를 사용하여 디버깅이 가능하게 컴파일되어 있는지 확인 당신이 절대적으로 줄 번호를 필요로 할 경우

    , 당신은해야합니다 주소 backtrace()에서 가져온 주소를 파일/줄 번호 참조로 변환하는 addr2line program 예를 들어 system()을 사용하여 프로그램에서 호출 할 수 있습니다. 출력을 stdout으로 보내지 만, 필요할 경우 리다이렉션이나 파이프를 사용하여 출력을 캡처 할 수 있습니다.

+0

많은 고마움, 이제 문제가 해결되었습니다 ;-P – daisy

0

gcc를 사용하면 backtrace 기능을 사용하여이를 수행 할 수 있습니다.

+2

실제로는'backtrace()'를 제공하는 gcc보다는 glibc입니다 :) – psmears

+0

backtrace 라인 번호 정보를 직접 제공하지 않는다. –

관련 문제