什么是coredump
Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。
该文件也是二进制文件,可以使用gdb、elfdump、objdump或者windows下的windebug、solaris下的mdb进行打开分析里面的具体内容。
注:core是在半导体作为内存材料前的线圈,当时用线圈当做内存材料,线圈叫做core。用线圈做的内存叫做core memory。
ulimit
虽然我们知道进程在coredump的时候会产生core文件,但是有时候却发现进程虽然core了,但是我们却找不到core文件。
在linux和Solaris下是需要进行设置的。
ulimit -c 可以设置core文件的大小,如果这个值为0.则不会产生core文件,这个值太小,则core文件也不会产生,因为core文件一般都比较大。
使用ulimit -c unlimited来设置无限大,则任意情况下都会产生core文件。
Windows下miniDump和FullDump的设置
Windows下需要在下面的注册表,
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting]
下面加一项LocalDumps,并做如下项配置:
Value |
描述 |
Type |
默认值 |
DumpFolder |
文件保存路径 |
REG_EXPAND_SZ |
%LOCALAPPDATA%CrashDumps |
DumpCount |
dump文件的最大数目 |
REG_DWORD |
10 |
DumpType |
指定生成的dump类型: |
REG_DWORD |
1 |
CustomDumpFlags |
仅在DumpType为0时使用 |
REG_DWORD |
MiniDumpWithDataSegs| MiniDumpWithUnloadedModules| MiniDumpWithProcessThreadData |
上面的配置信息,可以通过打开注册表来手动添加。
首先,打开cmd或者运行程序(微软图标+R)
如上截图,可以通过图形界面手动添加这些注册表信息,然后windows系统在有进程crash的时候就会保存fulldump的文件。
或者通过reg文件的方式来进行注册
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpFolder"="F:\\study_Test\\Dump"
"DumpCount"=dword:a
"DumpType"=dword:1
如上,通过新建一个fulldump.reg的文件,保存上面内容,双击后,这些信息就会注册到注册表中。
gdb 调试coredump的简单示例