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
添加到每一行的开头并在其中添加源代码。
我正在尝试逐步完成一个 >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
添加到每一行的开头并在其中添加源代码。