Linux进程崩溃原调试

简介


每个开发服务主程的同学可能都有进程崩溃的经历,这时候就要了解点Linux下进程调试方法了。

以下信息都有助于调试:

  • 良好的程序编码,有日志记录
  • 崩溃时产生了core文件
  • 通过dmesg查看内核日志信息

调试进程崩溃的方法有很多,可以根据具体需求使用。

调试


一般的调试流程,先从容易获取的信息入手,直到找到原因为止。

  1. 进程日志
  • 在程序开发中,肯定会记录一些日志,而日志记录的好坏可以直接影响调试,进而影响程序的发布进程。
  • 目前有很多的开源日志库,选择合适的即可。如log4cplus等。
  • 日志等级较多时,一般在运行时,只记录WARN级别以上信息,如果有实时调整日志级别,将非常有助于定位问题。
    • 实时打开DEBUG级别日志,能详细跟踪程序流程
    • 如果不能实时调整,只能重启的方式,这时bug可能不易复现
  • 日志的记录也是需要特别注意的,这里不展开讲,因为没有统一的标准,大家可以多参考开源及网上经验总结,再结合实际应用到自己的项目中。
  1. core文件
  • 生产环境可能不会产生core文件,这时日志的记录就尤其重要了。
  • 测试环境建议先打开内核转储:ulimit -c unlimited,或者调试到配置里,不用每次开个终端都要设置一遍。
  • 注意,core文件与编译时的-g选项结合使用,且编译时不要加-O2,否则gdb会看不到调试信息。
  • 使用gdb -c core a.out调试,bt打印崩溃时的栈信息,基本可以发现出问题的代码行
  • 更多gdb的命令可以查看相关man page,基本介绍可以参考内核转储-coredump简介。
  1. demsg
  • 打印内核日志信息
  • 系统级别相关的信息会存储在此处,如进程异常崩溃退出等,也会有记录
  • 当一个进程使用的内存较大时,会被操作系统kill掉,这样的信息就会记录在dmesg中,如
[1892837.939243] Out of memory: Kill process 10735 (oomServer) score 952 or sacrifice child
  • 根据进程异常崩溃信息,可以反推崩溃位置
[5596955.061423] traps: TrapServer[32530] trap divide error ip:4bb78a sp:7ff530ff7230 error:0 in TrapServer[400000+251000]
  • 根据ip位置,使用addr2line -e TrapServer 4bb78a可打印进程的行号
  1. gdb
  • 已经介绍过的gdb结合core文件
  • 另外gdb可跟踪运行中的程序,使用attach pid命令可直接attach到进程或者线程,bt查看其运行的栈信息,这种方式容易定位死锁的进程
  1. strace
  • 'strace -p pid’即可打印出进程的系统调用信息,包括参数,返回值等
  • 它还能调试进程接收到的信号情况
  • 频繁地系统调用会影响性能,这个命令可以用来调试性能及bug

小结


作为一名程序员,写bug是不可避免的。

解决bug也是不可避免的。方法有千万种,选择最合适的就好。

你可能感兴趣的:(Linux基础学习,崩溃,调试)