- 论坛徽章:
- 4
|
回复 8# wps103
x86平台能打印,你改改试试- #include <stdio.h>
- #include <stdlib.h>
- #include <dlfcn.h>
- #include <execinfo.h>
- #define BACKTRACE_MAXDEPTH 32
- struct layout // 来自glibc-2.16.0/sysdeps/generic
- {
- void *__unbounded next;
- void *__unbounded return_address;
- };
- int my_backtrace(void **arr, int maxsize)
- {
- int cnt = 0;
- void *fp = __builtin_frame_address(0);
- struct layout *lp = (struct layout *)fp;
- while (cnt < maxsize)
- {
- arr[cnt++] = lp->return_address;
- if (!lp->next)
- {
- break;
- }
- lp = (struct layout*)lp->next;
- }
- return cnt;
- }
- void my_backtrace_symbols(void* const* arr, int size)
- {
- for (int i = 1; i < size; ++i)
- {
- Dl_info info;
- if (dladdr(arr[i], &info))
- fprintf(stderr, "%s(%s+0x%x) [%p]\n", info.dli_fname, info.dli_sname, (int)arr[i] - (int)info.dli_saddr, arr[i]);
- else
- fprintf(stderr, "[%p]\n", arr[i]);
- }
- }
- void print_my_stacktrace()
- {
- void * array[BACKTRACE_MAXDEPTH];
- int i=0;
- int stack_num = my_backtrace(array, BACKTRACE_MAXDEPTH);
- char ** stacktrace = backtrace_symbols(array, stack_num);
- for (i = 0; i < stack_num; ++i)
- {
- fprintf(stderr,"%s\n", stacktrace[i]);
- }
- free(stacktrace);
- }
- void fun1()
- {
- fprintf(stderr,"stackstrace begin:\n");
- print_my_stacktrace();
- }
- void fun2()
- {
- fun1();
- }
- void fun3()
- {
- fun2();
- }
- int main(void)
- {
- fun3();
- return 0;
- }
复制代码 编译指令- gcc print_backtrace.c -ldl -rdynamic -D_GNU_SOURCE -std=gnu99 -Wall
复制代码 结果- stackstrace begin:
- ./a.out(print_my_stacktrace+0x26) [0x80488a5]
- ./a.out(fun1+0x33) [0x804893a]
- ./a.out(fun2+0xb) [0x8048947]
- ./a.out(fun3+0xb) [0x8048954]
- ./a.out(main+0xb) [0x8048961]
- /lib/libc.so.6(__libc_start_main+0xf3) [0x4a0066b3]
复制代码 |
|