2016-12-24 17 views
0

배경을 제공하기 위해 호출 스택을 기반으로하는 로그 메시지를 깔끔하게 인쇄하고 싶습니다.호출 스택에서 함수 위치를 얻는 방법은 무엇입니까?

예를 들면.

내가이 함수의 인수로 공간의 수를 전달하거나 같은 글로벌 카운트를 유지하지 않으

foo(){ 
    printf("Foo was called"); 
    bar(); 
} 

bar(){ 
    printf("bar was called"); 
    jai(); 
} 
jai(){ 
    printf("Jai was called"); 
} 

<<<OUTPUT>>> 
Foo was called. 
    bar was called 
     jai was called. 

로 출력을 제공해야합니다.

호출 스택에서 함수의 위치를 ​​얻을 수 있으면 필요한 출력 형식을 얻기 위해 텍스트 앞에 동일한 수의 공백을 채울 수 있다고 생각했습니다.

backtrace 함수 호출을 보면 전체 스택 이름도 반환됩니다. 이 함수는 호출 된 총 함수 수를 반환합니다.

위치 만 반환하는 함수가 있습니까?

+0

"_ _ 우리는 호출 스택에서 함수의 위치를 ​​얻을 수 있습니다 _": 이것은 많은 명령어 또는 매개 변수 또는 전역 변수 중 하나입니다. –

답변

2

또한 통화의 총 기능 수를 반환합니다.
위치 만 반환하는 함수가 있습니까?

이들은 하나이며 동일합니다. 호출 스택 인 경우

는 :

main -> foo -> bar -> jai 

하고 jai이 4 단계 깊이 알고 싶어요, 기능 의 다음 총 수는jai의 수준입니다.

main을 무시하고 "사용자"기능 만 계산하려면 총 기능 수에서 1을 빼십시오.

2

기존 라이브러리를 사용하는 것이 좋습니다. (또는 적어도 대부분의) 모든 코드는 (리눅스) DWARF 형식으로 정보를 *디버깅 컴파일하는 경우

, 나는 이안 테일러의 libbacktrace (독립적으로 GCC 내에서 사용 되었으나 사용할 수) 좋습니다. DWARF 디버그 정보를 사용할 수있는 경우 소스 위치 정보를 제공 할 수도 있습니다 ...

또한 GNU glibc backtrace functions을 사용할 수도 있습니다.

GCC의 return address builtins도 참조하십시오.

참고 : 및 -O2을 모두 gcc 또는 g++ 컴파일러에 전달하면 디버깅 정보와 최적화 기능을 모두 사용할 수 있습니다.