linux 打印堆栈日志_在Linux中打印函数调用堆栈【原创】

本文介绍了如何在Linux环境下使用backtrace、backtrace_symbols和backtrace_symbols_fd函数来打印函数调用堆栈,以帮助进行程序调试。通过示例代码展示了如何在C程序中实现这一功能,并提到了addr2line工具用于查找具体C文件的行号。
摘要由CSDN通过智能技术生成

本人学习笔记,代码参考如下网址

参考http://www.cnblogs.com/dma1982/archive/2012/02/08/2342215.html

zhangbh@prolin-srv: gcc -g -rdynamic -o my a.c

zhangbh@prolin-srv: ./my

backtrace() returned addresses

./my(my_func+0x1f)[0x40089c]

./my(run+0x9)[0x4008e0]

./my(main+0x14)[0x4008f6]

/lib/x86_64-linux-gnu/libc.so.(__libc_start_main+0xf5)[0x7f68032c7ec5]

./my[0x4007b9]

Linux中共提供了三个函数用于打印调用堆栈:

/*

* 函数说明: 取得当前函数的调用堆栈

* 参数:

* buffer:用于存储函数地址的数组

* size:buffer数组的长度

* 返回值:

* 存储到数组中的函数个数

*/

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

/*

*

* 函数说明:将一组函数地址转换为字符串

* 参数:

* buffer: 经由backtrace得到的函数地址

* size: buffer数组的长度

* 返回值:

* 函数在系统中对应用字符串

*/

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

/*

* 函数说明:将一组函数地址转换为字符串

* 参数:

* buffer: 经由backtrace得到的函数地址

* size: buffer数组的长度

* fd: 输出结果文件描述符

*/

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

#include

#include

#include

#include

void my_func(void)

{

int j, nptrs;

#define SIZE 100

void *buffer[];

char **strings;

nptrs = backtrace(buffer, SIZE);

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

backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO);

}

void run(void)

{

my_func();

}

int main(int argc, char **argv)

{

run();

return ;

}

addr2line 0x4008e0 -e ./a.out -f

这样可以找到具体的c文件的行号

在linux代码中打印函数调用的堆栈的方法

之前一直有这样的需求,当时问到,也没搜到方法,现在竟然既问到了,也搜到了,哎,世事真是不能强求啊! 在Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入: ...

从汇编角度来理解linux下多层函数调用堆栈执行状态

注:在linux下开发经常使用的辅助小工具: readelf .hexdump.od.objdump.nm.telnet.nc 等,详细能够man一下. 我们用以下的C代码来研究函数调用的过程.  C ...

从汇编角度来理解linux下多层函数调用堆栈运行状态

我们用下面的C代码来研究函数调用的过程.  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16   int bar(int c, int d) {     ...

在LINUX中跟踪函数调用----http://stackoverflow.com/

http://stackoverflow.com/questions/311840/tool-to-trace-local-function-calls-in-linux I am looking f ...

在C语言中破坏函数调用堆栈

// 这段代码显示,在C语言修改函数的返回地址 int test1() { ; } int test2(int a) { *(&a-) = (int)test1; // 将返回地址修改为tes ...

【转】Android下面打印进程函数调用堆栈(dump backtrace)的方法

1. 为什么要打印函数调用堆栈? 打印调用堆栈可以直接把问题发生时的函数调用关系打出来,非常有利于理解函数调用关系.比如函数A可能被B/C/D调用,如果只看代码,B/C/D谁调用A都有可能,如果打印出 ...

VC++ 崩溃处理以及打印调用堆栈

title: VC++ 崩溃处理以及打印调用堆栈 tags: [VC++, 结构化异常处理, 崩溃日志记录] date: 2018-08-28 20:59:54 categories: windows ...

嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

Linux下函数调用堆栈帧的详细解释【转】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值