在Solaris下如何在程序中获得当前调用栈信息(函数名等)

本文转自:http://*.com/questions/6403803/how-to-get-backtrace-function-line-number-on-solaris
主要使用了getcontext和walkcontext两个函数。
  1. #include stdio.h>
  2. #include stdlib.h>
  3. #include unistd.h>
  4. #include ucontext.h>
  5. #include dlfcn.h>

  6. int walker(uintptr_t pc, int sig, void *usrarg) {

  7.     Dl_info dlip;

  8.     if(dladdr((void *)pc, &dlip)) {
  9.         (void)printf(" %08lx %s %s\n", pc, dlip.dli_fname, dlip.dli_sname);
  10.         return 0;
  11.     } else {
  12.         perror("dladdr()");
  13.         return -1;
  14.     }

  15. }

  16. int bar() {

  17.     char buf[64];
  18.     snprintf(buf, 64, "/bin/pstack %i", getpid());
  19.     system(buf);

  20.     (void)printf("\nprintstack()\n");
  21.     printstack(0);

  22.     ucontext_t ucp;
  23.     if(getcontext(&ucp)) {
  24.         perror("\ngetcontext()");
  25.         return -1;
  26.     } else {
  27.         (void)printf("\nwalkcontext()\n");
  28.         return walkcontext(&ucp, &walker, NULL);
  29.     }

  30. }

  31. int main(int argc, char *argv[]) {
  32.     return bar();
  33. }

执行结果:


$ gcc -g -o bar bar.c
$ ./bar
(pstack的输出)
ff2cd4d8 waitid   (0, 4067, ffbff4b8, 3)
ffbff664, ff390140)  ff2bce94 waitpid  (4067, ffbff60c, 0, 0, + 60
000, 1, ff3303d8, ff ff2afe20 system   (ffbff928, ff339bd0, 20bff664) + 2ec
4, ff392a00, ff2b6d 000108b8 bar      (20c70, 1c00, ff335900,6c) + 38
20c94, ff3900c0, 0) 00010968 main     (1, ffbffa4c, ffbffa54, + c
                     00010698 _start   (0, 0, 0, 0, 0, 0) + 5c

printstack()
/tmp/bar:bar+0x54
/tmp/bar:main+0xc
/tmp/bar:_start+0x5c

walkcontext()
 00010968 /tmp/bar main
 00010698 /tmp/bar _start

相关链接:

《返璞归真--UNIX技术内幕》

在AIX下如何在程序中获得当前调用栈信息

在Linux下如何在程序中获得当前调用栈信息

在Windows下如何在程序中获得当前调用栈信息



上一篇:《返璞归真--UNIX技术内幕》--第9章 字符设备驱动


下一篇:《返璞归真--UNIX技术内幕》--第6章 中断处理过程