如何在共享库中的确切行号上设置断点?
Posted
技术标签:
【中文标题】如何在共享库中的确切行号上设置断点?【英文标题】:How do I set a break point on the exact line number in a shared library? 【发布时间】:2012-11-06 08:16:21 【问题描述】:我有一个源文件 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 来说似乎是非法的。
【问题讨论】:
尝试在共享库上使用 b fileName.cpp:lineNumber 而不是使用函数名。它必须打破。然后你可以使用通常的指令集。如果它是共享库,为什么要在函数处设置断点? 感谢您的评论,我这样做的原因是我想节省时间更改共享库中的逻辑而不编译它。 【参考方案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?
【讨论】:
非常感谢您的热心帮助,我被这个陷阱困扰了一整天,您救了我的命。 :)以上是关于如何在共享库中的确切行号上设置断点?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linux 的 QTCreator 中使用 dlopen 打开的共享库中设置断点
matlab编程如何设置断点、如何单步调试、如何提高程序运行速度