【问题标题】:lldb - how to set breakpoint for all functions in cpp filelldb - 如何为 cpp 文件中的所有函数设置断点
【发布时间】:2016-10-07 02:11:00
【问题描述】:

我正在尝试逐步完成一个 >100k loc 的大型项目,但只关心与 lib 的交互。有没有办法让 lldb 中断一次源文件中的所有函数声明?

到目前为止我已经尝试过

br s -f <file> --func-regex .*

包含来自 gdb to lldbgdb solution 的信息,但这似乎破坏了文件中的所有函数调用,导致 4911 行源文件出现 5129 次匹配。

一种可能的解决方案是进行源正则表达式匹配以通过以下方式查找函数调用

br s -f --source-pattern-regexp

但鉴于 C++ 荒谬的解析规则,匹配所有情况的正则表达式是不可能的。

【问题讨论】:

  • 您可以将要中断的函数列表作为中断命令放入文件中。应该很容易从您的头文件创建。使用 -x 标志运行 gdb:gdb -x command_file_name
  • 问题是我想要一个更通用的解决方案,并且打破头文件中的函数并不能充分涵盖函数未在头文件中声明的情况,例如在源文件中声明的情况和作为函数指针传递。
  • 祝你好运。让我们知道您的发现。

标签: c++ debugging lldb


【解决方案1】:

-f 规范确实将断点搜索限制在由&lt;file&gt; 定义的编译单元,因此它最终包括该编译单元包含的所有模板实例化,如果您使用任何std:: 东西通常是很多,正如你所发现的那样。

调试器通常知道函数的声明位置(它是调试信息的一部分),因此我们可以添加一个选项来将 -f 视为“声明文件”而不是“comp unit name”。然后你可以这样说:

(lldb) break set -f foo.h -f foo.cpp --match-declaration-file --func-regex .*

这将是非常直接的添加。如果您愿意,请向http://bugreporter.apple.com 提出改进请求。

如果您遵循编写函数的约定,例如:

void A::foo()
{
  ...
}

然后你可以在“^{”上做一个源正则表达式。这是这种编码约定的主要原因,它使函数的开头很容易识别。

如果模板实例化主要来自 std,您可以找到 .o 文件并执行类似的操作(这是在 OS X 上):

$ nm <file-basename>.o -s __TEXT __text -j | c++filt | grep -v std

这将在这个 .o 文件中生成一个非标准函数列表,然后您可以将 break set -n 添加到每一行的开头并将其输入。

【讨论】:

  • nm-trick 太棒了。如果您不知道二进制文件使用的库,您也可以在二进制文件上运行ldd 并找出答案。有时运行 --func-regex 搜索以按命名空间缩小功能也很有帮助,例如:breakpoint set --func-regex clang::format::*
  • 对不起,我的意思是breakpoint set --func-regex ^clang::format::*,否则将选择不属于clang::format命名空间但从该命名空间获取类型参数的函数。
  • 必须接受基于命名空间的方法也行不通。返回类型也可以来自命名空间,但我只对其中的函数感兴趣。使用nm 描述的方法是最好的解决方法。
  • 另一种方法是编写自定义断点解析器。将其设置为模块深度(这是默认设置)。您的解析器将获得一个包含您应该设置断点的模块的 SBSymbolContext,您可以调用 SBModule.FindFunctions 来获取所有功能。您可以从 SBFunction 中获取函数名称,并且由于您使用的是 Python,因此您可以根据需要更灵活地过滤名称。
猜你喜欢
  • 2021-05-27
  • 1970-01-01
  • 2010-12-01
  • 2019-12-18
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多