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
,如 所示。这样您可以更快地调试您的应用程序。
让我们以这个非常简单的程序为例:
// 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
,如