您的位置:首页 > 其它

用gdb工具分析core文件

2009-09-21 20:12 405 查看
在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]#

首先利用file core.19344命令可以得到:

core.19344: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from 'cmm_test_tool'

可以看出core.19344是由cmm_test_tool这个工程产生。

接着就可以利用命令gdb进行查找,格式为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)

最后一个步骤是输入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行,基于此,我们就可以有针对性的找到问题的根源,并加以解决。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: