打破gdb中的命名空间函数(llvm)

asi*_*mes 3 gdb namespaces llvm

我正试图通过llvm的opt程序(用于作业),并且教师建议设置一个断点runOnFunction.我在其中一个文件中看到了这个:

bool InstCombiner::runOnFunction(Function &F) { /* (Code removed for SO) */ }
Run Code Online (Sandbox Code Playgroud)

但是gdb似乎没有找到runOnFunction断点.我突然想到问题可能是命名空间?我试过这个,但gdb永远不会中断,它只是创建了fooOpt.s文件:

(gdb) b runOnFunction
Function "runOnFunction" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (runOnFunction) pending.
(gdb) r -S -instcombine -debug -o ~/Desktop/fooOpt.s ~/Desktop/foo.s
Run Code Online (Sandbox Code Playgroud)

我在Mac上,所以我没有objdump,但otool生产560万线,通过涉水起点似乎没有合理的runOnFunction多次出现有更多的.

osg*_*sgx 6

Gdb有几个内置命令来查找这些函数的名称.首先info functions,可以使用可选regexp参数来grep所有可用函数,https://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html

info functions regexp
Run Code Online (Sandbox Code Playgroud)

打印名称包含正则表达式regexp匹配的所有已定义函数的名称和数据类型.因此,'info fun step'查找名称包含step的所有函数; 'info fun ^ step'查找名称以step开头的那些.如果函数名称包含与正则表达式语言冲突的字符(例如'operator*()'),则可以使用反斜杠引用它们.

所以,你可以试着info functions runOnFunction得到这个名字.有时在执行break命令时在名称周围添加引号会很有用.

另一种方法是使用rbreak命令而不是break(b).rbreak将在函数名称中进行regexp搜索,并可以定义几个断点:https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Breaks.html#Set-Breaks

rbreak regex
Run Code Online (Sandbox Code Playgroud)

在与正则表达式正则表达式匹配的所有函数上设置断点.此命令在所有匹配项上设置无条件断点,打印它设置的所有断点的列表....

正则表达式的语法是与grep等工具一起使用的标准语法.请注意,这与shell使用的语法不同,因此例如foo*匹配包含fo后跟零或多个os的所有函数.有一个隐含的.*前导和尾随你提供的正则表达式,所以为了只匹配以foo开头的函数,使用^ foo.

(甚至rbreak file:regex将搜索限制为单个源文件)

PS:如果你愿意,你可以打开或关闭C++函数名demangling set print demangle onoff(https://sourceware.org/gdb/current/onlinedocs/gdb/Debugging-C-Plus-Plus.html#Debugging-C-Plus -Plus).关闭demangling后,将函数名称复制到break命令会更容易.