New features:
- A new API representing threads was added. The `Thread` class represents a thread. `Thread.stack_trace()` returns the stack trace for the thread. `Program.threads()` returns an iterator over the threads in the program. `Program.thread()` returns a thread given its thread ID. `Program.main_thread()` returns the main thread of the program. `Program.crashed_thread()` returns the thread that caused the program to crash. Contributed by Kevin Svetlitski and Mykola Lysenko.
- `Program.symbols()` was added. It returns all ELF symbols in the program, optionally filtered by a name or address. Contributed by Stephen Brennan.
- Support for looking up C++ classes with `Program.type()` was added. Contributed by Mykola Lysenko.
- Support for setting the default program language (`Program.language`) was added.
- Helpers for getting the Linux kernel log buffer were added (`drgn.helpers.linux.printk.get_printk_records()` and `drgn.helpers.linux.printk.get_dmesg()`). Contributed by Alex Zhu.
- Helpers for translating between Linux kernel socket objects and inode objects were added (`drgn.helpers.linux.net.SOCKET_I()` and `drgn.helpers.linux.net.SOCK_INODE()`). Contributed by Peilin Ye.
- A helper for getting the Linux kernel's idle tasks was added (`drgn.helpers.linux.sched.idle_task()`).
- A helper for decoding Linux kernel `struct page` flags was added (`drgn.helpers.linux.mm.decode_page_flags()`).
- Generic helpers for decoding flags were added (`drgn.helpers.decode_flags()` and `drgn.helpers.decode_enum_type_flags()`).
Bug fixes:
- A crash when encountering kernel modules processed by `objcopy --only-keep-debug` was fixed. Contributed by Peilin Ye.
- An endianness bug when debugging kernel modules that use a different byte order than the host was fixed.
- A compilation error on older versions of GCC was fixed. Contributed by Alakesh Haloi.
- libdrgn is now linked against libm to fix undefined references to `rint`.
- `drgn.helpers.linux.percpu.per_cpu_ptr()` was fixed to support !SMP kernels.
- A `TypeError` when `drgn.helpers.linux.rbtree.rb_find()` doesn't find a match was fixed.
- A memory leak when using an invalid `TypeTemplateParameter` was fixed.
- A missing type annotation for `drgn.Language.CPP` was added.
- `drgn_stack_trace_destroy()` was fixed to allow a `NULL` argument like other `destroy()` functions.
Other improvements:
- Linux kernel support was tested up to v5.17-rc6.
- The CLI now diagnoses the common mistake of passing a core dump file where a script is expected.
- `drgn.helpers.linux.list.list_for_each_entry()`, `drgn.helpers.linux.list.list_for_each_entry_reverse()`, `drgn.helpers.linux.list.hlist_for_each_entry()`, `drgn.helpers.linux.list_nulls.hlist_nulls_for_each_entry()`, and `drgn.helpers.linux.rbtree.rbtree_inorder_for_each_entry()` were optimized to only look up the entry type once per call.
- Parsing of type names in `Program.type()` was slightly optimized.
- Lookups of built-in kernel variables (e.g., `UTS_RELEASE`, `PAGE_SIZE`) were slightly optimized.
- `Program.type()` now accepts a `Type`. This makes it easier to write helpers that accept a type name or a `Type`.
Build system:
- Python is now required to build libdrgn even if the Python bindings are disabled.
- GNU Awk is no longer required to build drgn.
- Additional compiler warnings are now enabled by default. Developers should enable them as errors.
- Configuration options for developers to enable ASan (contributed by Kevin Svetlitski) and UBSan were added.
Internal:
- Developer documentation was improved.
- [`pre-commit`](https://pre-commit.com/) was configured to enforce coding standards. Contributed by Stephen Brennan.
- s390x and EPEL 9 builds were enabled on Packit. Contributed by Davide Cavalca.
- Test cases using `/proc/vmcore` in a kdump environment were added. Contributed by Kevin Svetlitski.
- Test cases for the Linux kernel red-black tree and linked list helpers were added.