在Linux中打印函数调用堆栈【原创】
本人学习笔记,代码参考如下网址
参考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 <stdio.h>
#include <execinfo.h>
#include <stdlib.h>
#include <unistd.h> 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下多层函数调用堆栈执行状态
注:在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下函数调用堆栈帧的详细解释【转】
转自:http://blog.chinaunix.net/uid-30339363-id-5116170.html 原文地址:Linux下函数调用堆栈帧的详细解释 作者:cssjtuer http:/ ...
随机推荐
- iOS:城市级联列表的使用
1.介绍: 现在越来越多的项目都用到了地址,尤其是电商O2O的购物平台,我之前做的教育产品和电商产品都用到了,而实现地址的设置用到的技术就是城市级联列表,即普遍的做法就是自定义选择器控件UIPicke ...
- 删除docker私有库镜像
不断往私库里push image,发现里面大多数镜像已经版本过旧,用不到了,所以决定删除私库里那些没用的镜像. Docker registry默认提供了一个仓库清理的url,如下:可以删除镜像ubun ...
- error LNK2005 int __cdecl 解决方案【转】
error LNK2005: "int __cdecl isPtInPolygon(class std::vector<struct double2,class std::alloca ...
- JBOSS安全配置
1.jmx-console登录的用户名和密码设置 默认情况访问http://localhost:8080/jmx-console就可以浏览jboss的部署管理的一些信息,不需要输入用户名和密码,使用起 ...
- SLAM学习笔记(2)SLAM算法
SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...
- [转]EntityFramework走马观花之CRUD(中)
学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...
- Nand Flash与Nor Flash的区别
区别:http://zhidao.baidu.com/question/1068445.html?qbl=relate_question_0&word=Serial%20Flash%20%D3 ...
- jdk安装与环境变量配置(一劳永逸)
换了一个项目组做新的项目,新的机器,又得重新打环境,懒得去百度下,这里做个备份,下回直接看就行,如下 进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置: 1.下载jdk(http ...
- Silverlight动画显示Line线
目的:在silverlight中显示两点之间的连线,要求动画显示连线效果. 如果需实现动画效果不得不了解,Storyborad对象: Storyboard Silverlight 通过时间线控制动 ...
- Nginx简介
序言Nginx 是 lgor Sysoev 为俄罗斯访问量第二的 rambler.ru 站点设计开发的.从 2004 年发布至今,凭借开源的力量,已经接近成熟与完善.Nginx 功能丰富,可作为 HT ...