我正在使用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
>>>
这是什么原因?我该如何解决这个问题?
import gdb
只有在你的 Python 代码运行在 GDB 进程中时才能工作,它不能从普通的系统 Python 解释器中工作。
/usr/bin/python
中导入 import 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的资源,可以在这里找到。
(gdb) python print("hello")
运行良好,但是(gdb) python import gdb
不起作用。 我使用./configure --with-python
从头开始构建了gdb 7.9。 为什么它仍然无法工作? 我想要使用的只是STL调试的Pretty Print功能。 - Mark Lakata--with-gdb-datadir
下寻找的文件。如果您使用的是Linux系统,请尝试strace -eopen gdb
并查看与Python相关的路径。 - scotttgdb.command
是从 /usr/share/gdb/python/gdb/command/__init__.py
导入的。 - scottt/usr
目录下(我们需要在平台上支持多个版本)。好的,谢谢你的指导。 - Mark Lakata我现在无法测试,但我认为你需要配置和构建一个启用Python的GDB。请参考这个指南。
希望这有所帮助。
我认为这已经过时了。但是,您始终需要构建和配置一个启用Python的GDB。
您可以使用Python编程语言脚本化GDB。仅当使用
--with-python
配置GDB时才可用此功能。
您必须使用该选项来配置GDB:
--with-python=location
这里的 location
指的是你希望在 GDB 中使用的 Python 安装路径。
我在调试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}
/usr/bin/python
解释器中导入gdb
,但是你可以在gdb内部使用source MY-SCRIPT.py
来实现类似的结果。请参考我的答案中的示例。 - scottt