我正试图通过llvm的opt程序(用于作业),教师建议在runOnFunction
设置断点。我在其中一个文件中看到了这一点:
bool InstCombiner::runOnFunction(Function &F) { /* (Code removed for SO) */ }
但是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
我在Mac上,所以我没有objdump
,但otool
产生560万行,因为runOnFunction不止一次出现,因此起点似乎并不合理。
答案 0 :(得分:6)
Gdb有几个内置命令来查找此类函数的名称。首先是info functions
,它可以与可选的regexp
参数一起用于grep所有可用函数,https://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html
info functions regexp
打印名称包含正则表达式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
在与正则表达式正则表达式匹配的所有函数上设置断点。此命令在所有匹配项上设置无条件断点,打印它设置的所有断点的列表。 ...
正则表达式的语法是与grep等工具一起使用的标准语法。请注意,这与shell使用的语法不同,因此例如foo *匹配包含fo后跟零或多个os的所有函数。有一个隐含的。*前导和尾随你提供的正则表达式,所以为了只匹配以foo开头的函数,使用^ foo。
(甚至rbreak file:regex
将搜索限制为单个源文件)
PS:如果需要,可以使用set print demangle
on
或off
(https://sourceware.org/gdb/current/onlinedocs/gdb/Debugging-C-Plus-Plus.html#Debugging-C-Plus-Plus)打开或关闭C ++函数名称解码。关闭demangling后,将函数名称复制到break
命令会更容易。