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

时间:2014-04-03 02:55:33

标签: namespaces gdb llvm

我正试图通过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不止一次出现,因此起点似乎并不合理。

1 个答案:

答案 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命令而不是breakb)。 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 onoffhttps://sourceware.org/gdb/current/onlinedocs/gdb/Debugging-C-Plus-Plus.html#Debugging-C-Plus-Plus)打开或关闭C ++函数名称解码。关闭demangling后,将函数名称复制到break命令会更容易。