35

I am using Python 2.7 and Python 3.1.3. But in my Python I am unable to "import gdb".

It is giving me an error as:

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

What's a reason for this? How should I solve this problem?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Sagar Gupta M.
  • 359
  • 1
  • 3
  • 5
  • Maybe a dup of http://stackoverflow.com/questions/3482869/invoke-and-control-gdb-from-python – Donovan Jan 25 '11 at 10:45
  • Alberteddu have u worked on this. cos i am unable to understand the documentation given in the link. Can you please guide me. – Sagar Gupta M. Jan 25 '11 at 11:03
  • 3
    You did not give enough information in your question. Where did you hear about this file, and what are you expecting it to do? What are you trying to achieve? – Sven Marnach Jan 27 '11 at 15:11
  • 2
    To use the gdb in python as described in http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html – Sagar Gupta M. Jan 27 '11 at 15:27
  • What operating system are you using? You probably need to install the python GDB package. – n s Jan 27 '11 at 16:16
  • @SagarGuptaM, you can't `import gdb` from the regular `/usr/bin/python` interpreter but you can use `source MY-SCRIPT.py` from within gdb to achieve similar results. See my answer for an example. – scottt Mar 10 '13 at 00:58

4 Answers4

50

import gdb only works when your Python code is running within the GDB process. It's not supposed to work from the regular system Python interpreter.

Explanation

  • GDB embeds the Python interpreter so it can use Python as an extension language.
  • You can't just import gdb from /usr/bin/python like it's an ordinary Python library because GDB isn't structured as a library.
  • What you can do is source MY-SCRIPT.py from within gdb (equivalent to running gdb -x MY-SCRIPT.py).

Example Program

Here's a self contained example. Save the file below to t.py:

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

run:

$ gdb -q -x t.py 

and you'll see the PLT stub for exit() disassembled. On 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.

I've collected some resources on learning the GDB Python API here.

scottt
  • 7,008
  • 27
  • 37
  • 1
    I've built by own gdb, and python works from inside `(gdb) python print("hello")` works fine, but `(gdb) python import gdb` doesn't work. (Same message as original Question). I built gdb 7.9 from scratch using `./configure --with-python`. Any ideas why it still doesn't work? All I want to use is the Pretty Print features for STL debugging. – Mark Lakata May 25 '16 at 21:46
  • @MarkLakata, I suspect you didn't install gdb and especially the files that gdb look for under `--with-gdb-datadir` correctly. Try `strace -eopen gdb` and stare at the paths related to python, assuming you're on Linux. – scottt May 27 '16 at 12:53
  • e.g. `gdb.command` is imported from `/usr/share/gdb/python/gdb/command/__init__.py` in the Red Hat system gdb. – scottt May 27 '16 at 12:54
  • 1
    Ugh, I did install gdb, but it was not installed in `/usr` (we need to support multiple versions on our platform). Alright, thanks for the pointers. – Mark Lakata May 28 '16 at 01:01
  • FWIW the gdb maintainer seems to believe this should work *outside* of gdb as well, see http://tromey.com/blog/?p=806 – Jeff Trull Aug 08 '18 at 05:52
3

You can follow this tutorial to install PythonGDB. The Python code depends on a C extension.

For Windows, there is a recent enough gdb build in MinGW, but it doesn't seem to include the Python module you can import (still supports Python scripting in gdb). You have to install MinGW and then install the gbd package using mingw-get install gdb.

If you use Cygwin, there's again a recent enough gdb in Cygwin Ports, without a Python module but with Python scripting support.

I suppose it'd be possible to build gdb from source in either platform and get the Python module.

TryPyPy
  • 6,214
  • 5
  • 35
  • 63
  • PythonGDB does not include any file of this name (at least not in my installation). There is a file of this name in [Pydb](http://bashdb.sourceforge.net/pydb/) though. With the information given, it's imply undecidable what the OP is after. – Sven Marnach Jan 27 '11 at 15:21
  • 1
    There's a gdb module, though, so he can indeed import gdb. – TryPyPy Jan 27 '11 at 15:23
  • Are you able to run gdb by itself on Windows? How did you install it? – TryPyPy Jan 27 '11 at 15:35
  • Sigh, there's no gdb module in MinGW's gdb. – TryPyPy Jan 27 '11 at 15:46
  • Ok TryPyPy, i will try to give some more information as much as possible. I am working in WINDOWS XP, trying to build a script in PYTHONWIN32, i am writing this script so that it has to invoke a shell provided by MinGW, there it has to run gdb. In this gdb python script as to run my program. Every thing has to controlled by python script. 1st layer -> Python Script 2nd layes -> gdb 3rd layer -> my program. – Sagar Gupta M. Jan 28 '11 at 06:07
2

I just ran into the similar situation when trying to debug 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

I then realized that this script should be invoked in gdb to make it working:

(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}

Hope this helps.

Deqing
  • 14,098
  • 15
  • 84
  • 131
2

I can't test now, but I think you need to configure and build a Python-enabled GDB. Take a look at this guide.

I hope that helps.

This is outdated, I think. Anyway, you always need to build and configure a Python enabled GDB.

You can script GDB using the Python programming language. This feature is available only if GDB was configured using --with-python.

You have to configure GDB using that option:

--with-python=location

Where location is the location of python you would like to use GDB with.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Donovan
  • 6,002
  • 5
  • 41
  • 55