我想在Python中使用LLDB,我写了这样的Python脚本:
import lldb
import commands
import optparse
import shlex
def __lldb_init_module(debugger, internal_dict):
list1=[]
for i in lldb.frame.variables:
list1.append(str(i.name))
print list1
我想立即在框架中打印变量。当我在LLDB中导入它时,
(lldb)命令脚本导入〜/ str.py
结果为空。
但是,如果我输入"脚本"首先,退出它.Python脚本将打印出我想要的正确结果。
(lldb)脚本
Python Interactive Interpreter。要退出,请键入'退出()','退出()'或Ctrl-D。
退出
(lldb)命令脚本导入〜/ str.py
[' a',' b',' c',' d']
断点设置在正确的位置,程序可以运行而没有任何错误。 我想知道为什么以及如何在没有输入的情况下得到我想要的结果" script"第一
答案 0 :(得分:0)
交互式脚本解释器中的lldb.frame
,lldb.thread
,lldb.process
,lldb.target
快捷方式在独立的python命令中不存在 - 可能不止一个在给定的时间内这些对象,我们希望脚本具体说明它正在使用哪个。
通过SB API可以做同样的“让我当前选择”的东西。 e.g。
debugger.GetSelectedTarget()
debugger.GetSelectedTarget().GetProcess()
debugger.GetSelectedTarget().GetProcess().GetThread()
debugger.GetSelectedTarget().GetProcess().GetThread().GetSelectedFrame()
你在上面的例子中正在你的init方法中工作(所以你的python只能在有正在运行的进程时加载,对吧?)但是如果你在python中定义一个新的lldb命令,那么新的lldb(在过去一两年内)将传递SBExecutionContext
,它将为您提供当前所选的所有内容。 e.g。
def disthis(debugger, command, *args):
"""Usage: disthis
Disables the breakpoint the currently selected thread is stopped at."""
target = lldb.SBQueue() # some random object that will be invalid
thread = lldb.SBQueue() # some random object that will be invalid
if len(args) == 2:
# Old lldb invocation style
result = args[0]
if debugger and debugger.GetSelectedTarget() and debugger.GetSelectedTarget().GetProcess():
target = debugger.GetSelectedTarget()
process = target.GetProcess()
thread = process.GetSelectedThread()
elif len(args) == 3:
# New (2015 & later) lldb invocation style where we're given the execution context
exe_ctx = args[0]
result = args[1]
target = exe_ctx.GetTarget()
thread = exe_ctx.GetThread()
if thread.IsValid() != True:
print >>result, "error: process is not paused."
result.SetStatus (lldb.eReturnStatusFailed)
return
[...]
def __lldb_init_module (debugger, dict):
debugger.HandleCommand('command script add -f %s.disthis disthis' % __name__)
老实说,此时我甚至不会包含不再传递SBExecutionContext
的lldb的代码,我可以期望每个人都运行足够新的lldb。