可能是我在描述我的问题时遇到的困难是我无法找到其中任何一个实例的原因.我正在使用gdb 7.4-2012.04.
似乎至少涉及两个!=/==和&&/||的表达式 对于向量或向量迭代器将无法在gdb中评估,并出现以下错误:
无法访问地址0x0处的内存
这是一个测试用例,接下来是我的编译行和测试:
#include <stdio.h>
#include <iostream>
#include <stdint.h>
#include <vector>
using namespace std;
typedef char GUID[32];
int main(int argc, char **argv){
vector<int> vec;
for (int i=0; i<5; i++){
vec.push_back(i);
}
for (vector<int>::iterator vecIter=vec.begin(); vecIter!=vec.end(); vecIter++){
int i=0;//Just need a line gdb will recognize for a breakpoint.
}
cout << vec[0] << endl;//g++ needs to include operator[] in the binary for this to work.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我执行的测试的片段:
user@comp$ g++ -g -O0 any_test.cpp
user@comp$ gdb a.out
(gdb) b 16
(gdb) r
Breakpoint 1, main (argc=1, argv=0x7fffffffe288) at any_test.cpp:16
16 int i=0;//Just need a line gdb will recognize for a breakpoint.
(gdb) p *vecIter == vec[1] or *vecIter == vec[2]
Cannot access memory at address 0x0
Run Code Online (Sandbox Code Playgroud)
原始有用的声明不起作用.让我们减少一点,找到问题.
(gdb) p vec[1] or *vecIter == vec[2]
Cannot access memory at address 0x0
(gdb) p vec[1] or *vecIter
$1 = true
(gdb) p 1 or *vecIter == vec[2]
Cannot access memory at address 0x0
Run Code Online (Sandbox Code Playgroud)
在'或'之后看起来问题是'=='.这和其他运营商一样吗?
(gdb) p 1 and *vecIter == vec[2]
Cannot access memory at address 0x0
(gdb) p 1 and *vecIter != vec[2]
Cannot access memory at address 0x0
Run Code Online (Sandbox Code Playgroud)
这是一个响亮的回答.如果我为gdb提取所有功能怎么办?只是让它取消引用并比较一下?
(gdb) p 1 or *vecIter._M_current == vec._M_impl._M_start[1]
$2 = true
Run Code Online (Sandbox Code Playgroud)
好吧,让我们检查deref和函数的一些组合,以确保它不仅仅是导致问题的这些类型之一:
(gdb) p 1 or *vecIter._M_current == *vecIter
Cannot access memory at address 0x0
(gdb) p 1 or vec._M_impl._M_start[1] == vec[1]
Cannot access memory at address 0x0
Run Code Online (Sandbox Code Playgroud)
如您所见,问题不是特定于向量或其迭代器.如果在&&/||之后插入并且在== /!=的任一侧插入任何操作符(函数),则任何一个操作符都会触发此问题.
编辑:再次忘记一个问题.我的问题是:为什么我在"p*vecIter == vec [1]或*vecIter == vec [2]"行中得到"无法访问地址0x0的内存"?
问题出在返回引用的函数中。这是一个最小的例子:
int& g() { static int i; return i; }
int main() {}
Run Code Online (Sandbox Code Playgroud)
出现了同样的问题(我使用的是 gdb 7.8.1):
(gdb) p 0 || +g()
Cannot access memory at address 0x0
Run Code Online (Sandbox Code Playgroud)
解决方法是将引用转换为指针并间接引用它:
(gdb) p 0 || +*&g()
$1 = true
Run Code Online (Sandbox Code Playgroud)
提交了一个错误:https://sourceware.org/bugzilla/show_bug.cgi?id =17904