如何在Python脚本

时间:2017-01-03 05:27:02

标签: python python-2.7 debugging lldb

我想在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"第一

1 个答案:

答案 0 :(得分:0)

交互式脚本解释器中的lldb.framelldb.threadlldb.processlldb.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。