当我在调试程序时,最近注意到 GDB 有能力在调试程序时评估“复杂”的表达式,我想知道它是如何做到的。例如,给定下面的代码:
int main() {
std::vector<int> v = {1, 2, 3};
int k = 0;
std::cin >> k;
v.push_back(k);
return v.at(0);
}
我可以编译程序g++ -g myprogram.cpp
并在 GDB 中进行调试,这使我能够输入类似print v.at(4);
(在动态输入 k
后打印正确的值)和 print v.at(2) == 3
这样的东西,它会计算出真值。
我想知道 GDB 是如何做到这一点的。这个 SO 问题暗示它是"在内存中编译"的某些东西,但没有进一步解释,所以我想知道它是使用了某种 JIT 还是其他什么?他们是在我输入时内联编译代码并运行吗?他们有一个框架来在调试上下文中动态评估 C++ 吗?本质上,我想在我正在编写的调试器中重现此功能,在断点处评估表达式,这就是为什么我很好奇 GDB 如何做到这一点。