如何在Python中导入“GDB”

35

我正在使用Python 2.7和Python 3.1.3。但是在我的Python中,我无法"import gdb"。

它会给我一个错误:

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

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


可能是 https://dev59.com/c3A75IYBdhLWcg3wFE2b 的一个重复问题。 - Donovan
Alberteddu,你有没有做过这个项目?因为我无法理解链接中给出的文档。你能否指导我一下? - Sagar Gupta M.
3
你的问题没有提供足够的信息。你是在哪里听说了这个文件?你期望它能做什么?你想要达到什么目的? - Sven Marnach
2
使用http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html中描述的方法在Python中使用gdb。 - Sagar Gupta M.
你使用的操作系统是什么?你可能需要安装Python GDB包。 - n s
@SagarGuptaM,你不能从常规的/usr/bin/python解释器中导入gdb,但是你可以在gdb内部使用source MY-SCRIPT.py来实现类似的结果。请参考我的答案中的示例。 - scottt
4个回答

50

import gdb 只有在你的 Python 代码运行在 GDB 进程中时才能工作,它不能从普通的系统 Python 解释器中工作。

解释

  • GDB 嵌入了 Python 解释器,以便可以将 Python 用作扩展语言。
  • 不能像一个普通的 Python 库一样从 /usr/bin/python 中导入 import gdb,因为 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的资源,可以在这里找到。


1
我已经构建了自己的gdb,并且从内部运行python (gdb) python print("hello") 运行良好,但是(gdb) python import gdb不起作用。 我使用./configure --with-python从头开始构建了gdb 7.9。 为什么它仍然无法工作? 我想要使用的只是STL调试的Pretty Print功能。 - Mark Lakata
@MarkLakata,我怀疑您没有正确安装gdb,特别是在--with-gdb-datadir下寻找的文件。如果您使用的是Linux系统,请尝试strace -eopen gdb并查看与Python相关的路径。 - scottt
在 Red Hat 系统的 gdb 中,gdb.command 是从 /usr/share/gdb/python/gdb/command/__init__.py 导入的。 - scottt
1
我安装了gdb,但它没有安装在/usr目录下(我们需要在平台上支持多个版本)。好的,谢谢你的指导。 - Mark Lakata
就此而言,gdb的维护者似乎认为这也应该在gdb之外起作用,请参见http://tromey.com/blog/?p=806。 - Jeff Trull

3
您可以跟随本教程安装PythonGDBPython代码依赖于C扩展
对于Windows系统,最近的gdb构建可在MinGW中找到,但似乎不包括您可以导入的Python模块(仍支持gdb中的Python脚本)。您需要安装MinGW,然后使用mingw-get install gdb安装gbd软件包。
如果您使用Cygwin,则Cygwin Ports中有足够新的gdb,没有Python模块,但支持Python脚本。
我想在任何平台上从源代码构建gdb并获取Python模块都是可能的。

PythonGDB并不包含这个文件名(至少在我的安装中没有)。但是在Pydb中有一个这样的文件。根据给出的信息,很难确定OP想要什么。 - Sven Marnach
1
有一个 gdb 模块,所以他确实可以导入 gdb。 - TryPyPy
你能在Windows上单独运行gdb吗?你是如何安装它的? - TryPyPy
唉,MinGW的gdb中没有gdb模块。 - TryPyPy
好的,TryPyPy,我会尽可能提供更多信息。我正在WINDOWS XP上工作,试图在PYTHONWIN32中构建一个脚本,我正在编写这个脚本以便它可以调用MinGW提供的shell,在那里它必须运行gdb。在这个gdb python脚本中要运行我的程序。所有事情都必须由python脚本控制。第一层-> Python脚本 第二层-> gdb 第三层->我的程序。 - Sagar Gupta M.

2

我现在无法测试,但我认为你需要配置和构建一个启用Python的GDB。请参考这个指南

希望这有所帮助。

我认为这已经过时了。但是,您始终需要构建和配置一个启用Python的GDB。

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

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

--with-python=location

这里的 location 指的是你希望在 GDB 中使用的 Python 安装路径。


2

我在调试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}

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接