- Fixed an issue which would rarely cause steps to take a long time.
- Drastically improved memory usage of PDB -> RDI conversion for some workloads, notably PDBs with many small compilation units.
- Added the ability to disambiguate symbol names by module name, debug info
name, or compilation unit name in expressions. This can be done using the
usual syntax, e.g.
my_module.dll!foo, ormy_unit.obj!foo.:can also be used instead of!. - Added the ability to redirect debug string output to any label on a
per-target basis. Those labels can then be evaluated in any watch window or
text visualizer. By default, all targets write to
output, which is automatically visualized by anOutputtab. But if you want different targets to route their debug output to different buffers, you can name the buffers differently, and then view those in separate text views. - Added a
Run To Namecommand. - Added an
Auto Load Last Projectsetting, which will automatically load the most recently loaded project on startup (the old behavior pre-0.9.26). This setting is off by default. - Added right-click menus for watch expressions, to easily find them in a memory view, or to break when their value changes.
- Added preliminary support for symbol servers. First, the debugger can attempt
to download debug info for any module via the
Download Module Debug Infocommand (also accessible by right-clicking a module). Second, the debugger can be configured to automatically do this for all modules which don't have debug info via theAuto Download Debug Infosetting. The local cache path and server URLs used by the debugger for downloading symbols are parsed from the_NT_SYMBOL_PATHenvironment variable. If that environment variable is not configured, then it falls back to the defaults ofC:/SymbolCacheandhttps://msdl.microsoft.com/download/symbols. - Adjusted the default dark theme.
- Made several UI visual improvements.
- Fixed a few issues relating to offline symbol evaluation (evaluation of
symbols in debug info when not debugging); this was sometimes preventing
function listers (e.g. used in
Go To Name) from working when not debugging. - Fixed the debugger's snap-to-code-location rule when a
Disassemblytab is occupying the same panel as source code tabs. Previously, the debugger would overly aggressively switch back to source code tabs. Now, it should respect the preference of disassembly correctly. - Improved the stability of the step-over-line operation. Our stepping
algorithm would sometimes cause spurious (and rarely, non-spurious)
access violation exceptions when a thread would try to execute at address
0x38f. This most regularly surfaced when an exception on one thread (like a breakpoint being hit) would interrupt stepping on another thread. This has been resolved, and stepping in such scenarios should be much more reliable. - Fixed some crashes in the PDB -> RDI converter. (#792, #803)
- Fixed a bug which was sometimes causing a step-over operation to resume the process without catching the target thread after its step completed. (#804)
- Adjusted evaluation visualizations to include fully qualified symbol names. (#809)
- /OPT:REF Fixed a race in the dead-code-elimination pass where the linker sometimes erroneously removed live sections.
- Fixed a bug where the linker emitted relocations for empty COFF resource entries, which lead to "relocating against symbol that is in a removed section" errors.
- Added the /RAD_TYPE_SERVER switch to run the type-dedup pass on object files, producing RRT files that can be passed back on the next link to improve linking speed.
- Added scope ending visualizations to the text view, to display the header of
a scope at the closing position of the scope. This can be turned off via the
Cursor Scope End Annotationssetting. - Added the ability to evaluate
autos, which is a collection of expressions that the debugger determines refer to symbols which are being (or about to be) changed by the selected thread. - Added source-inline and disassembly-inline visualization of auto expressions.
This can be turned off via the
Show Auto Watches In Source / Disassemblysetting. - Added the ability to evaluate local static variables unambiguously, when the
same name is used for multiple local static variables, even when outside the
function containing the local static. This can be done by namespacing the
variable name with the containing function, either using a
::or.operator. (#359) - Added a setting,
Transient Tabs, to disable transient tabs being opened, when the debugger automatically snaps to new code locations. - Added a setting,
Display Pointer Addresses Before Contents, to always force the debugger to show pointer addresses before attempting to visualize to what the pointer points. - Adjusted the
Step Outcommand to perform scope-granularity stepping, rather than only being function-frame-granularity. This uses scope information found in debug info to step out of scopes when possible, rather than always exiting the current function frame. This makes the command much more useful for stepping through larger functions with several scopes of larger work, or for stepping out of loops. (#746) - Adjusted the debugger's user & project configuration file behavior to be less
idiosyncratic with other programs. Project files are no longer auto-loaded
based on the project last loaded during the previous debugger runtime.
Creating a new user or project also does not immediately require choosing a
path for the file; these can later be specified using the respective
Savecommands. (#743) - Adjusted the debugger to automatically set the current path when loading a project file. (#743)
- Added syntax highlighting and tab-completion for view identifiers in watch expressions.
- Added more in-debugger documentation for views and their arguments, when written in a watch expression.
- Moved configuration data previously treated as project data to being user data, tagged with the associated project. This includes loaded debug info and breakpoints. The effect of this is that project files are much easier to check into source control (they do not change in spurious ways for other users on a project), but project-related user configuration will still be correctly filtered based on whatever project is loaded.
- Improved the debugger's behavior with respect to keeping previously-loaded debug info around. Now, when the debugger begins a new debugging session, it will unload all loaded debug info, and it will only reload debug info that is actively found to be needed by debuggees. This preserves the debugger's ability to use debug info without debugging for features like go-to-definition and type evaluation, but it stops the debugger from keeping old and unneeded debug info loaded indefinitely (until it is manually unloaded). (#711)
- Adjusted recent project visualization to include the name of the project,
specified with the
Project Namesetting. - Renamed
SwitchtoOpen Source File From Debug Info, to better represent the command's functionality. - Adjusted file path evaluation visualization to include the full path to the
containing folder, when it is not obvious from context (for instance, if the
file evaluation is a child evaluation of a folder evaluation, the containing
folder path is not shown; if the file path is evaluated standalone, as it is
in the lister generated for the
Open Source File From Debug Infocommand, then the containing folder path is shown). - Improved visualization of unmapped addresses in the memory view. Now, instead
of bytes at these addresses being displayed as
0with a special background, they are displayed asx, and the annotations for these addresses (displayed at the bottom of the memory view, for the cursor's cell) explicitly label them as being unmapped. - Improved visualization of unmapped addresses in watch expressions. Now, instead of only being colored differently with evaluations reading as zeroed memory, the value will explicitly label addresses as unmapped when possible.
- Fixed a leak which most notably manifested during rapid creation/destruction of new threads. (#780)
- Fixed a leak related to debugger's config state. This was difficult to reproduce, but it may fix leaks experienced after running the debugger for an extended period of time.
- Fixed a bug where cross-module evaluations would resolve to incorrect
addresses, due to using the incorrect module's base virtual address. This was
also causing broken behavior sometimes in the
Go To Namelister, and other similar UIs. - Fixed a bug where panels without tabs were unnecessarily keeping the debugger UI awake in some cases.
- Fixed a bug preventing hover evaluation from working on indexing expressions. (#707)
- Replaced the DWARF -> RDI converter with a new multithreaded version, which should execute much faster on larger DWARF debug info, and produce much smaller RDI output, due to the addition of type deduplication.
- Introduced structured namespaces to RDI, which structurally encode namespace
hierarchies for debug info symbols, instead of this information being
implicitly baked using language-specific conventions into symbol names. This
is used to deduplicate repeated namespace prefixes from symbol names, leading
to a smaller string footprint for generated RDIs. Symbols now only store
their partially-qualified name. For example, for a C++ symbol
A::B::C, the symbol itself will store its name asC, but it will also record its container as beingB.B, then, will record its container as beingA. This allows users of RDI to dynamically construct the fully-qualified name as needed, and it allows for more reliable and language-agnostic usage of partially-qualified symbol names. - Adjusted the debugger to not rely on
SynchronizationBarrierfunctions on Windows when they're not available (pre-Windows-8). (#739)
- Implemented /DEBUG:GHASH
- Fixed an issue where an import thunk or import address could be linked from the currently searched library instead of the library where the first import reference was found. For example, if the first pass finds the import thunk in foo.lib and the second pass resolves symbol to the import address in bar.lib, the linker now always linkes the import thunk and import address members from the library where the first reference was found.
- /OPT:REF: Fixed an issue with garbage collection of associated sections and weak symbols that led linker to remove live sections.
- /OPT:REF Added relocation batching to reduce contention on the global reference list during garbage collection.
- Added a dedicated cursor address bar to the memory view. This can be focused
with the keyboard with the
Focus Menucommand. By default, this command is bound toAlt + D, but if you have existing configuration, you may need to bind it yourself manually (this can be done in the palette). This address bar accepts any expression, and controls the cursor's address. All other configuration options are still available in the memory view settings. - Added "Peek Types" to the memory view. These control the set of types which are used to interpret bytes at the cursor. Options exist for basic cases, like integers and floats, but the view also supports entering a list of full type expressions, which can include user-defined types like structures.
- Added annotations for members of structure variables to the memory view.
- Added a dedicated zoom setting for the memory view.
- Added a setting for automatically determining the number of columns in the memory view based on the available space.
- Fixed many bugs and improved visuals in the memory view. (#690)
- Fixed the debugger incorrectly evaluating pointer casts of registers in
register space, rather than promoting them to process address space
evaluations. This fixes cases where expressions like
(int *)raxwere not evaluating correctly. (#659) - Fixed the debugger incorrectly requiring multiple step operations when source
lines mapped to multiple discontiguous ranges of instructions. This most
notably showed up with certain styles of
for-loops, especially with Clang and other non-C/C++ languages, and function prologues in non-C/C++ languages. - Fixed the debugger treating the
foo, xfastpath forhex(foo)differently thanhex(foo), in that the hexadecimal setting was not being inherited. - Fixed the debugger leaking debug info conversion process handles. This addresses cases where the debugger was preventing stale debug info from being updated, after a rebuild. (#736)
- Fixed the debugger not correctly using target-embedded markup data. (#702)
- Fixed the debugger not showing full call stacks when the top instruction pointer is located at a 0 address.
- Fixed integer casts producing incorrect values. (#754)
- Fixed the PDB -> RDI converter's interpretation of certain empty argument lists in function types in PDB. This fixes some cases where local variables were being interpreted as parameters, which resulted in incorrect evaluation results. (#751)
- Fixed several crashes and instabilities. (#735)
- Added a dedicated settings button to the focused tab. This opens the same menu as right-clicking the tab, but this makes this menu (and thus all options for all tabs and views) more discoverable.
- Added optional cursor trails, to visualize cursor motion. Can be turned off
by toggling the
Cursor Trailsetting. - Added project names. When set, this name is used for displaying the project instead of the project filename in the UI and window titles.
- Adjusted the rules for explicit file location finding commands (like
Switch, orSwitch To Partner File), such that they prefer creating new non-transient tabs, even if the target file is found within an existing transient tab. - Adjusted the source code context menu to activate commands with a single press, rather than the usual double click behavior from general palettes.
- Optimized debug info generation to reduce memory usage in large links by 25%.
- Fixed a determinism issue that caused linker to write unreliable debug info.
- Fixed over-reservetaion of PDB pages, reducing the PDB size.
- Implemented /INFERASANLIBS
- Implemented /WHOLEARCHIVE
- Implemented /PDBSTRIPPED
- Set correct defaults for unload and bind import tables.
- Added the ability for the debugger to load, use, and evaluate using debug
info, even when not actively debugging. The debugger will now keep a process'
debug info loaded, even after the process ends. It stores the set of loaded
debug info files in the project configuration file, meaning it will also
automatically load the same debug info across many runs. Debug info can also
be loaded manually (without ever launching a process) with the
Load Debug Infocommand. There is also a new tab,Debug Info, which allows viewing and managing the set of loaded debug info files. - Improved the debugger's behavior when used as a drag & drop target, to allow for debug info loading as an option (when relevant), and to better handle the case where many files (potentially of different types) are dropped together.
- Improved debug info searching performance and reponsiveness in large projects.
- Fixed some crashes and incorrect results with the new
listview. - Fixed some cases where RDIs did not contain some basic types from their originating PDBs.
- Allowed
.and->operators to be used with array types. - Fixed the debugger's treatment of quoted command line arguments when building
targets. In previous versions, calling
raddbg main.exe "foo bar baz"would create a targetmain.exewith argumentsfoo bar baz(dropping the quotes). This is now fixed, such that the target's arguments string will also contain the quotes, and pass them to the target when launched. - Fixed the debugger not correctly responding (through font and UI scale) to DPI changes.
- Fixed the debugger incorrectly generating conflicting source line info records in PDB -> RDI conversion, which in some scenarios was preventing source line maps from working (leading to breakpoint resolution failing).
- Other small fixes, improvements, and tweaks.
- Further improved PDB -> RDI conversion performance & memory usage.
- Adjusted limits for the amount of PDB -> RDI conversion work that the debugger will kick off, to prevent PDB -> RDI conversion interfering with debuggee performance.
- Reintroduced the
listlens, which gathers all nodes in a linked list, and visualizes them as a flat list of pointers (the same as how an array of pointers is visualized). - Fixed a crash when closing empty Geometry 3D views. (#652, #657)
- Fixed the debugger not visualizing
enumtypes when evaluated through a bitfield type. (#655) - Fixed the PDB -> RDI conversion not correctly generating location information
for function parameters, when the EXE/PDB were built to include support for
Edit and Continue (
-ZIswitch). (#656)
- Fixed a crash when using the
--compressoption, when generating RDI files.
- Further improved PDB -> RDI conversion performance.
- Capped the number of additional threads / processes spawned for PDB -> RDI conversion.
- Prioritize PDB -> RDI conversion based on what is actually found to be necessary by the debugger, rather than converting all PDBs in the order in which they're discovered.
- Added preliminary support for DWARF -> RDI conversion on Windows.
- The debugger now relies on source file checksums to determine whether or not a source file is out-of-date with respect to what was compiled when debug info was produced, rather than just the modification timestamp.
- The debugger now will rely on debug info to detect the language of source code
files, if it cannot infer from the source file's extension, or view settings.
This will enable features like syntax highlighting and hover evaluation in
cases like
.inlfiles being included in C++ projects. - The debugger now will restore the last focused window when continuing automatically. (#245, #596)
- Watch tables have been simplified in that they no longer have a separate
column for evaluation types, since this was usually taking a lot more space
than it deserved. The type of evaluations is still displayed in watch table
cells, and it can always be evaluated directly via
typeof. - Type evaluations have been simplified in watch tables as well; they no longer
have untitled columns for sizes and offsets, this is instead displayed as
an extra note by default. Similar behavior to the original behavior can still
be obtained using the
columnsview, if needed. - The debugger no longer uses complex
uniontypes for most registers, and instead just displays the register value plainly. - The hover evaluation UI has been made larger when needed.
- The debugger now prefers matching global, function, and type identifiers to the most relevant debug info and module in context; this fixes evaluation in some multi-process debugging contexts. (#581)
- Fixed the debugger unnecessarily stripping
enumtype information when accessed through array operators. (#634) - The debugger now understands a standalone
unsignedkeyword as anunsigned inttype, to match C rules. - The debugger now uses the current working directory to form the working directory for targets specified on the command line, to match behavior when running a command from the command line without the debugger.
- Improved call stack computation performance.
- Improved debugger memory usage over long periods of time.
- Fixed string-pointer comparison not working with not-equal (
!=) operations. - Fixed a bug which was causing bad debuggee performance on some threads after some interactions with the debugger controller.
- Fixed incorrect results when adding two register values. (#642)
- Fixed the interpretation of register expressions in visualizers. (#649)
- Fixed "forever loading" states in disassembly views in some cases. (#643)
- Fixed jittering on window resizing. (#636)
- Fixed the bitmap visualizer crashing in some circumstances relating to unsupported bitmap sizes. (#444, #563)
- Fixed a crash when an empty
cast()expression would be evaluated. (#625) - Fixed a crash when an invalid expression would be visualized using the
textview. (#647)
- Changed symbol resolution in libaries to match MSVC behavior.
- Optimized image building step to reduce memory usage.
- Linker memory maps all input files by default to lower memory usage.
(
/RAD_MEMORY_MAP_FILES) - If debug info is available, linker uses it to show file and line number for unresolved relocations.
- Improved base relocation build performance for large images, cutting build time by 70%.
- Added stubs for
/Brepro,/D2, and /ErrorReport to improve compatability with existing response files - Implemented section garbage collection (
/OPT:REF) - Fixed bug where thread local variables pointed to incorrect types.
- Changed rules for weak and undefined symbols, now weak symbol is not allowed to replace an undefined symbol.
- Linker no longer creates thunks for imports that don't require them.
- The binary utility, like the debugger, now can convert DWARF debug info to RDI files. When both DWARF and PDB info is present, it can now convert both, and produce a single final RDI file with all information.
- Textual dumping of RDI files is now done in parallel, massively improving dumping performance.
- PDB -> Breakpad conversion performance has now been parallelized to a greater degree, improving performance.