【问题标题】:LLDB: print variables passed to function each time it's called?LLDB:每次调用时都传递给函数的打印变量?
【发布时间】:2014-01-03 05:37:48
【问题描述】:

有一个用于 OS X 的未记录(私有)框架,称为 MobileDevice。它用于从 iOS 设备获取数据。我正在编写一个使用它的应用程序,我希望能够提取 iOS 设备电池的充电周期数。在 MobileDevice 中执行此操作的函数称为 AMDeviceCopyValue()。它需要 3 个参数:设备的地址(只是一个整数),您要复制的值的域(一个 C 字符串),以及您要复制的值的键(另一个 C 字符串。 )

由于没有记录此框架,因此很难找到您需要使用的字符串。其中一些已在线发布,但不是用于计算充电周期的。我在网上找到的另一个程序已经这样做了,iCopyBot:http://www.icopybot.com/blog/check-ipad-iphone-battery-charge-cycle-count-without-jailbreaking.htm

我想在 LLDB 中启动 iCopyBot,然后让 LLDB 打印出 iCopyBot 每次调用时传递给 AMDeviceCopyValue() 的域和关键参数。该框架对时间很敏感,所以我不能让它在执行过程中停止——它只需要打印传递的参数并继续运行。

谁能告诉我我必须做什么?我已经设法在 LLDB 中启动 iCopyBot 并且每次调用该函数时都设置了一个断点,但是命令“帧变量”并没有为我打印出任何内容(我从 Apple 网站上获得的 LLDB 文档建议它应该打印传入的参数......它对我不起作用。)

【问题讨论】:

  • 您可以在AMDeviceCopyValue 上设置断点并在程序处于暂停状态时打印参数。
  • @H2CO3 - 我设法让它在函数被调用时暂停,但“框架变量”并没有为我打印出任何东西。由于这是我们正在讨论的 C 函数,我认为源代码中使用的变量名不会保留在编译后的代码中,不是吗?
  • 仅当相关函数所在的模块已使用调试符号编译时。
  • @H2CO3 - 好吧...假设他们不再有名字。我如何打印出它们的值?它们仍然是 C 字符串,并且基于我到目前为止看到的有效参数,我认为我可以从中做出一些事情(到目前为止我看到的域参数始终采用以下形式com.apple.something 和关键参数始终是驼峰式英语,例如 BatteryCharge。我认为其他参数会类似。)
  • 那就有点复杂了,基本上你需要查阅你平台的ABI文档,并弄清楚每个参数的存储位置(例如,在x64上,第一个进入RDI )。然后,有了这些信息,您可以使用调试器来 e. G。 print $rdi 以获取该寄存器中的值。

标签: c macos cocoa function lldb


【解决方案1】:

推测一下我在 H2CO3 问题的 cmets 中的讨论中学到了什么:

您可以通过键入以下命令在 LLDB 中加载您想要的任何程序:

lldb <path to application executable>

要在函数上设置断点,请在 lldb 启动后键入以下命令:

breakpoint set -b <name of function>

要在 lldb 中实际启动程序,请在加载并具有所需的断点后键入以下内容:

run

要查看断点处的变量,即使没有调试器符号(IE,因为这不是您拥有源代码的程序),请输入:

register read

如果列表中的任何内容看起来具有 CoreFoundation 或 Obj-C 对象,请键入以下内容:

po <register of object>

最后,如果你认为某个变量指向了一个 C 字符串,你可以使用这个:

p (char*)<register of string>

您可以使用 lldb 做的事情比我在这里介绍的要多得多。只需在 lldb 提示符下键入 help 即可查看更多功能。不过,这涵盖了我昨天第一次发布此问题时想知道的所有内容。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多