如何查看core文件

在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的,本文对此做简单介绍。

例如,一个程序cmm_test_tool在运行的时候发生了错误,并生成了一个core文件,如下:

-rw-r–r– 1 root cmm_test_tool.c
-rw-r–r– 1 root cmm_test_tool.o
-rwxr-xr-x 1 root cmm_test_tool
-rw——- 1 root core.19344
-rw——- 1 root core.19351
-rw-r–r– 1 root cmm_test_tool.cfg
-rw-r–r– 1 root cmm_test_tool.res
-rw-r–r– 1 root cmm_test_tool.log
[root@AUTOTEST_SIM2 mam2cm]#

就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件,运行
gdb cmm_test_tool core.19344结果如下:

[root@AUTOTEST_SIM2 mam2cm]# gdb cmm_test_tool core.19344
GNU gdb Red Hat Linux (5.2.1-4)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux”…
Core was generated by `./cmm_test_tool’.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/i686/libpthread.so.0…done.
Loaded symbols for /lib/i686/libpthread.so.0
Reading symbols from /lib/i686/libm.so.6…done.
Loaded symbols for /lib/i686/libm.so.6
Reading symbols from /usr/lib/libz.so.1…done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /usr/lib/libstdc++.so.5…done.
Loaded symbols for /usr/lib/libstdc++.so.5
Reading symbols from /lib/i686/libc.so.6…done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/libgcc_s.so.1…done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/ld-linux.so.2…done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2…done.
Loaded symbols for /lib/libnss_files.so.2
#0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
(gdb)

进入gdb提示符,输入where,找到错误发生的位置和堆栈,如下:

(gdb) where
#0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
#1 0×4202d4e7 in strtoul () from /lib/i686/libc.so.6
#2 0×0804b4da in GetMaxIDFromDB (get_type=2, max_id=0×806fd20) at cmm_test_tool.c:788
#3 0×0804b9d7 in ConstrctVODProgram (vod_program=0×40345bdc) at cmm_test_tool.c:946
#4 0×0804a2f4 in TVRequestThread (arg=0×0) at cmm_test_tool.c:372
#5 0×40021941 in pthread_start_thread () from /lib/i686/libpthread.so.0
(gdb)

至此,可以看出文件出错的位置是函数 GetMaxIDFromDB ,两个参数分别是2和0×806fd20,这个函数位于源代码的788行,基于此,我们就可以有针对性的找到问题的根源,并加以解决。

 
Linux 系统中,core 文件是程序崩溃时由操作系统生成的内存快照文件。通过分析 core 文件,可以定位导致程序崩溃的具体原因。以下是查看和分析 core 文件的详细方法。 ### 配置 core 文件的生成路径与格式 为了方便管理 core 文件并识别其来源,可以通过修改 `/proc/sys/kernel/core_pattern` 来设置 core 文件的命名格式及保存路径。例如: ```bash sudo sh -c "echo '/data/coredump/core_$(date +%Y-%m-%d_%H-%M-%S)-%p.dump' > /proc/sys/kernel/core_pattern" ``` 其中: - `%p` 表示进程 PID; - `$(date ...)` 用于插入当前时间戳; - `/data/coredump/` 是指定的 core 文件存储目录 [^1]。 确保该目录存在,并具有写入权限。 ### 编译程序时包含调试信息 要有效分析 core 文件,必须在编译程序时添加 `-g` 选项以包含调试信息: ```bash gcc -g -o my_program my_program.c ``` 这样 GDB 可以解析源代码级别的堆栈信息 [^2]。 ### 使用 GDB 分析 core 文件 GDB(GNU Debugger)是分析 core 文件的主要工具。使用以下命令加载程序和 core 文件: ```bash gdb ./my_program /path/to/core_file ``` 进入 GDB 后,可以执行以下常用命令进行分析: #### 查看崩溃时的堆栈跟踪 ```gdb (gdb) bt #0 0x000055555555467a in function_b () at example.c:5 #1 0x000055555555469c in function_a () at example.c:9 #2 0x00005555555546aa in main () at example.c:13 ``` 该命令显示了程序崩溃时的调用堆栈,有助于定位具体出错的位置 [^4]。 #### 查看寄存器状态 ```gdb (gdb) info registers ``` 这将显示崩溃时 CPU 寄存器的状态,包括指令指针、堆栈指针等关键信息。 #### 查看内存内容 可以使用 `x` 命令查看特定地址的内存内容: ```gdb (gdb) x/10xw 0x7fffffffd000 ``` 上述命令将从地址 `0x7fffffffd000` 开始查看 10 个字(word)的内存内容。 ### 其他注意事项 - 确保系统允许生成 core 文件,可通过 `ulimit -c` 设置 core 文件大小限制。 - 若程序为多线程或涉及动态链接库,GDB 也能支持相应的分析功能。 - 在某些情况下,可结合 `addr2line` 工具将地址转换为源代码行号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值