37 coredump 的生成和使用

前言

呵呵 coredump 之前对于我而言也是一个挺陌生的概念  

但是 只从开始了 linux 的相关学习之后, 对于这个 概念也有了一些 理解 

呵呵 这里 以一些 简单的例子 来看一下 coredump 的生成和使用

首先执行 "ulimit -c unlimited" 

测试用例1 - 除数为 0 

root@ubuntu:~/Desktop/linux/HelloWorld# cat Test07GenCoreDump.c
#include "stdio.h"
 
int main(int argc, char** argv) {
 
int x = 2;
int y = 3;
int z = x + y;

//char* p = (char*) z;
//char pValue = *p;

char divZero = z / 0;

//setenv("name", "jerry");
//char* envName = getenv("name");
//printf(" envName = %s, %s \n", envName, z);

}

root@ubuntu:~/Desktop/linux/HelloWorld# ./Test07GenCoreDump 
Floating point exception (core dumped)

使用 gdb 来分析 coredump 文件, 呵呵 保留了完整的 内存信息, 这里可以查看代码, 查看数据, 查看地址信息 等等 

通过执行代码分析, 可以看到 报错的地方就是上面 "char divZero = z / 0;" 

使用的 idiv 指令, 除数为 cx 值为 0 

root@ubuntu:~/Desktop/linux/HelloWorld# gdb Test07GenCoreDump core 
// ... 
Core was generated by `./Test07GenCoreDump'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x0000000000400563 in main ()
(gdb) disassemble 
Dump of assembler code for function main:
   0x0000000000400536 <+0>:	push   %rbp
   0x0000000000400537 <+1>:	mov    %rsp,%rbp
   0x000000000040053a <+4>:	mov    %edi,-0x14(%rbp)
   0x000000000040053d <+7>:	mov    %rsi,-0x20(%rbp)
   0x0000000000400541 <+11>:	movl   $0x2,-0xc(%rbp)
   0x0000000000400548 <+18>:	movl   $0x3,-0x8(%rbp)
   0x000000000040054f <+25>:	mov    -0xc(%rbp),%edx
   0x0000000000400552 <+28>:	mov    -0x8(%rbp),%eax
   0x0000000000400555 <+31>:	add    %edx,%eax
   0x0000000000400557 <+33>:	mov    %eax,-0x4(%rbp)
   0x000000000040055a <+36>:	mov    -0x4(%rbp),%eax
   0x000000000040055d <+39>:	mov    $0x0,%ecx
   0x0000000000400562 <+44>:	cltd   
=> 0x0000000000400563 <+45>:	idiv   %ecx
   0x0000000000400565 <+47>:	mov    %al,-0xd(%rbp)
   0x0000000000400568 <+50>:	mov    $0x0,%eax
   0x000000000040056d <+55>:	pop    %rbp
   0x000000000040056e <+56>:	retq   
End of assembler dump.
(gdb) info registers
rax            0x5	5
rbx            0x0	0
rcx            0x0	0
rdx            0x0	0
rsi            0x7ffee58ad588	140732749501832
rdi            0x1	1
rbp            0x7ffee58ad4a0	0x7ffee58ad4a0
rsp            0x7ffee58ad4a0	0x7ffee58ad4a0
r8             0x4005e0	4195808
r9             0x7fe37847a6d0	140614952265424
r10            0x846	2118
r11            0x7fe3780ea640	140614948529728
r12            0x400440	4195392
r13            0x7ffee58ad580	140732749501824
r14            0x0	0
r15            0x0	0
rip            0x400563	0x400563 
eflags         0x10206	[ PF IF RF ]
cs             0x33	51
ss             0x2b	43
ds             0x0	0
es             0x0	0
fs             0x0	0
gs             0x0	0

使用 gdb 调试, 这是 自动触发的异常断点, 可以看到 情况和上面 coredump 的内容是一致的 

但是这个是 gdb 调试, 但是 一些环境上面是不允许调试的, 因此 可以使用 coredump 的方式, 拿到 coredump, 拿下来线下分析 

37 coredump 的生成和使用_第1张图片

dmesg 中系统日志如下 

[101412.158027] Test07GenCoreDu[38486]: segfault at 5 ip 00007f4062edbcd0 sp 00007fff37004b50 error 4 in libc-2.23.so[7f4062e8d000+1c0000]
[105827.007848] traps: Test07GenCoreDu[39281] trap divide error ip:400563 sp:7fffed673010 error:0 in Test07GenCoreDump[400000+1000]
[105855.994740] traps: Test07GenCoreDu[39284] trap divide error ip:400563 sp:7ffee58ad4a0 error:0 in Test07GenCoreDump[400000+1000]

测试用例2 - 非法地址访问

root@ubuntu:~/Desktop/linux/HelloWorld# cat Test07GenCoreDump.c
#include "stdio.h"
 
int main(int argc, char** argv) {
 
int x = 2;
int y = 3;
int z = x + y;

char* p = (char*) z;
char pValue = *p;

//char divZero = z / 0;

//setenv("name", "jerry");
//char* envName = getenv("name");
//printf(" envName = %s, %s \n", envName, z);

}

root@ubuntu:~/Desktop/linux/HelloWorld# ./Test07GenCoreDump 
Segmentation fault (core dumped)

gdb 调试 coredump 如下, 可以发现异常的地方在于 "char pValue = *p;" 

读取 rax 地址所在的数据, 然后传送给 rax, 但是 rax 为 5, 在当前程序的内存中没有 vma 包含 5, 系统抛出了 segment fault 

root@ubuntu:~/Desktop/linux/HelloWorld# gdb Test07GenCoreDump core 
// ... 
Core was generated by `./Test07GenCoreDump'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000400567 in main ()
(gdb) disassemble 
Dump of assembler code for function main:
   0x0000000000400536 <+0>:	push   %rbp
   0x0000000000400537 <+1>:	mov    %rsp,%rbp
   0x000000000040053a <+4>:	mov    %edi,-0x24(%rbp)
   0x000000000040053d <+7>:	mov    %rsi,-0x30(%rbp)
   0x0000000000400541 <+11>:	movl   $0x2,-0x14(%rbp)
   0x0000000000400548 <+18>:	movl   $0x3,-0x10(%rbp)
   0x000000000040054f <+25>:	mov    -0x14(%rbp),%edx
   0x0000000000400552 <+28>:	mov    -0x10(%rbp),%eax
   0x0000000000400555 <+31>:	add    %edx,%eax
   0x0000000000400557 <+33>:	mov    %eax,-0xc(%rbp)
   0x000000000040055a <+36>:	mov    -0xc(%rbp),%eax
   0x000000000040055d <+39>:	cltq   
   0x000000000040055f <+41>:	mov    %rax,-0x8(%rbp)
   0x0000000000400563 <+45>:	mov    -0x8(%rbp),%rax
