原文出处  http://blog.csdn.net/yetyongjin/article/details/7759144

以下不能windows + mingw下执行.  windows下参考 http://code.google.com/p/backtrace-mingw/

我们知道,GDB的backtrace命令可以查看堆栈信息。但很多时候,GDB根本用不上。比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试。如果能让程序自己输出调用栈,那是最好不过了。本文介绍和调用椎栈相关的几个函数。

NAME

backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging

SYNOPSIS

#include

int backtrace(void **buffer, int size);

char **backtrace_symbols(void *const *buffer, int size);

void backtrace_symbols_fd(void *const *buffer, int size, int fd);

以上内容源自这几个函数的man手册。

先简单介绍一下这几个函数的功能:

l backtrace:获取当前的调用栈信息,结果存储在buffer中,返回值为栈的深度,参数size限制栈的最大深度,即最大取size步的栈信息。

l backtrace_symbols:把backtrace获取的栈信息转化为字符串,以字符指针数组的形式返回,参数size限定转换的深度,一般用backtrace调用的返回值。

l backtrace_symbols_fd:它的功能和backtrace_symbols差不多,只不过它不把转换结果返回给调用方,而是写入fd指定的文件描述符。

Man手册里,给出了一个简单的实例,我们看一下:

1 #include

2 #include

3 #include

4 #include

5

