【发布时间】:2017-05-31 13:40:18
【问题描述】:
在调试时,我最近注意到 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 后打印正确的值)和评估为 true 的 print v.at(2) == 3 .
我想知道 GDB 是如何做到这一点的。 This SO question 暗示它是“在内存中编译的”,但没有进一步详细说明,所以我想知道它是使用某种 JIT 来使这一切正常工作还是其他什么?他们是否在我输入和运行代码时内联编译代码?他们是否有一个框架可以在调试上下文中动态评估 C++?本质上,我想在我正在编写的调试器中重现这一点,以在断点处评估表达式,这就是为什么我很好奇 GDB 是如何做到的。
【问题讨论】:
-
我不清楚你希望得到什么样的答案。 Gdb 能够在被调试程序的上下文中分析 C 和 C++ 表达式,在二进制文件中包含的调试信息的帮助下,也可能在源代码可用时使用。但是你已经知道了,对于这个场地来说,细节会很长。
-
@JohnBollinger 我想我必须“使用源代码”,但我想知道的是他们如何评估表达式。他们是否在我输入和运行代码时内联编译代码?他们是否有一个框架可以在调试上下文中动态评估 C++?本质上,我想在我正在编写的调试器中重现这一点,以在断点处评估表达式,这就是为什么我很好奇 GDB 是如何做到的。谢谢!
-
您的问题似乎更侧重于 C++。我建议你删除 C 标签。
-
我对 GDB 的源代码进行了一些调查。希望对您有所帮助。
标签: c++ gdb expression