小不点儿

追求卓越,成功便会不期而至

导航

coredump调试积累

core文件生成原理

用户进程出现段错误后(比如访问了非法的内存),会被内核感知到,然后内核会发送SIGSEGV信号给用户进程

  1. 如果用户进程注册了SIGSEGV信号处理函数,则会执行对应的处理函数;比如C语言中可以使用系统函数signal(SIGSEGV, segv_handler)来注册SIGSEGV信号处理函数。程序收到内核发送的SIGSEGV信号时,程序会执行segv_handler函数;
  2. 如果用户进程没有注册SIGSEGV信号处理函数,内核会将用户进程的内存信息保存成core文件,供用户程序的定位分析。等core文件写完后,用户进程才会彻底退出

 core文件都保存哪些信息

  1. 收到的signal,线程的pid,pgrp,ppid等各种数据
  2. 线程的寄存器
  3. 用户进程已分配的内存(根据/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

 

posted on 2023-01-13 15:19  小不点儿  阅读(69)  评论(0编辑  收藏  举报