Dynamic types in LLDB
If you are wondering how debuggers work, I suggest reading Eli Bendersky’s eli-on-debuggers. However after having read these notes myself, I still had one question unanswered. Namely, how can debugger show fields of a class, if the type of the class is known only at runtime?
Consider this situation: you have a pointer of type
A*, which at runtime holds
a value of some subtype of
A. Could the debugger display the fields of the
actual type? Turns out, it can handle cases like the one below just fine!
Could it be possible that information about dynamic types is present in DWARF?
If we look at the DWARF, we’ll see that there’s layout information for both
Derive types, as well as a entry for
x parameter, which says that
it has type
Base. And this makes sense: we don’t know that
until runtime! So debugger must somehow figure the type of the variable
As usual, there’s no magic. For example, LLDB has a hard-coded knowledge of C++
programming language, which allows debugger to inspect types at runtime.
Specifically, this is handled by
LanguageRuntime LLDB plugin, which has a
GetDynamicTypeAndAddress, whose job is to poke the
representation of value to get its real type and adjust pointer, if necessary
(remember, with multiple inheritance, casts may change the value of the
The implementation of this function for C++ language lives in ItaniumABILanguageRuntime.cpp although, unlike C, C++ lacks a standardized ABI, almost all compilers on all non-windows platforms use a specific ABI, confusingly called Itanium (after a now effectively dead 64-bit CPU architecture).