coredump导出堆内存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了coredump导出堆内存相关的知识,希望对你有一定的参考价值。

参考技术A 系统中,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的。

什么是Core Dump?
Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.

COREDUMP是由系统全局设置和程序设置后才能生成的,当发生异常时,由内核将程序映像转储,和GCC和GDB没有直接关系,GCC中加-g参数是为了获得符号表,便于GDB分析,一般只包含一个线程的TRACE,COREDUMP所反馈的信息也不是完全准确的,它只是程序宕机前的一个映像(主要是调用堆栈及全局量),如果程序跑飞了那参考价值就不大了。

为什么没有core文件生成呢?
有时候程序down了, 但是core文件却没有生成. core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.
ulimit -c unlimited(将coredump文件设置位无限制)

可用ulimit -a命令查看系统限制,如果此时的core file size (blocks, -c) 0则不会产生core文件。
core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号

当获得了core文件以后,就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件
如: gdb [...]xmsd [...]/xmsd_PID1065_SIG11.core

然后输入bt或者where找到错误发生的位置和相应的堆栈信息。就可知道发生错误时的函数调用关系,然后可以使用up或者down查看上一条和下一条具体详细信息。这样便能对问题进行大概定位,然后看源代码,进行分析。

例程:

$vi foo.c

编辑如下:
#include <stdio.h>

static void sub(void);

int main(void)



sub();

return 0;



static void sub(void)



int *p = NULL;

/* derefernce a null pointer, expect core dump. */

printf("%d", *p);



$more foo.c //查看代码

$gcc -Wall -g foo.c

$./a.out

段错误

当core file size (blocks, -c) 0时,不会有core文件生成,但是我们已经设置位unlimited,所以在ls查看的时候:

a.out core foo.c
然后使用GDB进行解析

$gdb --core=core

GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
[New Thread 14364]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400548 in ?? ()
(gdb)bt

#0 0x0000000000400548 in ?? ()
#1 0x0000000000000000 in ?? ()
(gdb)file ./a.out
Reading symbols from /local/test_gdb/a.out...done.

(gdb) bt
#0 0x0000000000400548 in sub () at foo.c:13
#1 0x000000000040052d in main () at foo.c:6
(gdb) l
1 #include<stdio.h>
2 static void sub(void);
3
4 int main(void)
5
6 sub();
7 return 0;
8
9
10 static void sub(void)
(gdb) l
11
12 int *p = NULL;
13 printf("%d",*p);
14
通过上面就可以看到问题出在什么地方。
点击阅读全文

Core Dump 调试方法

今天调试一个程序, 用到了core dump, 于是写出来, 记于此.
什么是Core Dump?
Core的意思是内存, Dump的意思是扔出来, 堆出来.
开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.

如何使用core文件?
gdb -c core文件路径 [应用程序的路径]
进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.

为什么没有core文件生成呢?
有时候程序down了, 但是core文件却没有生成. core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.
ulimit -c unlimited
core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号

4. 用gdb查看core文件:
下面我们可以在发生运行时信号引起的错误时发生core dump了.
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.

以上是关于coredump导出堆内存的主要内容,如果未能解决你的问题,请参考以下文章

在linux系统下使用内存技术,检测堆越界错误

亲测解决dump导出JAVA堆内存文件报错:Unable to open socket file: target process not responding or HotSpot VM not lo

5.JVM系列-堆内内存泄露案例分析解决

JVM性能分析和调优方向

Core Dump 调试方法

干货:JVM 堆内存和非堆内存