1

我有一个源文件 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 来说似乎是非法的。

4

1 回答 1

2

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

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

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

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

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

set breakpoint pending on 这表明一个无法识别的断点位置应该会自动导致一个挂起的断点被创建。

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

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

来回答你的问题。即跳线

jump +1当您的代码到达该共享库行(skip_me())之前时使用。

参考

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

gdb:如何使用 --command 标志在未来的共享库上设置断点

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

我可以使用 gdb 跳过一行吗?

于 2012-11-06T10:16:15.427 回答