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多次出现有更多的.
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 on或off(https://sourceware.org/gdb/current/onlinedocs/gdb/Debugging-C-Plus-Plus.html#Debugging-C-Plus -Plus).关闭demangling后,将函数名称复制到break命令会更容易.