Linux core dump文件生成与使用
一、说明
在前一家公司经常测出一些缓冲区溢出导致进程挂掉的问题,开发经常要求在调试模式进行测试,生成core文件给他们定位问题。
当时的调试模式启动只是修改某些配置文件重新启动即可,所以在很长一段时间内并不知道到底要如何生成core文件及core文件如何使用。
二、配置允许生成core文件
临时配置使用ulimit命令进行操作即可:
# 查看当前用户core文件配置情况 # 0表示允许core文件大小为0,亦即不允许生成 ulimit -c # 限制core文件大小 # 禁止生成core文件 ulmit -c 0 # 限制core文件大小100块 ulimit -c 100 # 不限制core文件大小 ulimit -c unlimited
要永久生效则修改配置文件/etc/security/limits.conf,使用类似如下形式进行配置:
* soft core unlimited
三、直接的core文件生成
3.1 通过kill触发生成
# 查看当前core文件大小限制
ulimit -c
# 设置成不限制大小
ulimit -c unlimited
# 再次查看core文件大小限制
ulimit -c
# 新启动一个bash进程
bash
# 查看当前bash的pid
echo $$
# 将该进程kill掉,触发core文件生成
kill -s SIGSEGV $$
# 确认core文件确实已经生成
ll
使用gdb查看core文件即可定位到出错行,如下图。
3.2 使用gdb直接生成
# 查看当前bash的pid echo $$ # 通过pid进行gdb调试。为了通用性这里直接使用$$ gdb -p $$ # 生成core文件。在gdb内部输入 generate-core-file # 退出gdb。在gdb内部输入 quit # 确认退出gdb。在gdb内部输入 y # 确认当前目录下有core文件生成 ls -l | grep $$
3.3 使用gcore生成
# 直接生成当前bash进程的core文件 gcore $$ # 确认core文件已在当前目录下生成 ls -l | grep $$
四、真实场景中的gdb core查看
4.1 程序环境准备
以下代码是while循环中,不断提示用户输入被除数和除数,然后给出计算结果。将其保存为test.c:
#include <stdio.h> void exec_divise() { printf("please input dividend:"); int dividend; scanf("%d", ÷nd); printf("please input divisor:"); int divisor; scanf("%d", &divisor); int result = dividend/divisor; printf("%d / %d result is: %d\n\n",dividend,divisor,result); } void main() { printf("program start...\n"); while(1){ exec_divise(); } printf("program finished.\n"); }
编译并运行程序:
# 设置core文件大小限制 ulimit -c unlimited # 编译文件。不带-g参数,core只能显示core的函数栈,不能显示具体源代码行 gcc test.c -o test # 带-g将源代码附加到生成的二进制文件中,core能显示到具体源代码行 # gcc test.c -o test -g # 查看当前文件 ls -l # 执行程序触发生成core文件 ./test
4.2 gdb attch直接调试进程
另打开一个窗口,找到运行起来的进程pid,然后使用gdb attch pid加载调试程序,然后使用c运行程序
c表示运行至下一断点,断点的本质是一个异常; 我们这里没设断点,所以程序会一直运行,直到异常(coredump)产生。
我们被除数和除数输入正常数值,可以看到gdb侧无反应(因为c)
然后我们输入除数为0,引发异常,可以看到程序卡住,gdb窗口有输出
切至gdb窗口,可以看到提示在exec_divise()函数中产生了异常; 使用bt我们可以看到调用栈是:main() -> exec_divise()。
4.3 gdb加载查看core文件
和上一节一样使除数为0产生core文件。
然后使用gdb exec_obj core_file加载core文件,然后一样使用bt查看core时的调用堆栈即可。
(但实测看只有带-g参数编译方式才能正常查看堆栈,不然总报Cannot access memory at address,什么都看不到。)
参考:
https://linux-audit.com/understand-and-configure-core-dumps-work-on-linux/