Linux backtrace()

https://man7.org/linux/man-pages/man3/backtrace.3.html

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdint.h>
 4 #include <stdlib.h>
 5 #include "execinfo.h"
 6 
 7 typedef uint32_t UINT32;
 8 
 9 void fun3(void)
10 {
11     void* array[10] = {0};
12     UINT32 size = 0;
13     char **strframe = NULL;
14     UINT32 i = 0, j = 0;
15 
16     size = backtrace(array, 10);
17     strframe = (char **)backtrace_symbols(array, size);
18 
19     printf("print call frame now: 0x%x
", fun3);
20     for(i = 0; i < size; i++)
21     {
22         printf("frame %d -- %s
", i, strframe[i]);
23     }
24 
25     if(strframe)
26     {
27         free(strframe);
28         strframe = NULL;
29     }
30 }
31 
32 void fun2(void)
33 {
34     printf("fun2 0x%x
", fun2);
35     fun3();
36 }
37 
38 void fun1(void)
39 {
40     printf("fun1 0x%x
", fun1);
41     fun2();
42 }
43 
44 int main(void)
45 {
46     printf("main 0x%x
", main);
47     fun1();
48     return 0;
49 }

[xxxzte.intra@桌面]$ gcc -g -rdynamic backTrace.c

[xxx@zte.intra@桌面]$ ./a.out
main 0x4009b8
fun1 0x400998
fun2 0x400978
print call frame now: 0x4008a6
frame 0 -- ./a.out(fun3+0x4a) [0x4008f0]
frame 1 -- ./a.out(fun2+0x1d) [0x400995]
frame 2 -- ./a.out(fun1+0x1d) [0x4009b5]
frame 3 -- ./a.out(main+0x1d) [0x4009d5]
frame 4 -- /usr/lib64/libc.so.6(__libc_start_main+0xf1) [0x7f2381398401]
frame 5 -- ./a.out(_start+0x2a) [0x4007da]

[xxx@zte.intra@桌面]$ addr2line 0x4009d5 -e ./a.out -f
main
/home/xxx@zte.intra/桌面/backTrace.c:48

 

原文地址:https://www.cnblogs.com/Lunais/p/13639662.html