【发布时间】: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