如何在共享库中的确切行号上设置断点?

时间:2012-11-06 08:16:22

标签: c++ c gdb

我有一个源文件shared_lib_test.c,其中有一些代码如下:

10 void test_function(void)
11 {
12    do_me();
13    skip_me();
14    return;
15 }

我想使用gdb跳过第13行,我该怎么做?此函数属于共享库,而不是二进制文件。

如果此函数属于二进制文件,那么我可以使用以下命令来执行此操作:

b shared_lib_test.c:13
commands 1
jump 14
continue
end

但由于它属于共享库,我无法在源文件的确切行号上设置断点,我尝试了'b test_function +2'但gdb似乎是非法的。

1 个答案:

答案 0 :(得分:1)

对于调试共享库,您需要使用

set breakpoint pending - 设置调试器关于挂起断点的行为。

在共享库中有一个断点是很常见的。在执行程序时,可以显式地并且可能重复地加载和卸载共享库。为了支持此用例,每当加载或卸载任何共享库时,gdb都会更新断点位置。通常,您将在调试会话开始时,未加载库时以及库中的符号不​​可用时在共享库中设置断点。当您尝试设置断点时,gdb将询问您是否要设置所谓的挂起断点 - 断点,其地址尚未解析。

gdb提供了一些额外的命令来控制当`break'命令无法解析地址的断点地址规范时会发生什么:

set breakpoint pending auto     这是默认行为。当gdb找不到断点位置时,它会查询是否应该创建挂起的断点。

set breakpoint pending on     这表示无法识别的断点位置应自动导致正在创建挂起的断点。

set breakpoint pending off     这表示不创建挂起的断点。任何无法识别的断点位置都会导致错误。此设置不会影响先前创建的任何挂起断点。

show breakpoint pending     显示用于创建挂起断点的当前行为设置。

来到你​​的问题。即跳过一行

当代码到达共享库行(skip_me())之前,

使用jump +1

<强>参考

http://wiki.documentfoundation.org/Development/How_to_debug

gdb: how to set breakpoints on future shared libraries with a --command flag

http://bhushanverma.blogspot.in/2009/08/how-to-debug-shared-library-using-gdb.html

http://www.toptip.ca/2010/06/gdb-skip-instructions-or-lines-while.html

Can I use gdb to skip a line?