본문 바로가기

C/C++

C printStackTrace

C printStackTrace

C에서 다른 언어처럼 스택 트레이싱을 하는 방법이다.
이 방법은 glibc의 backtrace()를 이용하므로, uclibc와 같은 라이브러리를 사용하는 환경에서는 사용 불가능하다.
참고로 컴파일 플래그로 -rdynamic 을 지정하지 않으면 backtrace()함수가 함수의 이름을 못보여준다.

코드

#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h>

void print_stack_trace() {
    puts("Printing stack trace. Don't forgot to set compiler flag '-rdynamic'");
    void*   frames[100];
    int     frame_depth = backtrace(frames, 100);
    char**  frame_info  = backtrace_symbols(frames, frame_depth);
    size_t  i;

    for(i = 0; i < frame_depth; ++i)
        printf("%s\n", frame_info[i]);

    free(frame_info);
}

void fa() { print_stack_trace(); }

void fb() { fa(); }

void fc() { fb(); }

int main() {
    fc();
    return 0;
}

결과

Printing stack trace. Don't forgot to set compiler flag '-rdynamic'
/home/junhui/ClionProjects/pg/cmake-build-debug/pg(print_stack_trace+0x3a) [0x560398240a3a]
/home/junhui/ClionProjects/pg/cmake-build-debug/pg(fa+0xe) [0x560398240acd]
/home/junhui/ClionProjects/pg/cmake-build-debug/pg(fb+0xe) [0x560398240ade]
/home/junhui/ClionProjects/pg/cmake-build-debug/pg(fc+0xe) [0x560398240aef]
/home/junhui/ClionProjects/pg/cmake-build-debug/pg(main+0xe) [0x560398240b00]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1) [0x7fef441eb3f1]
/home/junhui/ClionProjects/pg/cmake-build-debug/pg(_start+0x2a) [0x5603982408fa]


'C/C++' 카테고리의 다른 글

C 동적 라이브러리를 사용하는 프로그램 만들기  (0) 2017.01.25
C String Utility  (0) 2016.12.22
Linux C Socket Util  (0) 2016.11.08
pcre 사용법  (0) 2016.10.28
enum length  (0) 2016.09.20