Skip to main content

Scriptable debugger library

Project description

PyPI CI Status Documentation Status https://img.shields.io/badge/code%20style-black-000000.svg

drgn (pronounced “dragon”) is a debugger with an emphasis on programmability. 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(mod.name)
...
(char [56])"snd"
(char [56])"evdev"
(char [56])"i915"

Although other debuggers like GDB have scripting support, drgn aims to make scripting as natural as possible so that debugging feels like coding. This makes it well-suited for introspecting the complex, inter-connected state in large programs. It is also designed as a library that can be used to build debugging and introspection tools; see the official tools.

drgn was developed at Meta 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 in progress.

Documentation can be found at drgn.readthedocs.io.

Installation

Package Manager

drgn can be installed using the package manager on some Linux distributions.

  • Fedora >= 32

    $ sudo dnf install drgn
  • RHEL/CentOS >= 8

    Enable EPEL. Then:

    $ sudo dnf install drgn
  • Arch Linux

    Install the drgn package from the AUR.

pip

If your Linux distribution doesn’t package the latest release of drgn, you can install it with pip.

First, install pip. Then, run:

$ sudo pip3 install drgn

This will install a binary wheel by default. If you get a build error, then pip wasn’t able to use the binary wheel. Install the dependencies listed below and try again.

Note that RHEL/CentOS 6, Debian Stretch, Ubuntu Trusty, and Ubuntu Xenial (and older) ship Python versions which are too old. Python 3.6 or newer must be installed.

From Source

To get the development version of drgn, you will need to build it from source. First, install dependencies:

  • Fedora/RHEL/CentOS

    $ sudo dnf install autoconf automake elfutils-devel gcc git libtool make pkgconf python3 python3-devel python3-pip python3-setuptools

    Replace dnf with yum for RHEL/CentOS < 8.

  • Debian/Ubuntu

    $ sudo apt-get install autoconf automake gcc git liblzma-dev libelf-dev libdw-dev libtool make pkgconf python3 python3-dev python3-pip python3-setuptools zlib1g-dev
  • Arch Linux

    $ sudo pacman -S --needed autoconf automake gcc git libelf libtool make pkgconf python python-pip python-setuptools

Optionally, install libkdumpfile if you want support for the makedumpfile compressed kernel core dump format. libkdumpfile is currently only packaged on Fedora and EPEL. For other distributions, you must install it manually.

Then, run:

$ git clone https://github.com/osandov/drgn.git
$ cd drgn
$ python3 setup.py build
$ sudo python3 setup.py install

See the installation documentation for more options.

Quick Start

drgn debugs the running kernel by default; run sudo drgn. 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. Make sure to install debugging symbols for whatever you are debugging.

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

$ sudo drgn
>>> prog['init_task'].comm
(char [16])"swapper/0"

You can use various predefined helpers:

>>> len(list(bpf_prog_for_each(prog)))
11
>>> task = find_task(prog, 115)
>>> cmdline(task)
[b'findmnt', b'-p']

You can get stack traces with prog.stack_trace() and access parameters or local variables with stack_trace['name']:

>>> trace = prog.stack_trace(task)
>>> trace[5]
#5 at 0xffffffff8a5a32d0 (do_sys_poll+0x400/0x578) in do_poll at ./fs/select.c:961:8 (inlined)
>>> poll_list = trace[5]['list']
>>> file = fget(task, poll_list.entries[0].fd)
>>> d_path(file.f_path.address_of_())
b'/proc/115/mountinfo'

See the user guide for more details and features.

License

Copyright (c) Meta Platforms, Inc. and affiliates.

drgn is licensed under the GPLv3 or later.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drgn-0.0.20.tar.gz (1.0 MB view details)

Uploaded Source

Built Distributions

drgn-0.0.20-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ x86-64

drgn-0.0.20-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

drgn-0.0.20-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

drgn-0.0.20-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

drgn-0.0.20-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

File details

Details for the file drgn-0.0.20.tar.gz.

File metadata

  • Download URL: drgn-0.0.20.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.1 pkginfo/1.8.3 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.64.0 CPython/3.10.5

File hashes

Hashes for drgn-0.0.20.tar.gz
Algorithm Hash digest
SHA256 92f9a6b7327091d4d86a8a0f2b564ccff082869dae0471b1f9b6220a7fe2a13a
MD5 560f790daee5c062f6f9983c1241e0ab
BLAKE2b-256 e1f6791e2e8fc49aef2174ca88da1a247d7895e823a0801ad5a16eddfca274d6

See more details on using hashes here.

File details

Details for the file drgn-0.0.20-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for drgn-0.0.20-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 9cdec593a262b9d24491f3c687145d4765c3e14a8f8f8934b72fd8995d9a55d8
MD5 f257be7f830e4df8dc6cc67efc88e8d6
BLAKE2b-256 939c541990bb669e8ad363c9b6e1b9d6f62462e6ea45c2a78e080c68fdfbc30d

See more details on using hashes here.

File details

Details for the file drgn-0.0.20-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

  • Download URL: drgn-0.0.20-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
  • Upload date:
  • Size: 4.2 MB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.1 pkginfo/1.8.3 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.64.0 CPython/3.10.5

File hashes

Hashes for drgn-0.0.20-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 0e87bdb5d1391b20bb693001633744197e50fa8fdab6ace1ffeb91a80db1eee2
MD5 5e7084919cc1e55e1a14100fb3c02c03
BLAKE2b-256 59f7667d8615dd8dd0b49bf2ccb0ffd5ddbbf3b5f6bb629310b4f81763bdc22e

See more details on using hashes here.

File details

Details for the file drgn-0.0.20-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

  • Download URL: drgn-0.0.20-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
  • Upload date:
  • Size: 4.2 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.1 pkginfo/1.8.3 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.64.0 CPython/3.10.5

File hashes

Hashes for drgn-0.0.20-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c45bdb4425befb40c08f0bdae58052db619a59336ee3c2a1aab66fa155095a12
MD5 1122ebf5fe2eee5a11d385f663a38a74
BLAKE2b-256 1a447ab14022802160f542afeab6a9e689bec1655397ac59b16aaa5f682375da

See more details on using hashes here.

File details

Details for the file drgn-0.0.20-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for drgn-0.0.20-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 5f6aa4479dea3b07bec78d41e3534709967959a918006f2289d7ef8dd11835e9
MD5 e07a85c3c6e233ebcdbd3279cc42cf1b
BLAKE2b-256 32ecf63a56ef22b38899ee7870e5cc673cf981ab01ca92ac5a83abfe351205c3

See more details on using hashes here.

File details

Details for the file drgn-0.0.20-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for drgn-0.0.20-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 acbde8da6e5ed5630900c6bcd8fba6c9f1442063f9b8d025f5fa07a87f5c5295
MD5 006ac7c9fa430bf6ac46a281b7ba95e2
BLAKE2b-256 496da20e4cc28a45bd45987f5f84073396011b2fd0dd4e7d95ab502d28f48dd8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page