# 0.2.0 (Released April 28th, 2026)

These are some of the highlights of drgn 0.2.0. See the GitHub release for the full release notes, including more improvements and bug fixes.

## Debugging QEMU Over QMP

drgn can now debug QEMU guests over the QEMU Machine Protocol (QMP). This is typically slower than running drgn inside of the virtual machine, but it has a few benefits:

- It requires less setup and fewer resources in the VM itself.

- It can be used when the VM is hung or in a bad state.

To use this, run QEMU with `-qmp unix:/path/to/sock,server=on,wait=off -device vmcoreinfo`, then run drgn with `--qemu`:

    $ drgn --qemu /path/to/qmp.sock --kernel-directory /path/to/kernel
    ...
    >>> prog["UTS_RELEASE"]
    (const char [24])"7.0.1"
    >>> for task in for_each_task():
    ...     print(task.comm)
    ...

The programmatic equivalent is `drgn.Program.set_qemu_qmp()`.

(You can also use a TCP socket or omit the vmcoreinfo device, but then you will need to provide the vmcoreinfo to drgn manually.)

## Sysfs Helpers

Muskan Goyal contributed several helpers for working with sysfs(5).

`sysfs_lookup_node()` finds the `struct kernfs_node *` for a given sysfs path:

    >>> sysfs_lookup_node("/sys/block/nvme0n1")
    *(struct kernfs_node *)0xffff8f554b396110 = {...}

`sysfs_lookup_kobject()` similarly finds the `struct kobject *`:

    >>> sysfs_lookup_kobject("/sys/block/nvme0n1")
    *(struct kobject *)0xffff8f554e85eb10 = {...}

`sysfs_lookup()` finds a more specific structure if possible, like a `struct device *`:

    >>> sysfs_lookup("/sys/block/nvme0n1")
    *(struct device *)0xffff8f554e85eb10 = {...}

`sysfs_listdir()` lists the contents of a sysfs directory:

    >>> sysfs_listdir("/sys/block/nvme0n1")
    [b'uevent', b'ext_range', ...]

`kobject_path()` gets the canonical sysfs path of a `struct kobject *`:

    >>> kobject_path(sysfs_lookup_kobject("/sys/block/nvme0n1"))
    b'/sys/devices/pci0000:00/0000:00:06.0/0000:04:00.0/nvme/nvme0/nvme0n1'

## Calling Multiple Functions with Kmodify

`drgn.helpers.experimental.kmodify.call_functions()` was added. It calls multiple functions in the kernel at once much more efficiently than separate `call_function()` calls by inserting a single kernel module for all of the calls. This is useful for tasks like cleaning up after reference leaks:

    >>> leaked_namespaces
    [Object(prog, 'struct net *', value=0xffff8f568869af80), ...]
    >>> call_functions([("netns_put", ns) for ns in leaked_namespaces])

## Linux 7.1 Support

This release contains several updates to handle changes in Linux 7.1.

A change to the ORC unwinder format used for x86-64 in Linux 7.1 broke stack unwinding. This error is fixed in this release:

    >>> stack_trace(1)
      ...
    Exception: unrecognized .orc_header

A change in Linux 7.1 broke `slab_cache_for_each_allocated_object()`, `slab_cache_usage()`, and `slab_object_info()`. This error is fixed in this release:

    >>> slab_cache_usage(prog["mnt_cache"])
    Traceback (most recent call last):
      ...
    AttributeError: 'struct kmem_cache' has no member 'node'

A change in Linux 7.1 broke `PageCompound()`, `PageHead()`, `PageTail()`, and `compound_head()`. This error is fixed in this release:

    >>> compound_head(page)
    Traceback (most recent call last):
      ...
    AttributeError: 'struct page' has no member 'compound_head'

A change in Linux 7.1 made `is_pp_page()` always return false.

A change in Linux 7.1 broke `inode_path()` and `inode_paths()`. This error is fixed in this release:

    >>> inode_path(inode)
    Traceback (most recent call last):
      ...
    LookupError: 'struct dentry' has no member 'd_u'