gpt4 book ai didi

namespaces - 在 gdb (llvm) 中中断命名空间函数

转载 作者:行者123 更新时间:2023-12-03 23:44:29 27 4
gpt4 key购买 nike

我正在尝试单步执行 llvm 的 opt 程序(用于作业),讲师建议在 runOnFunction 处设置一个断点。我在其中一个文件中看到了这个:

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

但是gdb好像没有找到runOnFunction断点。我想到问题可能是 namespace ?我试过了,但 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 上,所以我没有 objdumpotool 产生了 560 万行代码,作为 runOnFunction 的起点从它开始涉水似乎不合理在那里不止一次出现。

最佳答案

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

info functions regexp

Print the names and data types of all defined functions whose names contain a match for regular expression regexp. Thus, ‘info fun step’ finds all functions whose names include step; ‘info fun ^step’ finds those whose names start with step. If a function name contains characters that conflict with the regular expression language (e.g. ‘operator*()’), they may be quoted with a backslash.

因此,您可以尝试 info functions runOnFunction 来获取名称。有时在执行 break 命令时在名称周围添加引号会很有用。

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

rbreak regex

Set breakpoints on all functions matching the regular expression regex. This command sets an unconditional breakpoint on all matches, printing a list of all breakpoints it set. ...

The syntax of the regular expression is the standard one used with tools like grep. Note that this is different from the syntax used by shells, so for instance foo* matches all functions that include an fo followed by zero or more os. There is an implicit .* leading and trailing the regular expression you supply, so to match only functions that begin with foo, use ^foo.

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

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

关于namespaces - 在 gdb (llvm) 中中断命名空间函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com