0.0.23 (Released June 28th, 2023) ================================= These are some of the highlights of drgn 0.0.23. See the `GitHub release `_ for the full release notes, including more improvements and bug fixes. .. highlight:: pycon Virtual Address Translation Helpers ----------------------------------- This release added several Linux kernel helpers for translating virtual addresses. :func:`~drgn.helpers.linux.mm.follow_phys()` translates a virtual address to a physical address in a given address space. For example, to get the physical address that virtual address 0x7f7fe46a4270 maps to in process 115:: >>> task = find_task(prog, 115) >>> address = 0x7f7fe46a4270 >>> print(hex(follow_phys(task.mm, address))) 0x4090270 :func:`~drgn.helpers.linux.mm.follow_page()` translates a virtual address to the ``struct page *`` that it maps to:: >>> follow_page(task.mm, address) *(struct page *)0xffffd20ac0102400 = { ... } :func:`~drgn.helpers.linux.mm.follow_pfn()` translates a virtual address to the page frame number (PFN) of the page that it maps to:: >>> follow_pfn(task.mm, address) (unsigned long)16528 These can be used to translate arbitrary kernel virtual addresses by passing ``prog["init_mm"].address_of_()``:: >>> print(hex(follow_phys(prog["init_mm"].address_of_(), 0xffffffffc0483000))) 0x2e4b000 Vmalloc/Vmap Address Translation Helpers ---------------------------------------- :func:`~drgn.helpers.linux.mm.vmalloc_to_page()` is a special case of :func:`~drgn.helpers.linux.mm.follow_page()` for vmalloc and vmap addresses:: >>> vmalloc_to_page(prog, 0xffffffffc0477000) *(struct page *)0xffffc902400b8980 = { ... } Likewise, :func:`~drgn.helpers.linux.mm.vmalloc_to_pfn()` is a special case of :func:`~drgn.helpers.linux.mm.follow_pfn()` for vmalloc and vmap addresses:: >>> vmalloc_to_pfn(prog, 0xffffffffc0477000) (unsigned long)11814 ``contrib`` Directory --------------------- Martin Liška, Boris Burkov, and Johannes Thumshirn added lots of new scripts to the ``contrib`` directory: - :contrib:`btrfs_tree.py`: work-in-progress helpers for Btrfs B-trees - :contrib:`btrfs_tree_mod_log.py`: simulator for the Btrfs tree modification log - :contrib:`dump_btrfs_bgs.py`: print block groups in a Btrfs filesystem - :contrib:`kcore_list.py`: print memory regions from ``/proc/kcore`` - :contrib:`kernel_sys.py`: print system information (similar to crash's ``sys`` command) - :contrib:`mount.py`: print a filesystem mount table - :contrib:`platform_drivers.py`: print registered `platform drivers `_ - :contrib:`vmmap.py`: print memory mappings in a process (similar to ``/proc/$pid/maps``) - :contrib:`vmstat.py`: print information about kernel memory usage Embedding Interactive Mode -------------------------- :meth:`drgn.cli.run_interactive()` runs drgn's interactive mode. It can be used to embed drgn in another application. For example, you could use it for a custom :class:`drgn.Program` that the standard drgn CLI can't set up: .. code-block:: python3 import drgn import drgn.cli prog = drgn.Program() prog.add_type_finder(...) prog.add_object_finder(...) prog.add_memory_segment(...) drgn.cli.run_interactive(prog) Full s390x Support ------------------ Sven Schnelle contributed s390x virtual address translation support. This is the state of architecture support in this release: .. list-table:: drgn 0.0.23 Architecture Support :header-rows: 1 * - Architecture - Linux Kernel Modules - Stack Traces - Virtual Address Translation * - x86-64 - ✓ - ✓ - ✓ * - AArch64 - ✓ - ✓ - ✓ * - ppc64 - ✓ - ✓ - * - s390x - ✓ - ✓ - ✓ * - i386 - ✓ - - * - Arm - ✓ - - * - RISC-V - ✓ - - Linux 6.3 & 6.4 Support ----------------------- Linux 6.3 and 6.4 had an unusual number of breaking changes for drgn. Here are some errors you might see with older versions of drgn that are fixed in this release. On startup (fixed by Ido Schimmel):: warning: could not get debugging information for: kernel modules (could not find loaded kernel modules: 'struct module' has no member 'core_size') From :meth:`drgn.Program.stack_trace()` and :meth:`drgn.Thread.stack_trace()`:: Exception: unknown ORC entry type 3 From :func:`~drgn.helpers.linux.mm.compound_order()` and :func:`~drgn.helpers.linux.mm.compound_nr()`:: AttributeError: 'struct page' has no member 'compound_order' From :func:`~drgn.helpers.linux.block.for_each_disk()` and :func:`~drgn.helpers.linux.block.for_each_partition()`:: AttributeError: 'struct class' has no member 'p' Python 3.12 Support ------------------- Python 3.12, currently in beta, changed an implementation detail that drgn depended on, which caused crashes like:: Py_SIZE: Assertion `ob->ob_type != &PyLong_Type' failed. Stephen Brennan fixed this.