利用Backtrace来捕获段错误堆栈信息
具体参考文档:https://blog.csdn.net/gatieme/article/details/84189280
测试Demo:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <stddef.h>
void print_trace(void)
{
void* array[30];
size_t size;
char** strings;
size_t i;
size = backtrace(array, 30);
strings = backtrace_symbols(array, size);
if (NULL == strings)
{
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
printf("Obtained %zd stack frames.\n", size);
for(i = 0 ; i < size; i++)
{
printf("%s\n", strings[i]);
}
free(strings);
strings = NULL;
exit(EXIT_SUCCESS);
}
void sighandler_dump_stack(int sig)
{
psignal(sig, "handler"); // 打印信号相关信息
print_trace();
signal(sig, SIG_DFL); // 恢复信号默认处理
raise(sig); // 继续后续的流程
}
void dumy_function(void)
{
print_trace();
}
void func_c()
{
*((volatile int*)0x00) = 0x100;
}
void func_b()
{
func_c();
}
void func_a()
{
func_b();
}
int main(int argc, char* argv[])
{
if (signal(SIGSEGV, sighandler_dump_stack) == SIG_ERR)
perror("signal failed"); // 在标准错误输出上打印格式: 自定义信息(调用函数名+failed): errno的具体描述
func_a();
return 0;
}
使用注意事项:
编译时,需要加上
- -g : 增加调试信息
- -rdynamic : 增加符号名称支持
得到段错误时,如何定位错误
在查看堆栈前,进入捕获 SIGSEGV 信号自定义函数前的地址addr,再根据

查看异常函数位置:
- add32line -C -f -e ./exe_name addr
输出如下:

查看发生异常的函数源码信息
- objdump -DS ./handler | grep -6 "400c74"
输出如下:

利用Backtrace来捕获段错误堆栈信息的更多相关文章
- C/C++捕获段错误,打印出错的具体位置(精确到哪一行)
修订:2013-02-16 其实还可以使用 glibc 的 backtrace_symbols 函数,把栈帧各返回地址里面的数字地址翻译成符号描述的 修订:2011-06-11 背景知识: · 在li ...
- C/C++捕获段错误,打印出错的具体位置(精确到哪一行)_转
转自:C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 修订:2013-02-16 其实还可以使用 glibc 的 backtrace_symbols 函数,把栈帧各返回地址里面的数字地址翻译 ...
- logger.error打印完整的错误堆栈信息
使用Spring Boot项目中的日志打印功能的时候,发现调用Logger.errror()方法的时候不能完全地打印出网站的错误堆栈信息,只能打印出这个错误是一个什么错误. 为什么呢,原因在于这个方法 ...
- 在java中捕获异常时,使用log4j打印出错误堆栈信息
当java捕获到异常时,把详细的堆栈信息打印出来有助于我们排查异常原因,并修复相关bug,比如下面两张图,是打印未打印堆栈信息和打印堆栈信息的对比: 那么在使用log4j输出日志时,使用org.apa ...
- 利用Xposed Hook打印Java函数调用堆栈信息的几种方法
本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374 在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看 ...
- logger.error完整打印错误堆栈信息
所以我们的写法可以是: Logger.error("xxx出错" , e); //第二个参数是e 而不是: Logger.error("xxx出错:" + e) ...
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报 分类: 嵌入式(928) 一般察看函数运行时堆栈的 ...
- linux下利用backtrace追踪函数调用堆栈以及定位段错误
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误[转]
来源:Linux社区 作者:astrotycoon 一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序 ...
随机推荐
- 潭州课堂25班:Ph201805201 MySQL第三课 (课堂笔记)
单表查询: select * from select sname from stu; 条件查询 select sname from stu where sid=2; select sname from ...
- bootStrap中的ul导航3-垂直导航
<div class="container"> <br/> <ul class="nav nav-pills nav-stacked&quo ...
- java学习手册
http://www.runoob.com/java/java-environment-setup.html
- tensorflow之数据读取探究(2)
tensorflow之tfrecord数据读取 Tensorflow关于TFRecord格式文件的处理.模型的训练的架构为: 1.获取文件列表.创建文件队列:http://blog.csdn.net/ ...
- 终极解决方案:org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
一.项目 我的项目采用Spring MVC +JSP+EasyUI 做的老项目. 在做图片验证码方法时,向网页输出验证码图片的方法如下: @Override public void showCodeI ...
- 【转】Angular之constructor和ngOnInit差异及适用场景
原文:http://liuwenzhuang.github.io/2016/03/04/angular2-constructor-versus-ngOnInit.html -------------- ...
- apache2.4多站点配置
原来是跑单站,现在想跑多站,配置不算复杂,记录一下: 用默认的httpd.conf修改,去掉两个vhost的注释 servername指定任意一个合法的域名 如果是python,配置wsgi 修改ex ...
- 【ZH奶酪】如何用Python实现编辑距离?
1. 什么是编辑距离? 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符, ...
- NIO-新的io操作方式
1.BIO带来的挑战 BIO即阻塞IO,不管是磁盘IO,还是网络IO,数据在写入OutputStream或者从InputStream读取时都有可能发生阻塞,一旦有阻塞,当前线程将会被挂起,即线程进入非 ...
- 【Java】关于MyBatis框架的总结
最近在学习MyBatis框架,我在这里记录一下学习MyBatis过程中的心得体会. Mybatis是什么?使用它我们可以做什么? MyBatis是一个开源的数据持久层框架,它内部封装了通过JDBC访问 ...