gdb <error reading variable> 用于任何字符串对象

gdb <error reading variable> for any string object

让我们以这个非常简单的程序为例:

// test.cpp
#include <string>
#include <iostream>

using namespace std;

int main() {
    string str = "Hello";
    cout << str << endl;
    return 0;
}

现在我用 g++ 编译器编译这段代码:

g++ -g test.cpp -o test.exe

现在我正在尝试使用 gdb 进行调试:

gdb test.exe

在 main 上设置断点然后到达行 return 0 后,我尝试查看字符串 str 中的内容。但是我无法在控制台中打印它。它说 <error reading variable>。不仅在 gdb 控制台中,甚至 Visual Studio 使用 gdb 的代码 UI 也给出了相同的输出。

这是我的控制台的屏幕截图:

我到处搜索这个,我找到的唯一相关问题是 this,但没有用。 我还在 github VS 代码回购问题上找到了 this post。那里建议的修复可能有效我不确定,我找不到他在我的 Windows 11 机器上建议的设置。

如何在调试模式下读取字符串中的值?

编辑 在@ssbssa 建议我更新 gcc 后,我使用 MSYS2 获取最新的 gcc、g++ 和 gdb 版本。现在我有 gdb 12.1。现在它不再显示旧错误,而是显示“转换字符集:无效参数”。仍在努力让它发挥作用。

首先 运行 你的 gdb 程序像这样:

gdb test.exe

现在在命令行界面中 运行 命令:

set charset UTF-8

这应该可以暂时解决您的问题。唯一的不便可能是每次使用 GDB 在命令提示符下进行调试时都需要 运行 这一行。

我注意到您也在使用 Visual Studio 代码。您可以为 VS Code 安装 C++ 扩展,然后您可以在 launch.json setupCommands 数组中添加命令 set charset UTF-8,如 所示。这样您可以更快地调试您的应用程序。