检查lldb中函数的返回值

Posted

技术标签:

【中文标题】检查lldb中函数的返回值【英文标题】:Inspect the return value of a function in lldb 【发布时间】:2014-01-21 00:38:25 【问题描述】:

假设返回值未分配给变量,是否可以检查 lldb 中函数的返回值?

【问题讨论】:

【参考方案1】:

您可以在函数的返回点设置断点(类似于thread step-out)并打印出返回值。试试这个(在 ARM 平台上工作):

#1 (lldb) br set -n "__FUNCTION_NAME_YOUR_WANT_TO_TRACE" -K false
#2 (lldb) br set -a $lr -o true -G true -C "po $x0"

在 #1 我们在 __FUNCTION_NAME_YOUR_WANT_TO_TRACE 上创建一个断点,\-K false 确保我们不会跳过汇编中的序言。

由于我们没有跳过序言,当第一个断点命中时,我们可以检索该函数的返回地址(blble指令将返回地址设置为链接寄存器,又名lr)。

此时我们在#2的返回地址处创建一个断点。

-o true表示为一次性断点,点击后会自行删除;

-G true 表示自动继续;

-C "po $x0"表示在此断点处添加po $x0命令,打印x0寄存器的内容,该寄存器存储目标函数的返回值。

【讨论】:

【参考方案2】:

答错了,我会发正确的。

要检查返回值,您需要从要检查返回值的函数中(lldb) finish(缩写为thread step-out)然后使用:

(lldb) thread info

这会给你类似这样的输出:

thread #1: tid = 0x28955, (frame variables  and stuff), stop reason = step out
Return value: (NSMenu *) $3 = 0x0000600000065280

有了这个你就可以:

(lldb) po $3

请注意,gdb 仅使用 finish 检查返回值的方式不会为 lldb 打印任何内容。

此外,正如 SFeng 指出的,如果您使用 Xcode,您可以在退出之前的函数或方法后在 UI 检查器中看到它。

【讨论】:

我没有看到在finish 之后打印的任何信息。但po $x0 似乎有正确的价值 @HariKaramSingh 这正是我所说的,完成 lldb 不会打印任何内容。 @tboyce12 这不适用于 Xcode 8.3.2 中的 Swift。其他版本不知道。 @solgar 你仅次于 clive1。 不适用于最新的 clang/lldb lldb-1000.11.38.2【参考方案3】:

跳出函数,在检查器中查看返回值。这是我的截图:

更多详情见文章:https://gist.github.com/schwa/7812916

【讨论】:

请注意,这仅在您使用“step out”退出该功能时才有效。 lldb 还没有跟踪所有的跨步和跨步,以查看其中一个是否退出了函数。 这仅针对 XCode 而非 lldb 回答了问题

以上是关于检查lldb中函数的返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OCMock 3 在单元测试中检查函数的返回值

检查值并返回结果的函数

在函数结束(例如检查失败)之前在 python 中退出函数(没有返回值)的最佳方法是啥?

Javascript/Jquery-如何检查函数是不是返回任何值?

检查后从表中返回值的 PL/SQL 函数

如何在 Python 中检查 type() 方法的返回值? [复制]