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

想必你一定遇到过Linux下程序异常退出的问题,异常退出貌似有一种神奇的魔力,会让你神经突然紧张。不要怕,Linux是很强大的,在程序退出的时候,会在可执行文件所在的目录生成一个core文件,它很好地记录了一些神秘而又必要的东西,帮助你定位到错误的根源,想想以前面试的时候人家闻到core文件,我答不上来,你说面试官会怎样想,那么就来说说core文件。

core文件实际上就是一个内存映象同时加上一些调试信息。

首先,你得打开系统的core文件生成开关吧,终端中输入ulimit -c命令,若显示0表示当前开关是关闭的。修改当前用户的.bash_profile文件(顺便说一句,不要动不动就用root用户修改/etc/profile文件,因为工作中是这样的,别开玩笑了,程序猿一辈子不会有root权限,你要做的是改掉root的习惯,就像你走向社会后,你要注意自己不是皇帝),打开它在末尾加上ulimit -c unlimited,保存退出。然后终端输入source .bash_profile后我们的设置就会生效了。这时再输入ulimit
-c显示的就是unlimited了,ulimited生成的core文件的大小不受限制,当让你也可以限制大小,如ulimit -c 10,表示生成的core文件大小限制在10K,不过我们一般不这样做,这样可能会导致生成的core文件不完整,还有一个原因,有的是磁盘空间,任性。

说了这么多,看一个简单的例子吧。

代码如下:

#include <stdio.h>
#include <stdlib.h>
void main()
{
	char *p ;
	free(p);
}

代码如此的简单,我只是想说明问题,将它编译成可执行文件吧,编译的时候加上-g参数,执行这个程序,啪,崩溃了。

可以看到当前目录下生成了core.xxx文件,如何来查看错误出现在哪呢。

当前目录下输入gdb test core.xxx (说明,bin代表当前程序的名字)

再输入where命令,就可以看到错误的根源,如下图:

表示在源文件test.c 中第六行的代码有问题,再去看看源文件对应的代码,free(p),显然char *p是没有分配任何空间,当然不能去释放。

core文件就这么简单,你好意思不会?

时间: 2024-12-15 06:56:58

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

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

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

结合程序崩溃后的core文件分析bug

结合程序崩溃后的core文件分析bug 引言 在<I/O的效率比较>中,我们在修改图1程序的BUF_SIZE为8388608时,运行程序出现崩溃,如下图1: 图1. 段错误 一般而言,导致程序段错误的原因如下: 内存访问出错,这类问题的典型代表就是数组越界. 非法内存访问,出现这类问题主要是程序试图访问内核段内存而产生的错误. 栈溢出, Linux默认给一个进程分配的栈空间大小为8M,因此你的数组开得过大的话会出现这种问题. 首先我们先看一下系统默认分配的资源: $ ulimit -acore

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

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

android捕获程序异常退出

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

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主线程捕获全部异

设置程序崩溃时产生 core 文件的配置

1 /* 不限制 core 文件的大小 */ 2 ulimit -c unlimited 3 4 /* 使用 pid 进行命名 */ 5 echo "1" > /proc/sys/kernel/core_uses_pid 6 7 /* 配置 core 文件存储路径,及名称的格式 */ 8 echo "~/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern 原文地址:https://www.cnb

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

[Linux应用]Linux应用程序输出数据重定向到文件中

转自:http://blog.chinaunix.net/uid-20680966-id-4698387.html 目的是要让程序的printf的打印能重定向到某个文本中,ctrl+c强制退出后查看文本,方便调试.运行方式:a. out程序正常运行是会打印一些字符的 a.out > 1.txt 2>&1 把stdout与stderr都重定向到1.txt文件中去,结果发现运行过程中1.txt一直为空,调试发现如果a.out正常结束退出1.txt数据就正常,ctrl+c强制退出程序则1.t