日期:2014-05-16  浏览次数:20464 次

GDB调试实践二(gdb找不到动态库,对运行中的进程生成core文件)

最近使用GDB调试程序的一点经验之谈:

1、程序运行中生成一个Core文件便于保护现场,调试程序,gcore可以满足这种需求:

gcore:对正在运行的进程生成一个内存转储文件,方便保护现场。例如:

–???? gcore -s -c test.core pid

–???? 用-s选项使进程在转储过程中处于停止状态,可以保证转储文件的一致性。若不用-c选项指定转储文件名,则会使用默认的core.pid形式的文件名。

?

2、我的linux虚拟机中调试程序时,发现直接run程序没问题,但gdb调试的时候就提示找不到某个动态库

原因如下:

1)我的虚拟机里同一个用户下由于要编译测试多个不同版本的代码,而每个版本都有不同的运行环境(如:PATH、LD_LIBRARY_PATH等环境变量设置)

2)我目前使用csh,为了快速切换不同的编译环境,我把运行环境所需的环境变量写到不同的.cshrc脚本中,需要切换时运行source .cshrc_XXX

3) GDB调试程序时会启一个新的shell,而且新shell启动时使用默认的.cshrc脚本,从而导致上述的问题,从本质上来说GDB使用的shell的环境非我们要调试程序所需的shell环境设置

?

解决方法:

1)最简单:将所有动态库的查找位置都设置到默认.cshrc中的LD_LIBRARY_PATH的环境变量中

2)其他方法有待探索

?

下面转载一篇不错的gdb总结

gdb基本用法

????????? 调用方式:gdb program [corefile|pid]

????????? 基本命令:

–???? r(un) [shell args]:开始运行程序。后面可跟传给被调试程序的命令行参数。

–???? s(tep) [N]:单步运行程序,进入函数调用。

–???? n(ext) [N]:单步运行程序,不进入函数调用。

–???? b(reak) [LOCATION]:设置断点。断点位置可以用如下形式表示:

????????? LINENUM???? 位置为当前源码文件的特定行号

????????? FILE:LINENUM??? 位置为指定源码文件的特定行号

????????? FUNCTION?? 位置为特定函数入口

????????? FILE:FUNCTION 位置为指定源码文件中的特定函数入口。主要用于存在多个同名的静态函数的情况下。

????????? *ADDRESS?? 位置为指定的地址

–???? c(ontinue) [N]:从之前中断的位置继续运行程序。

–???? sta(rt) [shell args]:同run命令类似,但自动停止在main函数入口处,比break+run更方便。

–???? l(ist) [LOC1[,[LOC2]]:显示源码文件内容。例如:

????????? l func,main

????????? l 10,*0x40107d

????????? l main,

????????? l ,func