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 |