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

标签 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 来说似乎是非法的。

最佳答案

调试共享库,你需要使用

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

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

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

自动设置断点挂起 这是默认行为。当 gdb 找不到断点位置时,它会询问您是否应创建挂起的断点。

设置断点挂起 这表示无法识别的断点位置应自动导致创建挂起的断点。

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

显示断点挂起 显示创建挂起断点的当前行为设置。

回答您的问题。即跳过一行

当您的代码到达该共享库行 (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?

关于c++ - 如何在共享库中的确切行号上设置断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13246975/

相关文章:

c++ - 展开和堵塞对大循环的影响

c++ - GDB 观察实例 vector 中的类成员

c++ - glob 只给出匹配模式的第一个文件

c# - 'ShowSUM' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention

c - 如何在 visual studio 2010 中调试 native dll dllmain

c++ - 具有许可许可的稳健、快速的复杂多边形(带孔)三角剖分 c/c++ 库

c - 当我使用 gdb 调试 C 程序并键入 'p system' 时,我到底得到了什么?

c - 是否可以在 gdb 中确定线程是在内核空间还是用户空间中执行(或阻塞)?

c++ - 您如何使用运算符 | 创建与现有 View 交互的自己的 View ?

c++ - 究竟什么是streambuf?我该如何使用它?