mirror of
https://github.com/JakeHillion/drgn.git
synced 2024-12-23 17:53:07 +00:00
Programmable debugger
1d4854a5bc
After the libdwfl conversion, we apply ELF relocations with libdwfl
instead of our homegrown implementation. However, libdwfl is much slower
at it than the previous implementation. We can work around this by
(again) applying ELF relocations ourselves for architectures that we
care about (x86-64, to start). For other architectures, we can fall back
to libdwfl.
This new implementation of ELF relocation reworks the parallelization to
be per-file rather than per-relocation. The latter was done originally
because before commit
|
||
---|---|---|
docs | ||
drgn | ||
examples/linux | ||
libdrgn | ||
scripts | ||
tests | ||
.gitignore | ||
.readthedocs.yml | ||
.travis.yml | ||
COPYING | ||
MANIFEST.in | ||
README.rst | ||
setup.py |
drgn ==== .. image:: https://travis-ci.org/osandov/drgn.svg?branch=master :target: https://travis-ci.org/osandov/drgn :alt: Build Status .. image:: https://readthedocs.org/projects/drgn/badge/?version=latest :target: https://drgn.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status .. start-introduction drgn (pronounced "dragon") is a debugger-as-a-library. In contrast to existing debuggers like `GDB <https://www.gnu.org/software/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: .. code-block:: pycon >>> 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" drgn was developed for debugging the Linux kernel (as an alternative to the `crash <http://people.redhat.com/anderson/>`_ utility), but it can also debug userspace programs written in C. C++ support is planned. .. end-introduction Documentation can be found at `drgn.readthedocs.io <https://drgn.readthedocs.io>`_. Installation ------------ 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: .. code-block:: console $ git clone https://github.com/osandov/drgn.git $ cd drgn $ python3 setup.py build $ sudo python3 setup.py install See the `installation documentation <https://drgn.readthedocs.io/en/latest/installation.html>`_ for more details. Quick Start ----------- .. start-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``. 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: .. code-block:: pycon $ sudo drgn >>> prog['init_task'].comm (char [16])"swapper/0" >>> d_path(fget(find_task(prog, 1), 0).f_path.address_of_()) b'/dev/null' >>> max(task.stime for task in for_each_task(prog)) (u64)4192109975952 >>> sum(disk.gendisk.part0.nr_sects for disk in for_each_disk(prog)) (sector_t)999705952 .. end-quick-start See the `user guide <https://drgn.readthedocs.io/en/latest/user_guide.html>`_ for more information. License ------- .. start-license Copyright 2018-2019 Omar Sandoval drgn is licensed under the `GPLv3 <https://www.gnu.org/licenses/gpl-3.0.en.html>`_ or later. .. end-license