Skip to content
Scriptable debugger library
Branch: master
Clone or download
osandov cli: use argparse.REMAINDER for script arguments
This makes it possible to pass options to a script using drgn:

  $ cat
  #!/usr/bin/drgn -k

  import sys

  $ sudo ./ --foo --bar
  ['./', '--foo', '--bar']

Before, drgn would try to parse the additional arguments and fail.
Latest commit 808a03a Jun 11, 2019



Build Status Documentation Status

drgn (pronounced "dragon") is a debugger-as-a-library. In contrast to existing debuggers like GDB which focus on breakpoint-based debugging, drgn excels in live introspection. drgn exposes the types and variables in a program for easy, expressive scripting in Python. For example, you can debug the Linux kernel:

>>> from drgn.helpers.linux import list_for_each_entry
>>> for mod in list_for_each_entry('struct module',
...                                prog['modules'].address_of_(),
...                                'list'):
...    if mod.refcnt.counter > 10:
...        print(
(char [56])"snd"
(char [56])"evdev"
(char [56])"i915"

drgn was developed for debugging the Linux kernel (as an alternative to the crash utility), but it can also debug userspace programs written in C. C++ support is planned.

Documentation can be found at


Install the following dependencies:

  • Python 3.6 or newer
  • elfutils development libraries (libelf and libdw)
  • GNU autotools (autoconf, automake, and libtool) and pkgconf

Then, run:

$ git clone
$ cd drgn
$ python3 build
$ sudo python3 install

See the installation documentation for more details.

Quick Start

To debug the running kernel, run sudo drgn -k. To debug a running program, run sudo drgn -p $PID. To debug a core dump (either a kernel vmcore or a userspace core dump), run drgn -c $PATH. The program must have debugging symbols available.

Then, you can access variables in the program with prog['name'], access structure members with ., use various predefined helpers, and more:

$ sudo drgn -k
>>> prog['init_task'].comm
(char [16])"swapper/0"
>>> d_path(fget(find_task(prog, 1), 0).f_path.address_of_())
>>> max(task.stime for task in for_each_task(prog))
>>> sum(disk.gendisk.part0.nr_sects for disk in for_each_disk(prog))

See the user guide for more information.


Copyright 2018-2019 Omar Sandoval

drgn is licensed under the GPLv3 or later.

You can’t perform that action at this time.