最近使用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