可能是我在描述我的问题时遇到的困难是我无法找到其中任何一个实例的原因.我正在使用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; }
这是我执行的测试的片段:
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
原始有用的声明不起作用.让我们减少一点,找到问题.
(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
在’或’之后看起来问题是’==’.这和其他操作符一样吗?
(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
这是一个响亮的回答.如果我为gdb提取所有功能怎么办?只是让它取消引用并比较一下?
(gdb) p 1 or *vecIter._M_current == vec._M_impl._M_start[1] $2 = true
好吧,让我们检查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
如您所见,问题不是特定于向量或其迭代器.如果在&& / ||之后插入并且在== /!=的任一侧插入任何一个操作符(函数)将触发此问题.
编辑:再次忘记一个问题.我的问题是:
为什么我在“p * vecIter == vec [1]或* vecIter == vec [2]”行中得到“无法访问地址0x0的内存”?
解决方法
问题出在返回引用的函数中.这是一个最小的例子:
int& g() { static int i; return i; } int main() {}
同样的问题出现了(我使用的是gdb 7.8.1):
(gdb) p 0 || +g() Cannot access memory at address 0x0
解决方法是将引用转换为指针并将其间接转换:
(gdb) p 0 || +*&g() $1 = true
提起了一个错误:https://sourceware.org/bugzilla/show_bug.cgi?id=17904