gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:15:43 29 4
gpt4 key购买 nike

在调试时,我最近注意到 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 是如何做到这一点的。 This SO question暗示它是“在内存中编译”的东西,但没有进一步详细说明,所以我想知道它是使用某种 JIT 来使这一切工作还是其他什么?他们是否在我输入并运行代码时内联编译代码?他们是否有一个框架可以在调试上下文中即时评估 C++?本质上,我想在我正在编写的调试器中重现它以评估断点处的表达式,这就是为什么我很好奇 GDB 是如何做到的。

最佳答案

简答:它不编译代码。

长答案:

  1. 您调用print 命令,过程发生在printcmd.c
  2. 它调用 evaluate_expression,在 eval.c 中定义,它通过读取目标内存并在 gdb 中为标准运算符计算它来计算表达式,否则使用 call_function_by_hand
  3. call_function_by_handinfcall.c 中定义。调用时,该过程会停止目标执行(有时不会,因此使用此功能可能会使多线程程序崩溃)。
  4. 将代码注入(inject)正在调试的程序中。
  5. 通过读取内存检索结果并在必要时取消暂停。

您可以关注call_function_by_hand的代码以便更好地理解。

注意:compile 不同于print/call

关于c++ - GDB如何在运行时评估C++表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44286394/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com