【发布时间】:2014-06-17 11:36:30
【问题描述】:
我需要跟踪程序执行,所以我决定做一个无限循环,并读取pc寄存器和make step。
平台:IOS
这样我想跟踪程序的执行流程。
问题是 - 我应该如何通过 LLDB python API 获得 $pc 注册?
【问题讨论】:
标签: python ios debugging trace lldb
我需要跟踪程序执行,所以我决定做一个无限循环,并读取pc寄存器和make step。
平台:IOS
这样我想跟踪程序的执行流程。
问题是 - 我应该如何通过 LLDB python API 获得 $pc 注册?
【问题讨论】:
标签: python ios debugging trace lldb
您的程序可能有多个线程,并且每个线程都有不同的 PC。因此,您将从您的 SBProcess 对象开始,然后它具有用于迭代线程的“线程”属性 - 由 SBThread 对象表示。 SBThread 有一个“frames”属性,它是所有“SBFrames”的数组,frames[0] 是最底部的帧。 SBFrame 具有“pc”属性,即 pc。这张 Python SB API 表可能会对您有所帮助:
但是,您尝试执行的操作在 Xcode 下不起作用 - 这通常是在 iOS 上进行调试的唯一方法。 Xcode 和 Python 目前在争夺谁来控制进程执行,并且在某些时候错误的参与者获胜并且执行停止。
您可以使用独立的 Python 驱动程序执行此类操作,示例如下:
但由于您无法真正从独立的 lldb 附加到 iOS 进程,因此很难将其用于 iOS 开发。
顺便说一句,我偶尔会在 Mac OS X 上完成您所描述的操作,而且速度也非常慢。当你绝望时,你只会想要这样做。
您有时可以通过在每个函数入口点上放置断点来获得相同的效果,您可以在 lldb 命令行中使用:
(lldb) break set -r .
如果您只关心通过某些给定模块进行跟踪,您可以将 --shlib 选项添加一次或多次到“break set”行以将断点限制在这些库中。然后编写一个断点命令(可以在 Python 中执行)来收集必要的信息。这仍然会很慢,但更接近可用。
【讨论】: