本文包含如下部分内容
1. Linux内核里面生成的core file文件相关的代码
2. core dump file 相关的设置
3. 如何在程序中调用代码生成 core dump file,程序又不用退出。
4. 使用gdb分析 core dump file 文件
5. 用gdb 生成core文件
1. Linux内核里面生成的core file文件相关的代码
------------------------------------------------------------------
get_signal_to_deliver 这里没判断是不是信号是不是要触发core dump,然后调用
里面有一段这样变量vma的循环,应该是保存所有内存的? 不过应该还有其他信息的
1980
1981
for (
vma
=
first_vma
(
current
,
gate_vma
);
vma
!=
NULL
;
1982
vma
=
next_vma
(
vma
,
gate_vma
)) {
1983
struct
elf_phdr
phdr
;
1984
1985
phdr
.
p_type
=
PT_LOAD
;
1986
phdr
.
p_offset
=
offset
;
1987
phdr
.
p_vaddr
=
vma
->
vm_start
;
1988
phdr
.
p_paddr
= 0;
1989
phdr
.
p_filesz
=
vma_dump_size
(
vma
,
cprm
->
mm_flags
);
1990
phdr
.
p_memsz
=
vma
->
vm_end
-
vma
->
vm_start
;
1991
offset
+=
phdr
.
p_filesz
;
1992
phdr
.
p_flags
=
vma
->
vm_flags
&
VM_READ
?
PF_R
: 0;
1993
if (
vma
->
vm_flags
&
VM_WRITE
)
1994
phdr
.
p_flags
|=
PF_W
;
1995
if (
vma
->
vm_flags
&
VM_EXEC
)
1996
phdr
.
p_flags
|=
PF_X
;
1997
phdr
.
p_align
=
ELF_EXEC_PAGESIZE
;
1998
1999
size
+= sizeof(
phdr
);
2000
if (
size
>
cprm
->
limit
core dump file 相关的设置:
---------------------------------------
默认 linux 是没有dump core文件的,需要设置一下
widebright@:~/桌面$ ulimit -a
core file size (blocks, -c) 0 >>>>>>>>>>>>>>>>>这个设为0了,不会有core dump了
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -c 1000 最大允许core文件有1000块 ?
ulimit -c unlimited 不做限制
另有/proc/sys/kernel/core_pattern core_pipe_limit core_uses_pid 等文件可以控制core 文件的名字,具体可以看上面说的函数的实现。
或者在内核里面查找core_pattern变量。
----------------------------------------------
如何为自己的进程产生core 文件,又不想退出这个进程?
系统只在程序崩溃退出时自动产生core file。 有的人像自己处理异常信号,然后自己产生一个core file,然后继续运行。那该怎么办呢? 如果自己在想产生core file的时候,调用abort 函数来生成文件,core文件是生成了,但自己的进程也退出了。为了进程退出,在网上找到两个办法:
=============================================
方法一: 先fork创建一个子进程,子进程拥有和父进程一样的 内存空间了,然后在子进程触发abort信号,让子进程进行core dump。 这个fork看来还比较有意思的,子进程拥有父进程的一样 的内存空间,上次才看到有人想定时存档备份进程数据时,也是想fork一个 子进程出来,说是这样父进程在备份时也不用同步等待了。子进程可以 访问父进程的内容吧。 ============================================= 方法来自 http://stackoverflow.com/questions/131439/how-can-a-c-program-produce-a-core-dump-of-itself-without-terminating #include #include #include #include #include #include #include #include #define mcrosec 1000000 void create_dump(void) { int * invalid = NULL; if(!fork()) { // Crash the app in your favorite way here