首页 > 解决方案 > 尝试在导入的 lldb python 脚本中运行 pdb 会导致错误 AttributeError: module 'lldb_editline' has no attribute 'set_completer_delims'

问题描述

当我将 pdb 导入 python 脚本时,使用 Debian 默认 lldb (v11),下载 lldb (v12) 并从源 lldb (v13) 构建

(lldb) 命令脚本导入“/home/rgr/bin/llvm/disassembly_mode.py”

使用 set_trace 触发断点时,我得到了这个回溯:-

即将中断错误:模块导入失败:Traceback(最近一次调用最后):文件“”,第 1 行,在文件“/home/rgr/bin/llvm/disassembly_mode.py”,第 7 行,在断点()文件“ /usr/lib/python3.9/pdb.py”,第 1610 行,在 set_trace pdb = Pdb() 文件“/usr/lib/python3.9/pdb.py”,第 159 行,在init readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\|;:'",<>?') AttributeError: module 'lldb_editline' has no attribute 'set_completer_delims'

关键是:

AttributeError: module 'lldb_editline' has no attribute 'set_completer_delims'

从源代码构建我设置了libedit 选项,如下所述:

make -S llvm -B build -G Ninja -DLLVM_PARALLEL_LINK_JOBS=1 -DLLVM_ENABLE_PROJECTS="clang;lldb" -DLLVM_ENABLE_LIBEDIT=1 -DLLVM_ENABLE_CURSES=1 -DLLDB_ENABLE_PYTHON=1 

(使用 pyenv 无法从源代码构建,所以我通过使 debian 11 使用 python3 作为默认值并暂时禁用 pyenv 来链接使用 python 3.9.2,因为它的 python 是(不是?)静态链接:side Q - 如何你告诉 cmake 在构建 lldb 时链接到某个 python 实例?)

diassembly_mode 代码(摘自 lldb python 示例并添加了 pdb 导入)

""" Adds the 'toggle-disassembly' command to switch you into a disassembly only mode """
import lldb
import pdb

class DisassemblyMode:
    def __init__(self, debugger, unused):
        print("About to break")
        pdb.set_trace()
        print("Back from break.")
        self.dbg = debugger
        self.interp = debugger.GetCommandInterpreter()
        self.store_state()
        self.mode_off = True

    def store_state(self):
        self.dis_count = self.get_string_value("stop-disassembly-count")
        self.dis_display = self.get_string_value("stop-disassembly-display")
        self.before_count = self.get_string_value("stop-line-count-before")
        self.after_count = self.get_string_value("stop-line-count-after")

    def get_string_value(self, setting):
        result = lldb.SBCommandReturnObject()
        self.interp.HandleCommand("settings show " + setting, result)
        value = result.GetOutput().split(" = ")[1].rstrip("\n")
        return value

    def set_value(self, setting, value):
        result = lldb.SBCommandReturnObject()
        self.interp.HandleCommand("settings set " + setting + " " + value, result)

    def __call__(self, debugger, command, exe_ctx, result):
        if self.mode_off:
            self.mode_off = False
            self.store_state()
            self.set_value("stop-disassembly-display","always")
            self.set_value("stop-disassembly-count", "8")
            self.set_value("stop-line-count-before", "0")
            self.set_value("stop-line-count-after", "0")
            result.AppendMessage("Disassembly mode on.")
        else:
            self.mode_off = True
            self.set_value("stop-disassembly-display",self.dis_display)
            self.set_value("stop-disassembly-count", self.dis_count)
            self.set_value("stop-line-count-before", self.before_count)
            self.set_value("stop-line-count-after", self.after_count)
            result.AppendMessage("Disassembly mode off.")

    def get_short_help(self):
        return "Toggles between a disassembly only mode and normal source mode\n"

def __lldb_init_module(debugger, unused):
    debugger.HandleCommand("command script add -c disassembly_mode.DisassemblyMode toggle-disassembly")

任何指针?这一切对我来说都很新鲜。(同样的情况也只是使用'breakpoint()')

标签: pythonllvmlldbpdb

解决方案


推荐阅读