GDB如何在运行时评估C表达式

GDB如何在运行时评估C表达式,第1张

概述在调试时,我最近注意到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 mypro 在调试时,我最近注意到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中进行
>它调用在eval.c中定义的evaluate_Expression,它通过读取目标内存并在gdb内为标准运算符计算它来计算表达式,否则使用call_function_by_hand.
> call_function_by_hand在infcall.c中定义.调用时,该过程将暂停目标执行(有时不会,因此可能会使具有此功能的多线程程序崩溃).
>将代码注入正在调试的程序中.
>通过读取内存来检索结果,并在必要时取消暂停.

您可以专注于call_function_by_hand的代码以便更好地理解.

注意:编译与打印/调用不同.

完整答案:

在几天内,我可能会详细分析GDB如何实现此功能,以便进一步阅读.

总结

以上是内存溢出为你收集整理的GDB如何在运行时评估C表达式全部内容,希望文章能够帮你解决GDB如何在运行时评估C表达式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1256029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存