When debugging, I recently noticed that GDB has the ability to evaluate "complex" expressions while debugging a program, and I am wondering how it does this. For example, with the following code:
int main() {
std::vector<int> v = {1, 2, 3};
int k = 0;
std::cin >> k;
v.push_back(k);
return v.at(0);
}
I am able to compile the program g++ -g myprogram.cpp
and debug it in GDB which allows me to type things like print v.at(4);
(which prints the correct value after k
is dynamically entered) and print v.at(2) == 3
which evaluates to true.
I am wondering how GDB does this. This SO question hints that it is something "compiled in memory" but does not elaborate further, so I am wondering does it use some sort of JIT to make this all work or something else? Are they compiling the code inline as I type it and running it? Do they have a framework to evaluate C++ on the fly in the debugging context? In essence, I want to reproduce this in a debugger I am writing to evaluate expressions at breakpoints which is why I am curious how GDB does it.