简单代码导致读取变量时出错: 无法访问地址的内存。

4

我正在尝试使用支持Python的gdb MinGW-builds,但遇到了错误。这是一个相当简单的代码,在MSVC下调试时运行良好。

D:\CppProject\c1\bin\Debug>gdb c1.exe
GNU gdb (GDB) 7.6
(copyright, license, bug report, etc omitted here)
Reading symbols from D:\CppProject\c1\bin\Debug\c1.exe...done.
(gdb) l
1       #include <iostream>
2       #include <vector>
3
4       using namespace std;
5
6       int main()
7       {
8           vector<string> v;
9           v.push_back("first");
10          v.push_back("second");
(gdb)
11          cout<<v[0]<<endl;
12          cout<<v[1]<<endl;
13
14          return 0;
15      }
(gdb) break 11
Breakpoint 1 at 0x4016c9: file D:\CppProject\c1\main.cpp, line 11.
(gdb) run
Starting program: D:\CppProject\c1\bin\Debug\c1.exe
[New Thread 1256.0xbe8]

Breakpoint 1, main () at D:\CppProject\c1\main.cpp:11
11          cout<<v[0]<<endl;
(gdb) p v
$1 = std::vector of length 2, capacity 2 = {"first", "second"}
(gdb) p v[0]
$2 = <error reading variable: Cannot access memory at address 0x29a2ca50>

1
不确定这是否有任何影响,但您应该 #include <string> - Colonel Panic
1
我刚刚测试了你的代码,在“GNU gdb (GDB) Red Hat Enterprise Linux (7.2-48.el6)”环境下运行良好。v[0]的值被正确打印出来。 - CS Pei
@JohnSmith 我在CentOS 6.4 gdb 7.2-60.e16_4.1下测试过,也能正常工作。我想知道这个问题是Windows特定的,还是MinGW-builds和Win7特定的? - duleshi
@n.m. 你在Windows下是否遇到过我的问题? - duleshi
我无法在cygwin版本的gdb上重现它(它一直挂起),但mingw版本可以重现。Python在这里没有发挥作用,是operator[]无法正确评估。您不应该依赖于gdb能够调用operator[];如果它在您的程序中从未实例化,或者总是内联的,则就gdb而言不存在operator[] - n. m.
显示剩余3条评论
1个回答

2
这可能听起来很基础 - 你是否使用了-O0编译?我怀疑编译器优化可能导致你的问题。

这真是救命稻草。我重新编译了我的库,没有优化,然后我能够读取每个成员变量的内容,甚至是私有的。 - Gubatron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接