python - 尝试在导入的 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()')
解决方案
推荐阅读
- python - 如何在 Python 中将 abcd 转换为类似 {'a': {'b': {'c': {'d':}}}} 的东西?
- visual-studio-code - Looking for a settings prop - auto insert function arguments
- curl - Freeswitch dialplan cURL - 如何设置超时
- php - 带有新 PHP 驱动程序的 MongoDB 4.2 中的事务
- javascript - 如何使用 ctrl + 单击选择多个单元格
- azure - Azure 搜索索引存储大小停止在 8MB
- javascript - Django:日期格式管理和 unique_together ->“20/03/2020”值的日期格式无效。它必须是 YYYY-MM-DD 格式。”]
- flutter - 文本小部件显示在重新加载中但不在热重新加载中
- amazon-web-services - 我想创建一个只能由使用 Cognito 创建的用户在登录时访问的 S3 存储桶
- azure - Set-AzureRmDiagnosticSetting:找不到与参数名称“名称”匹配的参数