通过gdb core dump方法查看程序异常时的堆栈信息 您所在的位置:网站首页 如何查看一个exe文件的代码信息 通过gdb core dump方法查看程序异常时的堆栈信息

通过gdb core dump方法查看程序异常时的堆栈信息

2023-07-18 19:45| 来源: 网络整理| 查看: 265

在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。core dump叫做核心转储,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个core文件里,叫core dump。core文件是程序非法执行后core dump后产生的文件,该文件是二进制文件,可以使用gdb、elfdump、objdump打开分析里面的具体内容。

产生core dump的可能原因:(1). 内存访问越界;(2). 多线程程序使用了线程不安全的函数;(3). 多线程读写的数据未加锁保护;(4). 非法指针;(5). 堆栈溢出。

查看操作系统是否开启产生core文件:输入命令:ulimit -c或ulimit -a, core file size为0,说明系统关闭了core dump,可通过命令:ulimit -c unlimited来打开,结果如下图所示,注:此设置只对当前终端有效,再打开一个新的终端时,输入ulimit -a,会发现core file size还是为0,若想始终有效,可在~/.bashrc文件最后加入命令:ulimit -c unlimited:

在Linux下执行程序时如果有提示”core dumped”信息,则会在当前目录下产生一个core文件,若没有产生,则可能core dump没有打开。缺省情况下,内核在core dump时所产生的core文件放在与执行程序相同的目录中,并且文件名固定为core,执行以下命令,可以将文件名修改为core.pid等形式,pid为执行当前程序的进程号,core_uses_pid中原始内容为0:

echo "1" > /proc/sys/kernel/core_uses_pid

测试代码main.cpp如下:

#include #include namespace { void func() { const char* p = "hello"; delete p; } } // namespace int main() { fprintf(stdout, "test start\n"); func(); fprintf(stdout, "test finish\n"); }

依次执行如下命令,执行结果如下图所示,会在执行文件同一目录下产生core二进制文件:

g++ -g -o main main.cpp ./main

如果有多个程序产生core文件,或者同一个程序多次崩溃,就会重复覆盖同一个core文件。通过修改kernel参数,可以指定内核所生成的core dump文件的文件名,如设置core文件名形式为core_programname_time_pid,所有的core文件存放在/usr/core_log目录下,则在终端输入以下命令:

echo /usr/core_log/core_%e_%t_%p >> /proc/sys/kernel/core_pattern

通过gdb打开core文件:形式如下:$ gdb programname core,查看core dump时的堆栈信息,可以使用bt或where命令,如下图所示,注:在编译程序时加上-g选项才能够获取到具体的信息:

通过gdb help generate-core-file产生core文件,依次执行如下命令,执行结果如下图所示,产生的core.pid好像不如上面方法产生的core文件信息详细:

gdb main help generate-core-file start generate-core-file

以上内容主要参考:

1. https://blog.csdn.net/u014403008/article/details/54174109

2. https://blog.csdn.net/ithomer/article/details/5945152

GitHub:https://github.com//fengbingchun/Messy_Test



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有