编译选项

在使用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的位置查找动态链接库。