gbd 分析core文件_gcore 获取程序core dump file 但程序不用退出,gdb 分析core

本文包含如下部分内容

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值