呵呵 coredump 之前对于我而言也是一个挺陌生的概念
但是 只从开始了 linux 的相关学习之后, 对于这个 概念也有了一些 理解
呵呵 这里 以一些 简单的例子 来看一下 coredump 的生成和使用
首先执行 "ulimit -c unlimited"
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, 拿下来线下分析
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]
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 调试也可以看到同样的情况, 异常的地方如下
dmesg 中系统日志如下
[106216.221912] Test07GenCoreDu[39375]: segfault at 5 ip 0000000000400567 sp 00007ffc6c08b1f0 error 4 in Test07GenCoreDump[400000+1000]
完