LLDB Python/C++ 绑定:异步步骤指令
LLDB Python/C++ bindings: Async Step instructions
我正在尝试单步执行线程。这在我使用 debugger.SetAsync(False)
时有效,但我想异步执行此操作。这是一个重现它的脚本。它在设置 debugger.SetAsync (False)
而不是 True
时执行。我添加了 time.sleep
以便它有时间执行我的指令。我期待 frame.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):
及以下。
我正在尝试单步执行线程。这在我使用 debugger.SetAsync(False)
时有效,但我想异步执行此操作。这是一个重现它的脚本。它在设置 debugger.SetAsync (False)
而不是 True
时执行。我添加了 time.sleep
以便它有时间执行我的指令。我期待 frame.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):
及以下。