【问题标题】:How to import 'GDB' in Python如何在 Python 中导入“GDB”
【发布时间】:2018-02-06 04:05:30
【问题描述】:

我正在使用 Python 2.7 和 Python 3.1.3。但在我的 Python 中,我无法“导入 gdb”。

这给了我一个错误:

>>> import gdb
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ImportError: No module named gdb
>>>

这是什么原因?我该如何解决这个问题?

【问题讨论】:

标签: python gdb


【解决方案1】:

import gdb 仅在您的 Python 代码在 GDB 进程中运行时才有效。它不应该在常规系统 Python 解释器中工作。

说明

  • GDB 嵌入了 Python 解释器,因此它可以使用 Python 作为扩展语言。
  • 不能只是将/usr/bin/python 中的import gdb 当作一个普通的Python 库,因为GDB 不是一个库。
  • 您可以在 gdb 中执行 source MY-SCRIPT.py(相当于运行 gdb -x MY-SCRIPT.py)。

示例程序

这是一个独立的示例。将下面的文件保存到t.py

import gdb
gdb.execute('file /bin/cat')
o = gdb.execute('disassemble exit', to_string=True)
print(o)
gdb.execute('quit')

运行:

$ gdb -q -x t.py 

您会看到 exit() 的 PLT 存根被反汇编。在 x86-64 Linux 上:

Dump of assembler code for function exit@plt:
   0x0000000000401ae0 <+0>:  jmpq   *0x20971a(%rip)    # 0x60b200 <exit@got.plt>
   0x0000000000401ae6 <+6>:  pushq  $0x3d
   0x0000000000401aeb <+11>: jmpq   0x401700
End of assembler dump.

我收集了一些学习 GDB Python API here 的资源。

【讨论】:

  • 我是用自己的 gdb 构建的,python 在 (gdb) python print("hello") 内部工作正常,但 (gdb) python import gdb 不起作用。 (与原始问题相同的消息)。我使用./configure --with-python 从头构建了 gdb 7.9。任何想法为什么它仍然不起作用?我只想使用 Pretty Print 功能进行 STL 调试。
  • @MarkLakata,我怀疑您没有正确安装 gdb,尤其是 gdb 在 --with-gdb-datadir 下查找的文件。尝试strace -eopen gdb 并盯着与 python 相关的路径,假设你在 Linux 上。
  • 例如gdb.command 是从 Red Hat 系统 gdb 中的 /usr/share/gdb/python/gdb/command/__init__.py 导入的。
  • 呃,我确实安装了gdb,但它没有安装在/usr中(我们需要在我们的平台上支持多个版本)。好的,谢谢指点。
  • FWIW gdb 维护者似乎认为这也应该在 gdb 外部工作,请参阅tromey.com/blog/?p=806
【解决方案2】:

您可以关注this tutorial安装PythonGDBPython code 依赖于 C extension

对于 Windows,MinGW 中有一个足够新的gdb build,但它似乎不包括您可以导入的 Python 模块(仍然支持 gdb 中的 Python 脚本)。你必须 install MinGW 然后使用 mingw-get install gdb 安装 gbd 包。

如果您使用CygwinCygwin Ports 中还有一个足够新的 gdb,没有 Python 模块,但支持 Python 脚本。

我想可以在任一平台上从源代码构建 gdb 并获取 Python 模块。

【讨论】:

  • PythonGDB 不包含此名称的任何文件(至少在我的安装中不包含)。不过在Pydb 中有一个同名的文件。根据给出的信息,这意味着 OP 的目标是不确定的。
  • 有一个gdb模块,所以他确实可以导入gdb。
  • 你能在 Windows 上自己运行 gdb 吗?你是怎么安装的?
  • 唉,MinGW的gdb里没有gdb模块。
  • 好的 TryPyPy,我会尽量提供更多信息。我在 WINDOWS XP 中工作,试图在 PYTHONWIN32 中构建一个脚本,我正在编写这个脚本,以便它必须调用 MinGW 提供的 shell,它必须在那里运行 gdb。在这个 gdb python 脚本中运行我的程序。每件事都必须由 python 脚本控制。第 1 层 -> Python 脚本第 2 层 -> gdb 第 3 层 -> 我的程序。
【解决方案3】:

我在尝试调试 Webkit 时遇到了类似的情况:

$ python Tools/gdb/webkit.py
Traceback (most recent call last):
  File "Tools/gdb/webkit.py", line 38, in <module>
    import gdb
ImportError: No module named gdb

然后我意识到应该在 gdb 中调用此脚本以使其工作:

(gdb) source Tools/gdb/webkit.py
(gdb) p run
$1 = (const WebCore::TextRun &) @0x7fffffffa450: {m_characters = "Plugin Testsa", m_len = 12, m_xpos = 0, 
  m_padding = 0, m_allowTabs = false, m_rtl = false, m_directionalOverride = false, 
  m_applyRunRounding = true, m_applyWordRounding = true, m_disableSpacing = false}

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    我现在无法测试,但我认为您需要配置和构建支持 Python 的 GDB。看看这个guide

    希望对你有帮助。

    我认为这已经过时了。无论如何,您总是需要构建和配置启用 Python 的 GDB。

    您可以使用 Python 编程语言编写 GDB 脚本。此功能仅在使用 --with-python 配置 GDB 时可用。

    您必须使用该选项配置 GDB:

    --with-python=location
    

    location 是你想要使用 GDB 的 python 的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2015-08-16
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多