lldb - 如何为 cpp 文件中的所有函数设置断点

lldb - how to set breakpoint for all functions in cpp file

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

到目前为止我已经尝试过

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

使用来自 gdb to lldb and gdb solution 的信息,但这似乎中断了文件中的所有函数调用,导致 4911 行源文件有 5129 次匹配。

一个可能的解决方案是进行源正则表达式匹配以通过

查找函数调用

br s -f --source-pattern-regexp

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

-f 规范实际上将断点搜索限制在 <file> 定义的编译单元中,因此它最终包括该编译单元包含的所有模板实例,如果您使用任何 std::东西一般很多,你发现了。

调试器通常知道函数声明的位置(它是调试信息的一部分),因此我们可以添加一个选项将 -f 视为 "file of declaration" 而不是 "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 添加到每一行的开头并在其中添加源代码。