coredump调试积累
core文件生成原理
用户进程出现段错误后(比如访问了非法的内存),会被内核感知到,然后内核会发送SIGSEGV信号给用户进程
- 如果用户进程注册了SIGSEGV信号处理函数,则会执行对应的处理函数;比如C语言中可以使用系统函数signal(SIGSEGV, segv_handler)来注册SIGSEGV信号处理函数。程序收到内核发送的SIGSEGV信号时,程序会执行segv_handler函数;
- 如果用户进程没有注册SIGSEGV信号处理函数,内核会将用户进程的内存信息保存成core文件,供用户程序的定位分析。等core文件写完后,用户进程才会彻底退出
core文件都保存哪些信息
- 收到的signal,线程的pid,pgrp,ppid等各种数据
- 线程的寄存器
- 用户进程已分配的内存(根据/proc/pdi/coredump_filter配置确定保存哪些)
没有core文件如何调试
系统中的任何程序收到SIGSEGV都会记录在内核日志中
dmesg -T
[Mon Jul 11 15:51:08 2022] ctest[9040]: segfault at 0 ip 0000000000401162 sp 00007ffcc0d3a0a0 error 6 in ctest[401000+1000]
这条日志的含义:
9040:进程号
segfault:错误名称
ip 0000000000401162:instruction pointer就是代码执行位置的指针
sp 00007ffcc0d3a0a0:程序执行栈指针
error 6:Architecture-specific flags; see arch/*/mm/fault.c for your platform.
最后的error 6是按二进制来使用的,含义需要找对应平台的fault.c中具体查询。
我们关心的只是程序运行到哪里报错了,所以只需要关注ip 0000000000401162
$ addr2line -e ./ctest 0000000000401162
/tmp/ctest.c:14
可以看到程序在执行14行的时候,收到内核的SIGSEGV
参考链接
https://blog.csdn.net/_xiao/article/details/22389997
https://blog.csdn.net/Longyu_wlz/article/details/106677213
https://blog.csdn.net/jackgo73/article/details/125723241