Linux程序异常退出打印调用堆栈

/*
 * 程序异常终止时打印异常程序调用堆栈
 * gcc -g -rdynamic BackTraceTest.c -o BackTraceTest
 *
 * 运行程序出现错误:
 * System error, Stack trace:
 * 0 ./BackTraceTest(SystemErrorHandler+0x77) [0x40095b]
 * 1 /lib64/libc.so.6() [0x3a4fe326b0]
 * 2 ./BackTraceTest(Fun1+0x10) [0x400a10]
 * 3 ./BackTraceTest(Fun+0xe) [0x400a23]
 * 4 ./BackTraceTest(main+0x37) [0x400a5c]
 * 5 /lib64/libc.so.6(__libc_start_main+0xfd) [0x3a4fe1ed5d]
 * 6 ./BackTraceTest() [0x400829]
 * Segmentation fault (core dumped)
 *
 * gdb打印错误行信息
 * gdb BackTraceTest
 * (gdb) info line *0x400a10
 * Line 66 of "BackTraceTest.c" starts at address 0x400a0c <Fun1+12> and ends at 0x400a13 <Fun1+19>.
 * (gdb) list *0x400a10
 * 0x400a10 is in Fun1 (BackTraceTest.c:66).
 * warning: Source file is more recent than executable.
 * 61	}
 * 62
 * 63	void Fun1()
 * 64	{
 * 65		char *p=NULL;
 * 66		*p = 'A';
 * 67	}
 * 68
 * 69	void Fun()
 * 70	{
 *
 *
 * addr2line 定位程序地址对应的源代码位置
 * addr2line  -e BackTraceTest -i 0x400a10
 * /home/cyf/workspace/BackTraceTest/BackTraceTest.c:66
 *
 */
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<string.h>
#include<execinfo.h>

void SystemErrorHandler(int signum)
{
	const int len=1024;
	void *func[len];
	size_t size;
	int i;
	char **funs;

	signal(signum,SIG_DFL);
	size=backtrace(func,len);
	funs=(char**)backtrace_symbols(func,size);
	fprintf(stderr,"System error, Stack trace:\n");
	for(i=0;i<size;++i) fprintf(stderr,"%d %s \n",i,funs[i]);
	free(funs);
	//exit(1);
}

void Fun1()
{
	char *p=NULL;
	*p = 'A';
}

void Fun()
{
	Fun1();
}

int main(const int argc,const char* argv[])
{
	signal(SIGSEGV,SystemErrorHandler); //Invaild memory address
	signal(SIGABRT,SystemErrorHandler); // Abort signal
	Fun();
	return 0;
}

时间: 2024-08-27 00:44:06

Linux程序异常退出打印调用堆栈的相关文章

Linux C程序异常退出怎么办——core文件帮你忙

想必你一定遇到过Linux下程序异常退出的问题,异常退出貌似有一种神奇的魔力,会让你神经突然紧张.不要怕,Linux是很强大的,在程序退出的时候,会在可执行文件所在的目录生成一个core文件,它很好地记录了一些神秘而又必要的东西,帮助你定位到错误的根源,想想以前面试的时候人家闻到core文件,我答不上来,你说面试官会怎样想,那么就来说说core文件. core文件实际上就是一个内存映象同时加上一些调试信息. 首先,你得打开系统的core文件生成开关吧,终端中输入ulimit -c命令,若显示0表

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

title: VC++ 崩溃处理以及打印调用堆栈 tags: [VC++, 结构化异常处理, 崩溃日志记录] date: 2018-08-28 20:59:54 categories: windows 高级编程 keywords: VC++, 结构化异常处理SEH, 崩溃日志记录 --- 我们在程序发布后总会面临崩溃的情况,这个时候一般很难重现或者很难定位到程序崩溃的位置,之前有方法在程序崩溃的时候记录dump文件然后通过windbg来分析.那种方法对开发人员的要求较高,它需要程序员理解内存.寄

android捕获程序异常退出

今天看到迅雷动漫里面一个CrashHandler 的类,我猜是崩溃处理类.进去一看,果然.顺便学习一下. Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可. 代码: public class CrashHandler implements Un

程序异常退出 却没有产生core文件

程序异常退出  却没有产生core文件 http://www.cnblogs.com/my_life/articles/4107333.html

C#关于软件界面无响应、BUG报警、程序异常退出等情况的监控和报警

对程序的监控,一般采用另外一个进程进行监控(即主进程和监控进程),主进程运行后,先查找下看有没有还在残留运行的监控进程,如果有先结束监控进程,然后重新启动. 如何监控主程序的思路是:主程序中开辟一个共享内存映射文件,通过定时器向文件写入变化的信号数据(自定义).监控程序定时从共享内存文件中读取信号数据,并和上次读取的信号数据进行对比,如果不一致表示主程序运行正常,如果不一致,表示运行异常或者程序异常退出. 内存映射文件 内存映射文件是由一个文件到进程地址空间的映射. C#提供了允许应用程序把文件

linux应用异常时打印堆栈方法

/* * 程序异常终止时打印异常程序调用堆栈 * gcc -g -rdynamic BackTraceTest.c -o BackTraceTest * * 运行程序出现错误: * System error, Stack trace: * 0 ./BackTraceTest(SystemErrorHandler+0x77) [0x40095b] * 1 /lib64/libc.so.6() [0x3a4fe326b0] * 2 ./BackTraceTest(Fun1+0x10) [0x400a

WPF PasswordBox鼠标进入时程序异常退出的解决办法

最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2.exe Framework 版本: v4.0.30319 说明: 应用程序通过 System.Environment.FailFast(string message) 请求终止进程. 消息: 不可恢复的系统错误. 堆栈: 在 System.Environment.FailFast(System.S

转 C#WinForm程序异常退出的捕获、继续执行与自动重启

特别声明:本文是转载的,在这里向原作者表示深深的感谢!解决我们的一个大问题! 本文参考网上搜索的信息,并做了适当修改可以让捕捉到异常之后阻止程序退出. 另给出了通过命令行自动重启的方法. 如果一个线程里运行下面的代码 int a = 0; int c = 10 / a; 将会导致程序自动结束,而且没有任何提示信息 但是如果是在主线程里运行这个代码,是会弹出异常信息对话框的 请问如何在线程里也出现这个异常信息对话框.或者避免程序直接退出,忽略异常,继续往下执行呢? 在WINFORM主线程捕获全部异

android 打印调用堆栈的函数

有时候,我们跟踪某个函数的时候,不知道这个函数是哪个函数调用的,当然对代码比较熟悉的话,直接看代码就可以了,但如果不熟悉,则可以使用2个方法: 1.使用traceview来查看,但使用过程中,有些机器无法列出当前运行的进程,无法跟踪 2.在该函数添加打印堆栈的log,可以直接打印出调用关系. Log.e("TAG", Log.getStackTraceString(new Exception()));