编译选项
在使用gdb进行调试之前,必须保证编译的可执行程序和想要调试的动态库编译包含了-g选项。这里还有一个坑,有时候我们虽然指定-g进行了编译,但是编译完成后又使用strip命令去除了调试信息,那么最终的程序和库也是没有调试信息的。此时也是无法进行gdb调试的。
gdb调试命令
当使用gdb运行时,要执行如下命令:
gdb test
此命令会运行一个名为test的可执行程序,如果库能够在运行时找到,那么自然gdb是可以直接跳进动态库进行调试的,此时和调试一个普通的可执行程序没有差异。
如果我们想要跳转到函数中需要执行如下s单步命令:
b:设置断点
n:单步运行(不跳入函数)
s:单步运行(跳入函数)
以上都是在理想的情况下我们可以完美的调试自己的程序,下面介绍一些高级功能:首先如果动态库不是在本机编译的,此种情况可能会导致gdb无法找到source code的位置,也就是无法查看函数的运行情况。一般默认情况下,一个程序在本机编译时就会把source code的绝对路径存放其中,这样gdb加载时自然是知道去何处加载source code用于调试,但是一个从其他机器编译完成的库该如何去加载source code呢?下面就介绍一下关于source code的命令,首先我们可以利用下面命令来查看gdb查找source code的路径。
(gdb) show dir
Source directories searched: /home/xiehaocheng/work/libmini-ipc:$cdir:$cwd
如果从其他地方拷贝过来的library,我们可以设置gdb查找源码的路径为本机上的路径:
(gdb) dir /home/xiehaocheng/work
Source directories searched: /home/xiehaocheng/work:/home/work:/home/work/sourcecode:/home/xiehaocheng/work/libmini-ipc:$cdir:$cwd
当使用dir命令时会自动添加一个source code搜索路径,多次执行可以添加多个路径,这样就可以正常进行调试了。
gdb配置文件
除了直接使用上述命令进行gdb调试之外,这里再介绍一种通过config文件进行调试的方法。比如本例:
file /home/xiehaocheng/work/libmini-ipc/test/ipclib_test
set solib-absolute-prefix /home/xiehaocheng/work/libmini-ipc/test/
set solib-search-path /home/xiehaocheng/work/libmini-ipc/test/
dir /home/xiehaocheng/work/libmini-ipc
- file
设置要要调试的可执行程序
- dir
设置该程序对应的代码目录
- solib-absolute-prefix
配置一个库搜索的前缀,我们需要在该目录中按照target板中的路径来放置需要的库。相当于rootdir,我们可以执行set sysroot来替代该环境变量的设置。
- solib-search-path
这个环境变量也是为了gdb查找so库的,它是在solib-absolute-prefix搜索库失败之后才会去搜索的目录,加入我们想要用此环境变量的话,那么我们要把上面的solib-absolute-prefix配置为一个无效的路径,防止gdb去找host系统中安装的lib,这不是我们想要的,因为我们要调试的是target lib。
把上述内容写入gdb.config文件,然后执行:
gdb -x gdb.config
会自动运行调试程序,并且从solib-absolute-prefix和solib-search-path的位置查找动态链接库。