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

简介: 主要使用backtrace和backtrace_symbols两个函数。#include #include using namespace std; //返回当前堆栈调用列表string print_trace(int fd, int filter_first_l...
主要使用backtrace和backtrace_symbols两个函数。
  1. #include
  2. #include
  3. using namespace std;

 //返回当前堆栈调用列表

  1. string print_trace(int fd, int filter_first_lines)
  2. {
  3.     void *array[MAX_STACK_LAYERS];
  4.     size_t size;
  5.     char **strings;
  6.     size_t i;
  7.     string strRet("");
  8.     
  9.     size = backtrace (array, MAX_STACK_LAYERS);
  10.     strings = backtrace_symbols (array, size);

  11.     for (i = 0; i size; i++)
  12.     {
  13.         if(i filter_first_lines)
  14.             continue;
  15.         if(fd > 0)
  16.         {
  17.             write(fd, strings[i], strlen(strings[i]));
  18.             write(fd, "\n", 1);
  19.         }
  20.         strRet.append(strings[i]);
  21.         if(i size-1)
  22.             strRet.append(1, '\n');
  23.     }
  24.     if(fd > 0)
  25.         write(fd, "\n", 1);

  26.     free (strings);
  27.     return strRet;
  28. }
一个示例输出结果是:
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z11print_tracei+0x5c) [0x81798e4]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_ZN10MemTracker16RetriveCallStackEiRSs+0x2d) [0x8179ab5]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_ZN10MemTracker9AddRecordEjPvi+0xc1) [0x817a9b7]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Znwj+0x5b) [0x817b02d]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z19IWCreateNotesThreadP17IWNotesThreadInfo+0x5b) [0x80bfc63]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z11IWNotesMainR14LNNotesSessioniPPc+0x525) [0x81624af]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z6iwmainiPPc13iwmain_errors+0x83) [0x8162a01]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(main+0x41) [0x8162b79]
/lib/libc.so.6(__libc_start_main+0xdc) [0x2e5e9c]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent [0x806c7c1]

相关链接:
《返璞归真--UNIX技术内幕》
在Solaris下如何在程序中获得当前调用栈信息
在AIX下如何在程序中获得当前调用栈信息
在Windows下如何在程序中获得当前调用栈信息
目录
相关文章
|
2月前
|
安全 Linux iOS开发
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
154 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
404 7
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
1323 2
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
469 2
|
9月前
|
存储 缓存 Linux
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
992 8
|
11月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
2053 23
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
缓存 监控 Linux
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
1100 1