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

参考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. 【长期有效】1分钱抢100M上网流量及iPhone5S免费抽奖

    声明:本活动经作者亲自体验,绝对真实.安全.可靠.下文中图片为手机界面截图,最终得到官方手机流量增加100M的短信通知,回家过年使用最合适! 0.点击下方活动图片,进入“百度钱包”页面,你也可以直接 ...

  2. Objective-C中 Self和 Super详解

    Objective-C中 Self和 Super详解 Objective-C 中Self 和 Super 详解本文要介绍的内容,在 Objective-C 中的类实现中经常看到这两个关键字 self  ...

  3. C# js asp.net 字符串MD5加密GetMD5Hash

    赵小虎老师 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  4. hive DDL

    官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL https://cwiki.apache.org/co ...

  5. Unable to instantiate Action...............

    当时找了好久都没搞明白,出现这样的问题,可能不是代码错了.将新添加的action不要添加在末尾,这样可能导致这样的问题出现,所以新添加的action最好放置在struts配置文件中间.

  6. JQuery-UI Dialog下使用服务器端按钮失效

    目标:点按钮弹出div层,选择数据后自动隐藏div,将所选数据赋值到窗体. <div id="divWinPop"> //里面是要实现弹出框的代码,包括翻页.查找等. ...

  7. linux: centos设置ip以及连接外网

    注明:我使用的的使centos 7,所有文件名是ifcfg-enp0s3, 一. 设置虚拟机中linux的ip,使本地能连通虚拟机的linux系统 1>.进入本地windows的cmd,输入ip ...

  8. windows Azure 域名绑定

    windows Azure 的虚拟机的ip是会变化的,比如你关机.所以绑定域名用A记录就不太可靠. 你新建虚拟机的同时,也会新建一个云服务,给你一个类似XX.cloudapp.net的二级域名. 这样 ...

  9. PostgreSQL Replication之第十五章 与Walbouncer 一起工作

    与Walbouncer 一起工作 在本书的最后一章,将引导您通向2014年发布的一个工具,称为walbouncer.本书中的大多数技巧说明了如何复制整个数据库实例,如何分片,等等.在最后一章,是关于w ...

  10. keil 编译的一些错误

    以前使用的是MDK4.5 但是没有stm32F3的元器件,果断的使用了4.6版本了.但是编译之后出现这样错误:linking....\Obj\prj.axf: Warning: L6373W: lib ...