#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
myfunc3(void)
{
   int j, nptrs;
#define SIZE 100
   void *buffer[100];
   char **strings;
   nptrs = backtrace(buffer, SIZE);
   printf("backtrace() returned %d addresses\n", nptrs);
   /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
      would produce similar output to the following: */
   strings = backtrace_symbols(buffer, nptrs);
   if (strings == NULL) {
       perror("backtrace_symbols");
       exit(EXIT_FAILURE);
   }
   for (j = 0; j < nptrs; j++)
       printf("%s\n", strings[j]);
   free(strings);
}
static void   /* "static" means don't export the symbol... */
myfunc2(void)
{
   myfunc3();
}
void
myfunc(int ncalls)
{
   if (ncalls > 1)
       myfunc(ncalls - 1);
   else
       myfunc2();
}
int
main(int argc, char *argv[])
{
   if (argc != 2) {
       fprintf(stderr, "%s num-calls\n", argv[0]);
       exit(EXIT_FAILURE);
   }
   myfunc(atoi(argv[1]));
   exit(EXIT_SUCCESS);
}编译指令:
arm-linux-gcc -o test test.c -g
执行:
$ ./test 10
backtrace() returned 15 addresses
./test() [0x4007d0]
./test() [0x40088d]
./test() [0x4008b4]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x4008ad]
./test() [0x40090f]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7feddd188f45]
./test() [0x4006f9]
$ addr2line -e test 0x40088d
/home/hexing/build-test2-Qt5-Debug/test.c:37
离线
离线
https://github.com/JasonOldWoo/arm-backtrace
贴上一段以前写的不依赖工具链和第三方工具arm下的backtrace实现。
离线
离线
递归调用,现场程序不会写成这样啊
离线