=> 0x0000000000400567 <+49>:	movzbl (%rax),%eax
   0x000000000040056a <+52>:	mov    %al,-0x15(%rbp)
   0x000000000040056d <+55>:	mov    $0x0,%eax
   0x0000000000400572 <+60>:	pop    %rbp
   0x0000000000400573 <+61>:	retq   
End of assembler dump.
(gdb) info registers
rax            0x5	5
rbx            0x0	0
rcx            0x0	0
rdx            0x2	2
rsi            0x7fffbfc52468	140736410756200
rdi            0x1	1
rbp            0x7fffbfc52380	0x7fffbfc52380
rsp            0x7fffbfc52380	0x7fffbfc52380
r8             0x4005f0	4195824
r9             0x7f8d550456d0	140244993464016
r10            0x846	2118
r11            0x7f8d54cb5640	140244989728320
r12            0x400440	4195392
r13            0x7fffbfc52460	140736410756192
r14            0x0	0
r15            0x0	0
rip            0x400567	0x400567 
eflags         0x10206	[ PF IF RF ]
cs             0x33	51
ss             0x2b	43
ds             0x0	0
es             0x0	0
fs             0x0	0
gs             0x0	0

gdb 调试也可以看到同样的情况, 异常的地方如下 

37 coredump 的生成和使用_第2张图片

dmesg 中系统日志如下 

[106216.221912] Test07GenCoreDu[39375]: segfault at 5 ip 0000000000400567 sp 00007ffc6c08b1f0 error 4 in Test07GenCoreDump[400000+1000]

完 

你可能感兴趣的:(20,linux,linux,c,coredump)