1. 在嵌入式系统中,有时core dump直接从串口打印出来,结合objdump查找ra和epa地址,运用栈回溯,可以找到程序出错的地方。 2. 在一般Linux系统中,默认是不会产生core dump文件的,通过ulimit -c来查看core dump文件的大小,一般开始是0,可以设置core文件大小,ulimit -c 1024(kbytes单位)或者ulimit -c unlimited。 3. core dump文件输出设置,一般默认是当前目录,可以在/proc/sys/kernel中找 echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid号,还可以用 mkdir -p /root/corefile echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core-pattern
4. 5. 给个例子 test.c
void a() { char *p = NULL; printf("%d/n", *p); }
int main() { a(); return 0; }
编译 gcc -g -o test test.c 运行 ./test 报segmentation fault(core dump) gdb ./test test.core如果生成的是test.core. 开发过程中,当一个Linux程序异常退出时,我们可以通过core文件来分析它异常的详细原因。缺省情况下,Linux在程序异常时不产生core文件,要想让程序异常退出时产生core dump文件,需要使用ulimit命令更改coredump的设置: ulimit -c unlimited 上面的命令表示在程序异常时产生core dump文件,并且不对core dump文件的大小进行限制。 上述设置只是使能了core dump功能,缺省情况下,内核在coredump时所产生的core文件放在与该程序相同的目录中,并且文件名固定为core。很显然,如果有多个程序产生core文件,或者同一个程序多次崩溃,就会重复覆盖同一个core文件。 我们通过修改kernel的参数,可以指定内核所生成的coredump文件的文件名。例如,Easwy使用下面的命令使kernel生成名字为core.filename.pid格式的core dump文件: echo 'core.%e.%p' > /proc/sys/kernel/core_pattern 这样配置后,产生的core文件中将带有崩溃的程序名、以及它的进程ID。上面的%e和%p会被替换成程序文件名以及进程ID。 可以在core_pattern模板中使用变量还很多,见下面的列表:
如果在上述文件名中包含目录分隔符”/“,那么所生成的core文件将会被放到指定的目录中。 需要说明的是,在内核中还有一个与coredump相关的设置,就是/proc/sys/kernel/core_uses_pid。如果这个文件的内容被配置成1,那么即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID。 对所生成的core dump进程分析,需要使用调试工具,例如GDB等。可以参见Easwy的其它文章。 原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http:///blog/ ] http://blog.163.com/chujb_chen/blog/static/10571112011410112118895/ 问题:1. 生成的core dump保存路径在哪里,怎么设置 ============================================== 问题2.我的多线程程序在通过socket 连接同其它进程通讯,在对方进程退出或shutdown 时也几乎同时退出。可是我的程序没有输出任何在程序正常退出时肯定会显示的提示信息而直接退出,也没有产生 core dump 文件,不知道这是什么原因。 请问哪位知道: 进程异常退出时 Unix 在什么情况下会不产生 core dump 文件? 产生 core dump 文件,一般是程序异常中止(堆栈返回错误,内存访问出错...) the signal "SIGPIPE " ended your program. 我只知道有两种可能 很多信号默认的处理就是退出 初学者大部分的原因都是访问了不该访问的内存,这里面绝大多数又是因为访问零地址或内存溢出 |
|