C LLDB:每次打印传递给函数的变量';这叫什么?
OSX有一个未记录(私有)的框架叫做MobileDevice。它用于从iOS设备获取数据。我正在编写一个使用它的应用程序,我希望能够提取iOS设备电池的充电周期数。在MobileDevice中执行此操作的函数称为AMDeviceCopyValue()。它有3个参数:设备的地址(一个整数)、要复制的值的域(一个C字符串)和要复制的值的键(另一个C字符串) 因为这个框架没有文档记录,所以很难找到需要使用的字符串。其中一些已经发布在网上,但不是用来计算充电周期的。我在网上找到的另一个程序已经做到了这一点,iCopyBot: 我想在LLDB中启动iCopyBot,然后让LLDB打印出iCopyBot每次调用时传递给AMDeviceCopyValue()的域和关键参数。该框架对时间非常敏感,所以我不能让它在执行过程中停止——它只需要打印传递的参数并继续运行C LLDB:每次打印传递给函数的变量';这叫什么?,c,macos,cocoa,function,lldb,C,Macos,Cocoa,Function,Lldb,OSX有一个未记录(私有)的框架叫做MobileDevice。它用于从iOS设备获取数据。我正在编写一个使用它的应用程序,我希望能够提取iOS设备电池的充电周期数。在MobileDevice中执行此操作的函数称为AMDeviceCopyValue()。它有3个参数:设备的地址(一个整数)、要复制的值的域(一个C字符串)和要复制的值的键(另一个C字符串) 因为这个框架没有文档记录,所以很难找到需要使用的字符串。其中一些已经发布在网上,但不是用来计算充电周期的。我在网上找到的另一个程序已经做到了这一
谁能告诉我该怎么做?我已经设法在LLDB中启动了iCopyBot,并且每次调用该函数时我都设置了一个断点,但是命令“frame variable”并没有为我打印任何内容(我从苹果网站上获得的LLDB文档建议它应该打印传入的参数……这对我不起作用)要猜测我在对H2CO3问题的评论中从讨论中学到了什么: 通过键入以下命令,可以在LLDB中加载所需的任何程序:
lldb <path to application executable>
要在断点处查看变量,即使没有调试器符号(即,因为这不是您要输入源代码的程序),请键入:
如果列表中的任何内容看起来有CoreFoundation或Obj-C对象,请键入以下内容:
po <register of object>
po
最后,如果您认为其中一个变量指向一个C字符串,您可以使用:
p (char*)<register of string>
p(char*)
你可以用lldb做的事情比我在这里介绍的要多得多。只需在lldb提示符中键入
help
,就可以了解它的更多功能。这涵盖了我昨天第一次发布此问题时想知道的所有内容。要猜测我在H2CO3问题评论中从讨论中学到了什么:
通过键入以下命令,可以在LLDB中加载所需的任何程序:
lldb <path to application executable>
要在断点处查看变量,即使没有调试器符号(即,因为这不是您要输入源代码的程序),请键入:
如果列表中的任何内容看起来有CoreFoundation或Obj-C对象,请键入以下内容:
po <register of object>
po
最后,如果您认为其中一个变量指向一个C字符串,您可以使用:
p (char*)<register of string>
p(char*)
你可以用lldb做的事情比我在这里介绍的要多得多。只需在lldb提示符中键入
help
,就可以了解它的更多功能。这涵盖了我昨天第一次发布此问题时想知道的所有内容。您可以在AMDeviceCopyValue
上设置断点,并在程序处于暂停状态时打印参数。@H2CO3-调用函数时,我已设法使其暂停,但“frame variable”无法为我打印任何内容。由于这是我们正在讨论的C函数,我不认为源代码中使用的变量名会留在编译后的代码中,是吗?只有当所讨论的函数所在的模块已使用调试符号编译时。@H2CO3-好的,所以。。。让我们假设他们不再有名字。如何打印它们的值?它们仍然是C字符串,根据我迄今为止看到的有效参数,我假设我能够从它们中获得一些东西(到目前为止我看到的域参数总是以com.apple.something
的形式出现,而关键参数总是以驼格英语出现,比如BatteryCharge。我假设其他参数也会类似。)然后就有点复杂了,基本上你需要查阅平台上的ABI文档,找出每个参数的存储位置(例如,在x64上,第一个参数进入RDI)。然后,有了这些信息,您就可以使用调试器来调试。gprint$rdi
以获取该寄存器中的值。当程序处于暂停状态时,您可以在AMDeviceCopyValue
上设置断点并打印参数。@H2CO3-调用函数时,我已设法使其暂停,但“frame variable”无法为我打印任何内容。由于这是我们正在讨论的C函数,我不认为源代码中使用的变量名会留在编译后的代码中,是吗?只有当所讨论的函数所在的模块已使用调试符号编译时。@H2CO3-好的,所以。。。让我们假设他们不再有名字。如何打印它们的值?它们仍然是C字符串,根据我迄今为止看到的有效参数,我假设我能够从它们中获得一些东西(到目前为止我看到的域参数总是以com.apple.something
的形式出现,而关键参数总是以驼格英语出现,比如BatteryCharge。我假设其他参数也会类似。)然后就有点复杂了,基本上你需要查阅平台上的ABI文档,找出每个参数的存储位置(例如,在x64上,第一个参数进入RDI)。然后,有了这些信息,您就可以使用调试器来调试。gprint$rdi
以获取该寄存器中的值。