2011-01-20 4 views
0

내가 원했던 것은 Doxygen과 같은 정적 코드 분석과 GDB를 사용할 때 볼 수있는 스택 프레임에서 얻을 수있는 것을 섞은 것이다. 내가 디버깅하는 문제가있는 함수를 알고이 함수 호출에 대한 실행을 안내 한 함수 호출의 이웃을보고 싶습니다. 예를 들어, 간단한 HelloWorld를 실행하십시오! 것 출력과 같은 : 다음Linux에서 C++ 프로그램에서 호출 된 함수의 인쇄를 얻으려면 어떻게해야합니까?

main: 
    Greeter::Greeter() 
    Greeter::printHello() 
    Greeter::printWorld() 
주요 기능에서 생성자가 호출 된 것을 나타내는

와라는 printHello 및 printWorld 기능을합니다. GDB에서 printWorld에서 깨진 경우 printHello가 호출 된 스택 프레임을 볼 수 없습니다.

무수한 소스 파일에 로그 메시지를 삽입하지 않고도 함수 호출을 추적하는 방법에 대한 아이디어가 있습니까?

감사합니다.

+1

어떤 상황에서이 작업을 수행 할 수 있기를 원하십니까? 만약 당신이 GDB에 있다면, 당신은'역 추적 (backtrace) '을 가지고 있습니다 ... 당신은 무엇을 원합니까? –

+0

함수의 호출 전에 수정 된 변수/객체를 파악하기 위해 매우 큰 프로그램에서 함수가 호출 된 컨텍스트를 추적하고 싶습니다. 동일한 프레임 레벨에서 함수 호출이 누락 될 수는 있지만 함수 호출 전에는 일어 났으므로 스택 추적만으로는 충분하지 않습니다. – tonicebrian

+0

디버거를 사용하여 프로그램을 단계별로 살펴보고 어떤 함수가 호출되었는지 확인할 수 있습니다 ... 또는 함수를 호출하는 함수에 디버그 메시지를 추가하십시오. – smerlin

답변

1

예를 들어, Valgrind의를 사용하여.

이 목록을 자동으로 생성하는 응용 프로그램은 없지만 많은 시간을 절약 할 수있는 도우미 매크로가 있습니다. 당신이 원하는 하나의 매크로라고 LOGFUNCTION 또는 무엇이든을 정의하고로 정의 :

#define LOGFUNCTION printf("In %s (%s:%d)\n", __PRETTY_FUNCTION__, __FILE__, __LINE__); 

지금 당신은 당신이 추적을 추가 할 원하는 목적지 라인 LOGFUNCTION 붙여 넣기 할 필요가 없습니다.

어디서나 볼 수 있습니다.

http://gcc.gnu.org/onlinedocs/gcc/Function-Names.htmlhttp://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

+0

프로그램 적으로 할 수없는 끔찍한 일이지만 적어도 지금은 할 수 없다는 것을 알고 있습니다. – tonicebrian

0

GDB는 스택 추적 기능을 갖추고 있습니다.

+0

아니요 게시물의 주석을 참조하십시오. – tonicebrian

+0

아, 알았어. 그럼 네가 뭘하고있는 건 아니야. 당신은 처음부터 당신이 무엇을했는지 분명히해야합니다. 나는 자신 만의 로깅 클래스를 사용한다. (로그 할 무언가를 원할 때마다 코드를 추가해야한다.) 상자에서 꺼내는 유틸리티는 들어 본 적이 없습니다. – mingos

0

그는 원하는 정보 (예 : gdb에서 역 추적)를 얻는 것이지만 gdb보다 '좋네'형식으로 인쇄합니다. 나는 그럴 수 없다고 생각합니다. 내 말은, 어쩌면 응용 프로그램을 추적하고 그런 식으로 처리하는 응용 프로그램 유형이있을 수 있지만 그런 식으로는 전혀 들어 본 적이 없다는 것입니다.

당신이 할 수있는 가장 좋은 일은 GDB를 사용하는 것입니다. 아마도 gdb를 사용하여 원하는 정보를 얻고 인쇄 할 수있는 bash 스크립트 유형을 만들 수 있습니다.

물론 애플리케이션은 디버그 기호 (gcc에서 -g 매개 변수)로 컴파일해야합니다.

+0

gdb에서 "더 나은"출력을 얻으려면 내가 좋은 IDE를 통해 사용하는 것이 유일한 방법입니다. Code :: Blocks는 읽기 쉽기 때문에 스택 트레이스에있는 줄로 바로 넘어갈 수 있기 때문에 여기에 내 내기가 있습니다. 나는 그것이 그보다 "더 멋지다"는 것을 의심한다. – mingos

+0

나는 그런 것을 한 적이 없지만 어쩌면 당신은 당신을 더 좋게 생각하는 어떤 방법을 찾을 수있을 것이라고 생각했다. 매크로에 대한 대답은 좋았지 만 모든 곳의 로그를 붙여 넣기를 원하지 않는다고 말한 적이 있습니다 ... – webbi

0

gdb의 백 트레이스에 어떤 문제가 있는지 잘 모르겠지만 프로파일 러가 원하는 것에 더 가깝습니다. 나는 그들이 실행하고 당신이 순서대로 실행 모든 관련 기능의 목록을 원하는 것으로 알고 질문을 읽는에서

valgrind --tool cachegrind ./myprogram 
kcachegrind callgrind.out.NNNN 
+0

Valgrind가 정보를 집계합니다. 프로그램이 실행될 때 호출 된 모든 함수를 순서대로 인쇄해야합니다. – tonicebrian

0

당신이 호출 그래프를 생성하는 gprof를 사용하려고 적이 참조? 예를 들어 gprof2dot을 사용하면 gprof 출력을 눈으로 쉽게 볼 수 있습니다.

2

-finstrument-functions option ~ gcc은 모든 기능 항목 및 종료시 사용자 제공 프로파일 링 함수를 호출하도록 컴파일러에 지시합니다.

이 기능을 사용하여 모든 기능 항목을 기록하고 종료하는 기능을 작성할 수 있습니다.

관련 문제