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

简介: 本文转自:http://stackoverflow.com/questions/6403803/how-to-get-backtrace-function-line-number-on-solaris主要使用了getcontext和walkcontext两个函数。
本文转自:http://stackoverflow.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下如何在程序中获得当前调用栈信息



目录
相关文章
|
20天前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
4月前
|
Linux C++
【代码片段】Linux C++打印当前函数调用堆栈
【代码片段】Linux C++打印当前函数调用堆栈
90 0
|
10月前
|
测试技术 API
【OS Pintos】Project1 项目要求说明 | 进程中止信息 | 参数传递 | 用户内存访问 | 有关项目实现的建议
【OS Pintos】Project1 项目要求说明 | 进程中止信息 | 参数传递 | 用户内存访问 | 有关项目实现的建议
113 0
|
程序员 编译器 C++
VC 2015 调用栈查看主函数调用详情的设置
VC 2015 调用栈查看主函数调用详情的设置
88 0
|
Linux
Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息
Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息
217 0
|
开发工具 Android开发
【错误记录】OD 调试器附加进程时找不到进程 ( CE 工具可以附加进程 )
【错误记录】OD 调试器附加进程时找不到进程 ( CE 工具可以附加进程 )
900 0
【错误记录】OD 调试器附加进程时找不到进程 ( CE 工具可以附加进程 )
|
小程序 测试技术 数据安全/隐私保护
[附加]CrackMe之大牛的程序
[附加]CrackMe之大牛的程序
106 0
[附加]CrackMe之大牛的程序
|
MySQL 关系型数据库 Linux
linux下命令行执行后的返回值-错误值
我们最开始学习的C语言中,主函数中int main()函数的最后总会加一个return 0;充当返回值,当初我们并不知道这个返回值的意义是什么,我们经常使用的是普通函数中的返回值,当函数执行一个任务时,函数执行完毕之后总会返回一个适当的值来告诉执行者该函数执行的情况 Linux 下,在terminal下,控制台下运行命令,所有的命令在结束时,都会返回一个数字值,这个值即为返回值,每个返回值都对应着一个错误号,根据错误号我们可以大致推断这个函数执行的情况。
1993 0