用gdb工具分析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行,基于此,我们就可以有针对性的找到问题的根源,并加以解决。

使用 GDB 工具对 MySQL core 文件进行分析和调试的步骤如下: 1.获取 MySQL core 文件:在 MySQL 出现异常时,MySQL 会生成一个 core 文件,用于记录程序崩溃时的内存状态。从产生 core 文件的服务器上,将 core 文件下载到分析工具所在的机器上。 2.安装 GDBGDB 工具Linux 下的一款调试工具,需要进行安装。如果未安装可以通过以下命令进行安装: ``` yum install gdb ``` 3.开启 core 文件的调试:默认情况下,Linux 禁止 core 文件的调试,需要手动进行开启。在 shell 终端中,执行以下命令: ``` ulimit -c unlimited ``` 4.使用 GDB 配置文件:为了方便进行调试,可以使用 GDB 的配置文件自动加载调试信息。在命令行中输入以下命令: ``` echo "set auto-load safe-path /" > ~/.gdbinit ``` 5.启动 GDB 调试:在命令行中输入以下命令启动 GDB 调试: ``` gdb /usr/sbin/mysqld /path/to/core ``` 其中,/usr/sbin/mysqld 是 MySQL 的可执行文件路径;/path/to/core 是 MySQL 生成的 core 文件路径。 6.分析 MySQL core 文件:在 GDB 调试模式下,可以使用一系列命令查看和分析 MySQL core 文件中的数据和信息。例如: ``` bt: 显示运行到崩溃点时的函数调用栈 info registers: 显示当前 CPU 寄存器的值 x/20x $rsp: 显示当前栈帧的堆栈信息 ``` 通过以上步骤,可以使用 GDB 工具对 MySQL core 文件进行分析和调试,更好地定位 MySQL 程序的异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值