GDB如何在运行时评估C表达式
在调试时,我最近注意到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后打印正确的值)并打印v.at(2)== 3,其值为true. 我想知道GDB是如何做到这一点的. This SO question暗示它是“在内存中编译”的东西,但没有进一步详细说明,所以我想知道它是否使用某种JIT来使这一切工作或其他什么?当我输入并运行它时,他们是否在内联编译代码?他们是否有一个框架来在调试环境中动态评估C?本质上,我想在我正在编写的调试器中重现这一点来评估断点处的表达式,这就是为什么我很好奇GDB是如何做到的. 解决方法
简答:它不编译代码.
答案很长: >您调用print命令,该过程在printcmd.c中进行 您可以专注于call_function_by_hand的代码以便更好地理解. 注意:编译与打印/调用不同. 完整答案: 在几天内,我可能会详细分析GDB如何实现此功能,以便进一步阅读. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |