LLDB Python 调试器寄存器读取
我需要跟踪程序的执行过程,所以我决定创建一个无限循环,然后读取程序计数器(pc)寄存器并进行逐步执行。
平台:IOS
通过这种方式,我想要跟踪程序的执行流程。
我的问题是 - 我该如何通过LLDB的Python接口获取$pc寄存器?
1 个回答
0
你的程序可能会有多个线程,每个线程都有不同的程序计数器(PC)。所以你可以从你的SBProcess对象开始,然后它有一个“threads”属性,可以用来遍历线程,这些线程用SBThread对象表示。SBThread有一个“frames”属性,它是一个包含所有“SBFrames”的数组,frames[0]是最底层的帧。SBFrame有一个“pc”属性,就是那个程序计数器。下面这个Python SB API的表格可能对你有帮助:
不过,你想做的事情在Xcode下是行不通的——Xcode通常是调试iOS的唯一方式。Xcode和Python现在在争夺谁来控制进程的执行,结果有时候会出现错误的控制者获胜,导致执行停滞。
你可以使用一个独立的Python驱动程序来做这种事情,下面是一个示例:
但是,由于你无法从独立的lldb连接到iOS进程,这在iOS开发中使用起来很困难。
顺便说一下,我偶尔在Mac OS X上做过你描述的事情,但速度也非常慢。你只有在非常着急的时候才会想这样做。
有时候,你可以通过在每个函数入口点设置断点来达到类似的效果,这可以在lldb命令行中使用:
(lldb) break set -r .
如果你只关心某些特定模块的跟踪,可以在“break set”命令中多次添加--shlib选项,以限制断点只在那些库中生效。然后写一个断点命令(你可以用Python来做),来收集所需的信息。这样做仍然会很慢,但会更接近可用。