6 void myfunc3(void) {

7    int j, nptrs;

8    #define SIZE 100

9    void *buffer[100];

10    char **strings;

11    nptrs = backtrace(buffer, SIZE);

12    printf("backtrace() returned %d addresses\n", nptrs);

13    /*The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)14 *  would produce similar output to the following:*/

15

16    strings = backtrace_symbols(buffer, nptrs);

17    if (strings == NULL) {

18        perror("backtrace_symbols");

19        exit(EXIT_FAILURE);

20    }

21

22    for (j = 0; j

23        printf("%s\n", strings[j]);

24    free(strings);

25 }

26

27 static void  myfunc2(void) {   /*"static" means don't export the symbol

*/

28    myfunc3();

29 }

30

31 void myfunc(int ncalls) {

32    if (ncalls > 1)

33        myfunc(ncalls - 1);

34    else

35        myfunc2();

36 }

37

38 int main(int argc,char *argv[]) {

39    if (argc != 2) {

40        fprintf(stderr,"%s num-calls\n", argv[0]);

41        exit(EXIT_FAILURE);

42    }

43    myfunc(atoi(argv[1]));

44    exit(EXIT_SUCCESS);

45 }

46

编译:

# cc prog.c -o prog

运行:

# ./prog 0

backtrace() returned 6 addresses

./prog() [0x80485a3]

./prog() [0x8048630]

./prog() [0x8048653]

./prog() [0x80486a7]

这样,是输出了调用栈,不过只是以十六进制输出函数地址而已,可读性很差。仔细看下man手册,原来很简单,编译时加上个参数:

重新编译:

# cc -rdynamic  prog.c -o prog

通过gcc手册,我们可以也解下参数的说明:

-rdynamic

Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen" or to allow obtaining backtraces from within a program.

再执行:

# ./prog 0

backtrace() returned 6 addresses

./prog(myfunc3+0x1f) [0x8048763]

./prog() [0x80487f0]

./prog(myfunc+0x21) [0x8048813]

./prog(main+0x52) [0x8048867]

/lib/libc.so.6(__libc_start_main+0xe6) [0xaf9cc6]

./prog() [0x80486b1]

这回,可以看到函数名了。

posted on 2012-12-17 22:12 Khan 阅读(1380) 评论(0)  编辑 收藏 引用 所属分类: GCC/G++ 、跨平台开发

java打印堆栈信息linux,在C/C++程序里打印调用栈信息(转载)相关推荐

  1. 如何获取当前C#程序所有线程的调用栈信息 ?

    咨询区 Daniel Sperry 请问如何获取 .NET 程序当前所有线程的调用栈信息?我知道在 java 中只需调用 java.lang.Thread.getAllStackTraces() 方法 ...

  2. CFI Directives调用栈信息指令

    一组伪指令,用来协助生成调用栈信息,生成的.s文件中存在的,在.i文件中不存在. GAS利用CFI指令生成.debug_frame还是.eh_frame,在.cfi_sections指令中指定.

  3. php 打印函数调用栈,利用backtrace和backtrace_symbols函数打印调用栈信息

    本帖最后由 kylin_try 于 2017-2-6 08:41 编辑 在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include int ...

  4. Linux串口输出启动信息,linux开发板启动过程串口打印信息

    满意答案 板子软件分三部分: 1.uboot (负责初始化基本硬件,如串口,网卡,usb口等,然后引导系统运行) 2.linux系统 (真正的操作系统) 3.你的应用程序 (基于操作系统的软件应用) ...

  5. linux执行python不打印_在Python中执行shell程序而不打印到屏幕

    有没有一种方法可以让我从Python执行一个shell程序,它将输出打印到屏幕上,然后将它的输出读入变量而不在屏幕上显示任何内容?在 这听起来有点令人困惑,所以也许我可以用一个例子来解释它.在 假设我 ...

  6. linux java no x11_在linux下运行javaMail程序报No X11 DISPLAY variable was...

    收藏 java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operat ...

  7. Android | 打印堆栈

    目录 1. Java中打印堆栈 1.1 Throwable类 1.2 Debug类 2.C++代码中打印堆栈 3. C代码中打印堆栈 4.Linux内核中打印堆栈 5.动态方法 5.1 dump ja ...

  8. Android HAL层/native C程序打印栈信息方法

    在调试Android系统底层函数时,经常需要跟踪函数调用流程,特别在HAL层需要确定参数来源时.使用栈信息逆向跟踪可快速分析函数调用流程,结合使用addr2line工具.绘图工具可绘制函数关系图.本文 ...

  9. java将图书信息写入原有文件里_Java保存图书信息

    在本章<Java字节流的使用>和<Java字符流的使用>中已经详细介绍了字节.字符输入/输出流的应用,利用输出流我们可以将一些数据保存到磁盘文件中,利用输入流可以读取磁盘文件中 ...

最新文章

  1. docker网络集群
  2. 老大,我就想加个索引,怎么就这么难?
  3. MySQL5.7本地首次登录win10报错修改
  4. faiss python安装_如何在ubuntu 18.04上安装faiss GPU
  5. 数据结构_树与二叉树总结
  6. Mono.Cecil FAQ文档翻译
  7. css+html工商银行小项目
  8. 数字三角形的多种解法思路
  9. linux命令报错,在Linux执行命令报错”Arg list too long”的原因分析 – 运维派
  10. Bsp开发的几个层次
  11. 网站搭建-django-学习成绩管理-13-ECharts
  12. python倍数怎么表示_什么是python倍数生成器
  13. c语言protect,PROTECT应该包含什么作业?
  14. openjudge 1.7.11 潜伏者
  15. nyoj 1036非洲小孩
  16. C语言程序用英尺换算公式计算身高的小例子
  17. 如何高效阅读代码?Linux大神拍了拍你并教给你这三个步骤
  18. rust物资刷新机制_Rust 多久更新一次?
  19. ssd测试软件4k 64线程是什么意思,4K随机/缓存等性能测试_固态硬盘评测-中关村在线...
  20. 【安全知识分享】PPTX|防触电及安全用电培训课件(39页)(附下载)

热门文章

  1. MyEclipse中更改JRE环境
  2. 【IO面试题】打印目录树形结构,并输出到file.txt中
  3. JQuery操作cookie插件
  4. SUS安装配置简明图解攻略
  5. [转载] python猜字谜游戏_Python Hangman猜字游戏
  6. 人事管理系统为你解剖JSP
  7. 大兄dei,早点看清this吧
  8. Python静态方法 类方法
  9. 【CentOS】又是一篇Shell
  10. EasyUI文档学习心得