rizin/doc/debug-internals.md

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

219 lines
9 KiB
Markdown
Raw Permalink Normal View History

# Rizin Debugger Internals
The debugger is designed using a multi-tiered plug-in architecture that allows
overriding functionality for architecture or platform-specific reasons.
The bulk of the debugger functionality within Rizin core is split between the
"io", "reg", "bp", and "debug". More information on the specific files within
the tree follows.
2020-10-01 16:13:03 +02:00
## librz/include/r_debug.h
This is the main header file for the debugger. It defines all the relevant
structures and top-level functions, APIs, etc. The debugger plug-in API is also
defined in here.
2020-10-01 16:13:03 +02:00
## librz/io/p/io_debug.c
In order to interface with Rizin IO, a plug-in is provided. This handles, for
example, spawning processes under a debugger.
2020-10-01 16:13:03 +02:00
## librz/reg
The "reg" module provides functionality for reading and writing registers as
well as setting up profiles.
The functionality lives in the following files:
librz/reg/arena.c // ?? used by analysis and debugger
2020-10-01 16:13:03 +02:00
librz/reg/cond.c // condition registers
librz/reg/double.c // support for double-precision floating point numbers
librz/reg/profile.c // ?? used by analysis and debugger
librz/reg/reg.c // top-level register specific code (all of rizin)
2020-10-01 16:13:03 +02:00
librz/reg/value.c // dealing with register values
librz/reg/t/p.c // test code for printing general-purpose registers
librz/reg/t/regdiff.c // ?? test code for?
librz/reg/t/test.c // test code for register handling
2020-10-01 16:13:03 +02:00
## librz/bp
The "bp" subsystem of Rizin implements all the necessary details for dealing
with breakpoints on any given architecture. It handles managing the list of
breakpoints and more.
Rizin supports a multitude of different types of breakpoints.
2018-02-27 03:54:54 -06:00
(`??` is there a list? sw, hw, and trace? anything else??)
2020-10-01 16:13:03 +02:00
librz/bp/bp.c // main breakpoint management code
librz/bp/io.c // setting and resetting breakpoints
librz/bp/parser.h // header for breakpoint parser
librz/bp/parser.c // code for breakpoint parser
2020-10-01 16:13:03 +02:00
librz/bp/plugin.c // breakpoint plugin management
librz/bp/traptrace.c // traptrace
2020-10-01 16:13:03 +02:00
librz/bp/watch.c // watch points (mostly not implemented)
For architecture specific-handling, "bp" delegates various functionality to
plugins. The interface for these plugins is much simpler than other plugins
used in the Rizin debugger -- they only define which byte sequences represent
valid breakpoints for a given architecture.
2020-10-01 16:13:03 +02:00
librz/bp/p/bp_arm.c // ARM64, ARM, Thumb, Thumb-2 (big/little endians)
librz/bp/p/bp_bf.c // Brainfuck!
librz/bp/p/bp_mips.c // MIPS, big/little endian
librz/bp/p/bp_ppc.c // PowerPC, big/little endian
librz/bp/p/bp_sh.c // SuperH
librz/bp/p/bp_x86.c // int3...
2020-10-01 16:13:03 +02:00
## librz/debug/debug.c
The main top-level debugger functionality lives here. It aims to abstract away
the common code flow and integration into Rizin while delegating more nuanced
system interactions to plug-ins.
librz/debug/arg.c // used by the analysis engine
2020-10-01 16:13:03 +02:00
librz/debug/desc.c // code for handling file descriptors inside an inferior
librz/debug/esil.c // ESIL related debugging code
2020-10-01 16:13:03 +02:00
librz/debug/map.c // top-level API for dealing with memory maps
librz/debug/pid.c // top-level API for dealing with processes
librz/debug/plugin.c // top-level debugger plugin API handling
librz/debug/reg.c // top-level code for register r/w and display
librz/debug/signal.c // top-level functions for signals
librz/debug/snap.c // code for saving, restoring, showing memory snapshots
librz/debug/trace.c // top-level tracing API (counting insn hits, etc)
librz/debug/t/main.c // test code for the debugger API
2020-10-01 16:13:03 +02:00
## librz/core/cmd_debug.c
Most of the time a debugger is used by a human to try to understand subtle
problems with software and/or hardware. That task would be very difficult
without a user interface of some kind. The CLI commands exposed to Rizin are
implemented in here. To get more information about this interface, consult the
user manual or try "d?" to get a crash course.
## Debugger Plug-Ins
As mentioned before, the platform specific debugger functionality is delegated
to back-end plugins that implement the necessary interactions, protocols, or
2020-10-01 16:13:03 +02:00
otherwise to get the job done. These plug-ins implement the rizin debugger
plug-in API defined in r_debug.h.
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_bf.c
A debugger plug-in capable of debugging brainfuck code!
2020-10-01 16:13:03 +02:00
librz/debug/p/bfvm.c // Brainfuck VM implementation
librz/debug/p/bfvm.h
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_bochs.c
A debugger plug-in that utilizes bochs emulator to control execution.
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_esil.c
This debugger plug-in enables debugging and tracing Rizin own intermediate
language, Evaluable Strings Intermediate Language (ESIL).
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_gdb.c
A Rizin debugger plug-in that uses a remote GDB server/stub as its backend. The
protocol parsing itself is located at subprojects/rzgdb. And corresponding IO
plugin is located in librz/io/p/io_gdb.c
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_native.c
The "native" debugger plug-in is a bit of a doozy. It implements functionality
for debugging on the most common platforms available: Windows, OSX, Linux, and
BSD. Much of the underlying debug API between these platforms are similar and
thus much of the code within this plug-in is shared. The parts that are not
shared are implemented by platform-specific functions that are provided in the
following files:
2018-02-27 03:54:54 -06:00
// architecture-specific debugger code
2020-10-01 16:13:03 +02:00
librz/debug/p/native/arm.c // unused?
2018-02-27 03:54:54 -06:00
// code for handling backtracing
2020-10-01 16:13:03 +02:00
librz/debug/p/native/bt.c
librz/debug/p/native/bt/fuzzy-all.c
librz/debug/p/native/bt/generic-x64.c
librz/debug/p/native/bt/generic-x86.c
2018-02-27 03:54:54 -06:00
// architecture-specific register handling
2020-10-01 16:13:03 +02:00
librz/debug/p/native/drx.c // x86-specific debug registers
librz/debug/p/native/reg.c // cute include of the files below
librz/debug/p/native/reg/kfbsd-x64.h
librz/debug/p/native/reg/kfbsd-x86.h
librz/debug/p/native/reg/netbsd-x64.h
librz/debug/p/native/reg/netbsd-x86.h
librz/debug/p/native/reg/windows-x64.h
librz/debug/p/native/reg/windows-x86.h
2018-02-27 03:54:54 -06:00
// platform-specific debugger code on Linux
2020-10-01 16:13:03 +02:00
librz/debug/p/native/linux/linux_debug.c // main linux-specific debugging code
librz/debug/p/native/linux/linux_debug.h // including cute penguin ascii art
2018-02-27 03:54:54 -06:00
// architecture-specific register handling on Linux
2020-10-01 16:13:03 +02:00
librz/debug/p/native/linux/reg/linux-arm.h
librz/debug/p/native/linux/reg/linux-arm64.h
librz/debug/p/native/linux/reg/linux-mips.h
librz/debug/p/native/linux/reg/linux-ppc.h
librz/debug/p/native/linux/reg/linux-x64.h
librz/debug/p/native/linux/reg/linux-x64-32.h
librz/debug/p/native/linux/reg/linux-x86.h
2018-02-27 03:54:54 -06:00
// platform-specific debugger code on Windows
2020-10-01 16:13:03 +02:00
librz/debug/p/native/w32.c // !! not used by anything else
librz/debug/p/native/maps/windows.c // platform-specific memory map handling
librz/debug/p/native/windows/windows_debug.c // main code for win32 debugger plugin
librz/debug/p/native/windows/windows_debug.h // including cute windows ascii art
2018-02-27 03:54:54 -06:00
// platform-specific debugger code on XNU (OSX/iOS/etc)
2020-10-01 16:13:03 +02:00
librz/debug/p/native/darwin.c // !! not used by anything else
librz/debug/p/native/maps/darwin.c // platform-specific memory map handling
librz/debug/p/native/xnu/xnu_debug.c // main XNU-specific debugging code
librz/debug/p/native/xnu/xnu_debug.h // including cute apple ascii art
librz/debug/p/native/xnu/trap_arm.c // ARM family hardware bps
librz/debug/p/native/xnu/trap_x86.c // x86 family hardware bps
2020-10-01 16:13:03 +02:00
librz/debug/p/native/xnu/xnu_excthreads.c // additional XNU thread handling
librz/debug/p/native/xnu/xnu_threads.c // XNU thread and register handling
librz/debug/p/native/xnu/xnu_threads.h
2018-02-27 03:54:54 -06:00
// architecture-specific register handling on XNU
2020-10-01 16:13:03 +02:00
librz/debug/p/native/xnu/reg/darwin-x86.h
librz/debug/p/native/xnu/reg/darwin-arm.h
librz/debug/p/native/xnu/reg/darwin-ppc.h
librz/debug/p/native/xnu/reg/darwin-arm64.h
librz/debug/p/native/xnu/reg/darwin-x64.h
// platform-specific debugger code on BSD
2020-10-01 16:13:03 +02:00
librz/debug/p/native/bsd/bsd_debug.c // main BSD debugging code
librz/debug/p/native/bsd/bsd_debug.h
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_qnx.c
A debugger plug-in that enables debugging code natively on QNX systems. Corresponding
2020-10-01 16:13:03 +02:00
IO plugin is located in librz/io/p/io_qnx.c
<!-- TODO: Add qnx documentation -->
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_rap.c
<!-- TODO: Add rap documentation -->
2020-10-01 16:13:03 +02:00
### librz/debug/p/debug_winkd.c
A debugger plugin that enables debugging code remotely via WinDbg protocol.
WinDbg protocol parser is located in subprojects/rzwinkd. Corresponding IO
plugin located in librz/io/p/io_winkd.c <!-- TODO: Add winkd documentation -->
## Conclusion
Best of luck!