在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下如何在程序中获得当前调用栈信息



目录
相关文章
|
监控 前端开发 开发者
前端代码规范 - 日志打印规范
前端代码规范 - 日志打印规范
技术心得:对数周期幂率模型(LPPL)
技术心得:对数周期幂率模型(LPPL)
623 3
|
监控 Linux 数据处理
lslocks:Linux系统中的锁信息查看利器
`lslocks`是Linux工具,用于查看系统上的文件锁信息,帮助诊断进程同步问题。它显示持有锁的进程、锁类型(如POSIX、flock)和状态。通过简洁的输出,用户能识别死锁和资源争用,优化性能。结合其他命令如`grep`和`awk`可增强分析能力。需适当权限运行,定期监控以预防并发访问问题,处理死锁时要谨慎。
|
IDE 物联网 Unix
Linux上应用竟然可以轻松的移植到RTOS上
Linux上应用竟然可以轻松的移植到RTOS上
Linux上应用竟然可以轻松的移植到RTOS上
|
存储 缓存 NoSQL
Redis从入门到精通之底层数据结构SDS(简单动态字符串)详解
SDS是Redis中的一种字符串类型,它是一种二进制安全的字符串,由简单动态字符串(SDS)实现。SDS支持多种数据结构,其中字符串(String)是最常用的一种数据结构之一。SDS的优点在于它可以避免C字符串常见的问题,比如缓冲区溢出和内存泄露等。SDS的常数复杂度获取字符串长度和杜绝缓冲区溢出可以避免使用strlen和strcat函数时的一些问题。同时,SDS的空间预分配和惰性空间释放两种策略可以减少修改字符串的内存重新分配次数。SDS也是二进制安全的,因为它不是以空字符串来判断字符串是否结束,而是以len属性表示的长度来判断字符串是否结束。SDS还兼容部分C字符串函数
3626 89
|
算法 数据处理
【MATLAB】极点对称模态ESMD信号分解算法
【MATLAB】极点对称模态ESMD信号分解算法
471 0
|
网络安全
蓝易云 - 修复Cygwin下ssh报Error while dumping state (probably corrupted stack)
以上步骤应该可以帮助你解决在Cygwin下使用ssh时遇到的"Error while dumping state (probably corrupted stack)"错误。
149 0
|
Arthas 数据采集 运维
日志瘦身骚操作:从 5G 优化到 1G,牛逼!!
日志瘦身骚操作:从 5G 优化到 1G,牛逼!!
358 0
日志瘦身骚操作:从 5G 优化到 1G,牛逼!!
|
Linux
settime计时器和POSIX timer函数
settime计时器和POSIX timer函数
439 0
|
C语言
宏定义设置x二进制序列的第n个比特位为1或者0
宏定义设置x二进制序列的第n个比特位为1或者0
248 0