LLDB Python/C++绑定:异步步骤指令



我正在尝试遍历一个线程。当我使用debugger.SetAsync(False)时,这是有效的,但我想异步执行。这里有一个脚本来复制它。它在设置debugger.SetAsync (False)而不是True时执行步骤。我添加了time.sleep,这样它就有时间执行我的指令。我期待着框架中的下一条指令.pc

import time
import sys
lldb_path = "/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python"
sys.path = sys.path + [lldb_path]
import lldb
import os
exe = "./a.out"    
debugger = lldb.SBDebugger.Create()
debugger.SetAsync (True) # change this to False, to make it work

target = debugger.CreateTargetWithFileAndArch (exe, lldb.LLDB_ARCH_DEFAULT)
if target:
    main_bp = target.BreakpointCreateByName ("main", target.GetExecutable().GetFilename()) 
    print main_bp
    launch_info = lldb.SBLaunchInfo(None)
    launch_info.SetExecutableFile (lldb.SBFileSpec(exe), True)
    error = lldb.SBError()
    process = target.Launch (launch_info, error)
    time.sleep(1)
    # Make sure the launch went ok
    if process:
        # Print some simple process info
        state = process.GetState ()
        print 'process state'
        print state
        thread = process.GetThreadAtIndex(0)
        frame = thread.GetFrameAtIndex(0)
        print 'stop loc'
        print hex(frame.pc)
        print 'thread stop reason'
        print thread.stop_reason
        print 'stepping'
        thread.StepInstruction(False)
        time.sleep(1)
        print 'process state'
        print process.GetState ()
        print 'thread stop reason'
        print thread.stop_reason
        frame = thread.GetFrameAtIndex(0)
        print 'stop loc'
        print hex(frame.pc)  # invalid output?

版本:lldb-340.4.110(附带Xcode)
Python:Python 2.7.10
Os:Mac Yosemite

;异步;lldb API的版本使用基于事件的系统。使用sleep不能等待事情发生,而是使用WaitForEvent API的lldb提供的。有关如何做到这一点的示例,请访问:

https://github.com/llvm/llvm-project/blob/main/lldb/examples/python/process_events.py

在示例的开头有一堆内容,展示了如何加载lldb模块并进行参数解析。你想看的部分是循环:

        listener = debugger.GetListener()
        # sign up for process state change events
        stop_idx = 0
        done = False
        while not done:
            event = lldb.SBEvent()
            if listener.WaitForEvent (options.event_timeout, event):

及以下。

最新更新