当前位置: 首页 > 科技观察

Linux下调试coredump方法总结,工作必备技能

时间:2023-03-18 01:24:06 科技观察

源于调试,调试是开发过程中非常重要的一个环节。每个程序员都应该具备调试代码的能力,尤其是对于在Linux下从事开发的读者。从事linux下的后台开发,有时候程序突然崩溃,而且没有日志,会让你无所适从。今天给大家介绍一个core文件。通过这个文件,我们可以找出错误对应的代码行。是不是很神奇?透过树荫看着朦胧的阳光,晒着太阳,感觉还不错。先说完这篇文章,再去赏景吧。什么是coredump一个程序,在运行过程中,在一定条件下,由于各种异常或bug,会产生一个名为core的文件。通常,核心文件会包含程序运行时的内存、寄存器状态、堆栈指针、内存管理信息和各种函数调用堆栈信息。当很多程序出错时,会生成一个core文件。通过工具分析这个文件,我们可以定位到程序异常退出时对应的栈调用等信息。打开核心转储开关:ulimit-cunlimited看一段有问题的代码:#includeintmain(){int*p=NULL;*p=0;printf("bad\n");return0;}linux下编译执行:[root@VM-16-9-centosc++]#g++-gmain.cpp[root@VM-16-9-centosc++]#./a.outSegmentationfault(coredumped)[root@VM-16-9-centosc++]#lsa.outcore.1989main.cpp以上代码乍一看有错误,执行时会产生coredump。但在大型项目中,肉眼很难看到。下面介绍如何在linux下调试coredump。dmesg+addr2line调试首先介绍2个linux命令:dmesg,一个用来检测和控制内核缓冲的程序。该程序用于帮助用户了解系统启动信息和获取错误堆栈地址。addr2line,一种可以将指令和可执行映像的地址转换为文件名、函数名或源代码的工具。此功能对于将跟踪地址转换为更有意义的内容很有用。调用addr2line工具时,使用-e选项指定可执行映像,使用-f选项告诉工具输出函数名。Linux下的操作过程:[root@vm-16-9-centosc++]#dmesg|grepa.out[212.330289]A.Out[1946]:segfaultAtAtataT0000000000000400400400400400400400571Sp0000000077FFD0AAFBB0AFBB0AFBBBB0ERROR6INA.OUT[400000+1000+1000.27.43705][227.443705.27.27.44370.27.27.44370.27.27.27.4370aft400000+1000][root@VM-16-9-centosc++]#[root@VM-16-9-centosc++]#addr2line-ea.out0000000000400571/root/c++/maind.cpp:找到错误对应的地址,然后使用addr2line-e将地址解析为相应的代码行。gdb调试gdb想必大家都听说过,它是Linux下常用的调试工具。gdb编译器通常以gdb命令的形式在终端中使用。让我们学习常见的调试选项。bt:查看栈信息ilocals:查看当前程序栈的局部变量iargs:查看当前程序栈的参数icatch:查看当前程序栈帧的异常处理程序pa:打印值i注册的变量:检查当前寄存器的值r:从程序运行到第一个断点,如果没有断点,就一直运行下去。quit:退出gdb调试过程,输入r,bt。r是运行a.out文件,bt是查看堆栈情况。我们不需要执行gdba.out,相当于重新运行a.out文件。但是在实际开发中,很多问题的发生都是概率性的,所以这种方法实用性不是很高。linux下运行过程(省略部分gdb介绍信息):[root@VM-16-9-centosc++]#gdba.outcore.1989Readingsymbolsfrom/root/c++/a.out...done.[NewLWP1989]bCorewasgeneratedby`。/a.out'.Programterminatedwithsignal11,Segmentationfault.#00x0000000000400571inmain()atmain.cpp:66*p=0;Missingseparateddebuginfos,use:debuginfo-installglibc-2.17-307.el7.1.x86_64libgcc-4.8.5-44.el7。el7。4.8.5-44.el7.x86_64(gdb)bt#00x0000000000400571inmain()atmain.cpp:6(gdb)不使用r命令,直接执行gdba.outcore.1989,避免程序重复执行。使用bt命令,可以看到程序的错误行。strace+addr2line调试strace是一个集诊断、调试、统计为一体的工具。我们可以使用strace来分析应用程序的系统调用和信号传输跟踪结果来解决问题或了解应用程序。工作过程的目的。strace的简单用法就是执行一个指定的命令,指定的命令结束后会退出。命令执行过程中,strace会记录并分析命令进程的所有系统调用,以及该进程接收到的所有信号值。-c,统计每次系统调用的执行时间、次数、错误等。-p,指定进程pid-i,输出系统调用的入口指针。linux下运行过程(省略部分加载信息):[root@VM-16-9-centosc++]#strace-i./a.out[00007f79d3573847]munmap(0x7f79d3772000,31038)=0[0000000000400571]---SIGSEGV{si_signo=SIGSEGV,si_code=SEGV_MAPERR,si_addr=NULL}---[?????????????????]+++被SIGSEGV杀死(核心转储)+++分段错误[root@VM-16-9-centosc++]#addr2line-ea.out0000000000400571/root/c++/main.cpp:6叙事linux调试技巧很重要,平时用的很多,掌握这些才是关键。通过这篇文章,希望读者能够对coredump调试有一个大概的了解。