巧用backtrace系列函数

1527阅读 0评论2012-09-29 lubing521
分类:

backtrace系列函数:使用范围适合于没有安装GDB或者想要快速理清楚函数调用顺序的情况
backtrace系列函数
1.Function: int backtrace (void **buffer, int size)//用来获取堆栈信息。size需要获取的堆栈层次,
该函数返回返回值是实际获得的堆栈层次

2.char ** backtrace_symbols (void *const *buffer, int size) //size 是backtrace的返回值该函数是用来翻译从bacetrace获得的堆栈信息。返回值为存放各个函数的地址 的二维指针。
3.Function: void backtrace_symbols_fd (void *const *buffer, int size, int fd) 该函数的功能和backtrace_symbols一样只是它的返回字符串是写入文件描术符为fd的文件具体例子如下:
 /*该例子是用来定位段错误的位置的。因为段错误时发出的SIGSEGV默认处理是终止程序,
并不会有其他的打印信息输出 因此需要对SIGSEGV信号进行处理*/
#include
#include
#include
#include
     void
     print_trace (int signo)
     {
       void *array[10];
       size_t size;
       char **strings;
       size_t i;
        char a[10];
       size = backtrace (array, 10);
       strings = backtrace_symbols (array, size);
           
       printf ("Obtained %zd stack frames.\n", size);
          
       for (i = 0; i < size; i++)
             
          printf ("%s\n",  strings[i]);

       free (strings);
     }
   
     /* A dummy function to make the backtrace more interesting.
 */
     void
     dummy_function (void)
     {
       *((char *)0)=0x999;
     }

     int
     main (void)
     {
        signal(SIGSEGV,print_trace);
       dummy_function ();
       return 0;
     }

生成并运行
 gcc -rdynamic   -g test.c -o  test   //-rdynamic 可以看到出错的位置和函数的偏移量

 Obtained 6 stack frames.
./test(print_trace+0x1f) [0x400877]
/lib64/libc.so.6 [0x37f72302d0]
./test(dummy_function+0x9) [0x4008e4]
./test(main+0x18) [0x400901]
/lib64/libc.so.6(__libc_start_main+0xf4) [0x37f721d994]
./test [0x4007a9]

 注意:backtrace函数是不会对系统函数及共享库的函数进行记录的。
如果要调试共享库里的函数,则可以把共享库改成静态库连接进去。


上一篇:uhd_rx_cfile之运行效果
下一篇:route: SIOCADDRT: File exists 问题