在 gdb 脚本中设置断点的问题

Posted

技术标签:

【中文标题】在 gdb 脚本中设置断点的问题【英文标题】:Problems with setting breakpoints in a gdb sciprt 【发布时间】:2017-11-20 09:24:24 【问题描述】:

我正在使用这个带有 5 个断点的 gdb 脚本:

set pagination off
break rewriter_def.h:679
break asserted_formulas.cpp:149
break Z3Solver.cpp:221
break api_solver.cpp:247
break smt_context.cpp:2950
run

gdb 运行时,在第三个断点处停止, 但 不是 在其他断点中:

Breakpoint 1, klee::Z3SolverImpl::internalRunSolver ( ... ) at 
Z3Solver.cpp:221
221    int dave=0;

我确保没有真正设置其他断点, 通过尝试从 gdb 控制台手动清除它们:

(gdb) clear api_solver.cpp:247
No breakpoint at api_solver.cpp:247.

如果我手动复制并粘贴其他中断命令 从脚本文件到 gdb 控制台, 一切正常

(gdb) break api_solver.cpp:247
Breakpoint 2 at 0x7ffff5afbb31: file ../src/api/api_solver.cpp, line 
247.
(gdb) cont
Continuing.

Breakpoint 2, Z3_solver_assert ( ... ) at ../src/api/api_solver.cpp:247
247    to_solver_ref(s)->assert_expr(to_expr(a));

脚本设置的断点起源于 从一个源树(KLEE), 而其他四个没有设置的断点起源于 从另一个源树(Z3)。 这可能是某种PATH问题吗? 非常感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

如果我手动将脚本文件中的其他中断命令复制并粘贴到 gdb 控制台,一切正常:

最可能的原因:其他断点“属于”尚未加载的共享库。

在将二进制文件加载到 GDB 后尝试剪切/粘贴相同的命令,但在你运行它之前。很有可能,GDB 会说类似

No source file named rewriter_def.h.

您可以通过在设置断点之前将start 添加到脚本中来解决此问题:如果有问题的共享库是直接链接的,它将在您的程序到达main 时加载(这就是start命令确实)。

【讨论】:

以上是关于在 gdb 脚本中设置断点的问题的主要内容,如果未能解决你的问题,请参考以下文章

关闭在 GDB 中设置断点的确认 [重复]

使用'gdb'在函数内的特定偏移量中设置断点

GDB:断点没有被命中

在x64dbg中设置条件断点

无法设置 gdb 断点

GDB 跳过共享库断点