首页 > 编程知识 正文

linux默认core文件路径,gdb调试core文件详解

时间:2023-05-04 11:05:37 阅读:37570 作者:1808

1 .我之前写的一些最近的模块是使用c/c开发的,但是现在测试环境中出现了偶发的酷睿双核处理器,所以在问题的随访过程中使用了一些方法。 本文重点介绍酷睿文件生成在gdb中配置调试的几种方法。

2. core dump介绍(1)概念程序运行过程中异常退出或崩溃时,操作系统会记录程序当时的内存状态,并保存在一个文件中。 这种行为被称为core dump。

core dump通常被认为是内存快照,但实际上是内存,包括寄存器信息(包括程序指针、堆栈指针等)、内存管理信息以及其他处理器和操作系统的状态和信息

core dump对程序员诊断和调试程序非常有用。 这是因为,与指针异常等某些程序错误难以再现相比,core dump文件可以再现程序错误时的状况。

)发现core dump文件生成对于程序的异常结束,如果实际使用kill -9 xxx的指令,则不会生成core文件。 以下有几个信号让系统生成核心dump的系统信号。

ignalactioncommentsigquitcorequitfromkeyboardsigillcoreillegalinstructionsigabrtcoreabortsignalfromabortsigsegvcoreinvalidmemom 吐酷过程的内存容量越大,该过程可能持续的时间越长。 如果进程占用的内存超过60G,则整个酷睿文件需要15分钟才能完全写入磁盘。

本文主要介绍一些基本情况,关于酷睿双核处理器的更详细发生情况,可以在文末参考资料中找到,在此有详细介绍。

)3)生成core dump配置文件一般情况下,系统可以使用ulimitc命令查看core dump生成的文件大小,如果为0,则不生成core dump,需要修改和配置。

ulimit -c unlimited可以生成coredump,没有大小限制。 设定仅目前有效。

持久配置方法要求将ulimit -c unlimited命令添加到/etc/profile中,以允许生成core dump文件。

修改core dump生成路径默认情况下,core dump生成在程序的工作目录中,在某些情况下,为了方便起见,您可以调整默认路径,请参考所需的内容。

只需创建/coredump文件夹并调用以下命令:

echo/core dump/core.% e.% p/proc/sys/kernel/core _ pattern

其中%e表示程序名称,%p表示进程id。

3. GDB调试(1)基本概念gdb是在GNU开源组织公开的UNIX/LINUX操作系统下基于命令行的强大的程序调试工具。 对于在Linux上工作的c/c程序员来说,gdb是不可缺少的工具。

关于GDB的详细使用方法,文末也引用了更详细的报道,请参考。

)调试实战本介绍默认情况下,大家已经了解了在linux上编译文件的情况。 我们在编译时,根据是否需要调试,我写的模块异常挂起,为了快速识别问题,我们添加-g命令进行编译。 添加-g后,可以在程序core dump之后查看更详细的堆栈信息。

我写的模块装载在其他程序中,但是如果生成了酷睿文件,就不会影响问题的排除。 首先,进入挂起的可执行程序目录,找到对应的core文件。

运行了gdb xxx.so core.xxx命令,以加载程序锁定的内存和其他信息。

[ threaddebuggingusinglibthread _ db enabled ] usinghostlibthread _ db library '/lib 64/lib thread _ db.so.1 '.core ware free switch-NC-nf-nonat '.programterminatedwithsignal 8, arithmetic exception.# 00x 0007 f 09e 0619 binonsentenceer CB param=0x 7f 0f 08 FD 3020 (atmod _ ASR.CPP 3360331331 int volume _ avg tmp param-1缺少隔离调试信息,use :调试信息安装周期- sasl-Li B-2.1. 26-23.el7.x86 _ 64 FLAC--

4 glibc-2.17-292.el7.x86_64 gsm-1.0.13-11.el7.x86_64 jbigkit-libs-2.0-11.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_7.2.x86_64 lame-libs-3.100-1.el7.x86_64 libcom_err-1.42.9-16.el7.x86_64 libedit-3.0-12.20121213cvs.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libjpeg-turbo-1.2.90-8.el7.x86_64 libogg-1.3.0-7.el7.x86_64 libselinux-2.5-14.1.el7.x86_64 libshout-2.2.2-11.el7.x86_64 libsndfile-1.0.25-10.el7.x86_64 libstdc++-4.8.5-39.el7.x86_64 libtheora-1.1.1-8.el7.x86_64 libtiff-4.0.3-32.el7.x86_64 libtool-ltdl-2.4.2-22.el7_3.x86_64 libvorbis-1.3.3-8.el7.1.x86_64 lua-5.1.4-15.el7.x86_64 mpg123-libs-1.25.6-1.el7.x86_64 ncurses-libs-5.9-14.20130511.el7_4.x86_64 nspr-4.21.0-1.el7.x86_64 nss-3.44.0-7.el7_7.x86_64 nss-softokn-freebl-3.44.0-8.el7_7.x86_64 nss-util-3.44.0-4.el7_7.x86_64 openldap-2.4.44-21.el7_6.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 postgresql-libs-9.2.24-2.el7_7.x86_64 speex-1.2-0.19.rc1.el7.x86_64 sqlite-3.7.17-8.el7_7.1.x86_64

  进入调试模式后,使用bt查看堆栈信息:

unixODBC-2.3.1-14.el7.x86_64 xz-libs-5.2.2-1.el7.x86_64 zlib-1.2.7-18.el7.x86_64(gdb) bt#0 0x00007f0f09e0619b in onSentenceEnd (cbEvent=0x7f0f08dcd810, cbParam=0x7f0f08fd3020) at mod_asr.cpp:331#1 0x00007f0f09b1cff9 in AlibabaNls::SpeechTranscriberListener::handlerFrame(AlibabaNls::NlsEvent) () from /usr/local/freeswitch/lib/libnlsCppSdk.so#2 0x00007f0f09b03b9c in AlibabaNls::NlsSessionBase::handlerFrame(AlibabaNls::util::WebsocketFrame) () from /usr/local/freeswitch/lib/libnlsCppSdk.so#3 0x00007f0f09b0dba7 in AlibabaNls::transport::engine::webSocketAgent::workloop() () from /usr/local/freeswitch/lib/libnlsCppSdk.so#4 0x00007f0f09b0cc70 in AlibabaNls::transport::engine::thread_func(void*) () from /usr/local/freeswitch/lib/libnlsCppSdk.so#5 0x00007f0f9b121e65 in start_thread () from /lib64/libpthread.so.0#6 0x00007f0f9a77588d in clone () from /lib64/libc.so.6

  由于我在模块编译过程中加入了-g所以能够直接定位到代码行级别的问题,后来查看自己的源码发现,在极端情况下,确实会出现分母为0的情况,导致Segmentation fault,前几天还在提醒同事分母不能为0,自己却遗漏了,实在是疏忽大意。

参考资料

Linux Core Dump

linux下gdb调试方法与技巧整理

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。