2012-09-27 4 views
1

C++ 응용 프로그램이 실행하는 모든 함수 호출을 인쇄하는 방법을 알고 있는지 궁금합니다. linux 명령 strace 또는 ltrace과 비슷하지만 시스템 호출뿐만 아니라 일반 함수 호출, 소멸자 호출, 복사 생성, 메소드 등을 출력한다는 점을 제외하고는 ...실행 된 C++ 응용 프로그램의 자동 메서드 호출 인쇄

기본적으로 다음과 같습니다. 당신이 step 다음이 자동 될 것을 제외하고, 스택을 인쇄 할 때 GDB는 사용 -finstrument-functions ...

+2

하드 드라이브의 용량이 무엇을 좋아? – justin

+0

@ justin no kidding. 똑같은 생각을하고있었습니다. – WhozCraig

+0

나는 로거 API를 수동으로 호출하는 것이 유일한 방법이라고 생각한다. – Ram

답변

2

그것을하고있다 :

-finstrument-functions는 기능에 출입을위한 계측 호출을 생성합니다. 함수 입력 직후 함수 종료 직전에 현재 함수 및 해당 호출 사이트의 주소 을 사용하여 다음 프로파일 링 함수가 호출됩니다. (일부 플랫폼, __builtin_return_address는 현재의 기능을 넘어 작동하지 않기 때문에 호출 사이트 정보 기능 그렇지 않으면 프로파일 링에 사용하지 못할 수 있습니다.)

 void __cyg_profile_func_enter (void *this_fn, 
            void *call_site); 
     void __cyg_profile_func_exit (void *this_fn, 
            void *call_site); 

첫 번째 인수는 시작의 주소 현재 함수는 기호 테이블에서 정확하게 찾을 수 있습니다.

이 계측은 다른 기능에서 인라인으로 확장 된 기능에 대해서도 수행됩니다. 프로파일 링 호출은 개념적으로 인라인 함수가 입력 및 종료 된 위치를 나타냅니다. 즉, 해당 기능의 주소 지정 가능 버전을 사용할 수 있어야합니다. 을 의미합니다. 함수의 사용이 모두 인라인으로 확장되면 코드 크기가 추가로 확장 될 수 있습니다. C 코드에서 'extern inline'을 사용하는 경우, 이러한 함수의 주소 지정 가능 버전을 제공해야합니다. (이 어쨌든 보통의 경우,하지만 당신은 행운과 최적화는 항상 기능 인라인을 확장하는 경우, 정적 사본을 제공하지 않고 멀리 를 입수했습니다 수 있습니다.)

에서, 속성 no_instrument_function을받을 수 있습니다 함수 which 경우이 계측은 수행되지 않습니다. 위의 프로파일 링 함수에 대해 예제의 경우 우선 순위가 높은 인터럽트 루틴과 프로파일 링 함수가 안전하게 호출 될 수없는 모든 함수 ( 프로파일 링 루틴이 출력을 생성하거나 할당 할 경우 신호 처리기 등)를 사용할 수 있습니다 기억). 할 도구가 있습니다

이 아웃 - 오브 - 박스 etrace

+0

PS. GDB를 언급 했으므로 gcc를 사용한다고 가정하면 –

+0

네, GCC는 내 도구입니다 :) – fritzone

관련 문제