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

参考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中打印函数调用堆栈【原创】的更多相关文章

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

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

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

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

  3. 从汇编角度来理解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) {     ...

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

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

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

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

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

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

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

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

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

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

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

    转自:http://blog.chinaunix.net/uid-30339363-id-5116170.html 原文地址:Linux下函数调用堆栈帧的详细解释 作者:cssjtuer http:/ ...

随机推荐

  1. 不连数据库List分页

    package com.jpsycn.kfwggl.common.crawl; import java.util.ArrayList; import java.util.List; public cl ...

  2. Fluentd 例子

    0. 安装.启动 安装 curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh 更新:最近貌似会安装 ...

  3. error MIDL2311 : statements outside library block are illegal in mktyplib compatability mode

    解决办法: 1. Do not use the /mktyplib203 switch unless you have to deal with legacy code dating back to ...

  4. 解决:CWnd::SetWindowText报Assertion failure

    参考资料: http://www.cnblogs.com/tiancun/p/3756581.html http://www.tc5u.com/mfc/2120698.htm http://forum ...

  5. 设置GPnP profile文件中asm spfile的位置

    登录asmcmd asmcmd> spset <location-绝对路径> 示例: ASMCMD> spset +DATA/asm/asmparameterfile/asms ...

  6. 原来现在很多人都用SignalR来实现Chat Room

    今天从一个业余开发的群里,看到有人要求这样一个项目需求: 1,)学员可以通过在线课堂找到自己喜欢的老师和课程. 2,)每个人可以建立自己课堂,每个课堂扣分多个子房间,交流群.设置管理员:有录音功能,可 ...

  7. Linux C进程内存布局

    当程序文件运行为进程时,进程在内存中获得空间.这个空间是进程自己的内存空间.每个进程空间按照如下方式分为不同区域: 进程内存空间布局图 text:代码段.存放的是程序的全部代码(指令),来源于二进制可 ...

  8. something about css locating.

    CSS position:static:默认属性,静态定位relative:相对定位,相对于父元素的定位,需要配合top,left,right,bottom,z-index等属性absolute:绝对 ...

  9. raid0

    RAID0把数据分割之后放在各个硬盘上,同时读写以提升数据带宽其实在固态硬盘还没有大量出现在零售市场中之前,玩家想要大幅度提升硬盘系统的性能,最常用的方法就是组建RAID0系统.原理很简单,就以SAT ...

  10. Eclipse开发C++遇到的Binary not found等问题

    但是一些人可能在编写实际程序的时候,主要是执行程序的时候,会遇到如下两条错误信息,而无法进行开发. Launch failed.Bianry not found A program file was ...