c – 为什么在!= / ==和\u0026\u0026 / ||时gdb不能评估函数结合在一个表达式?

可能是我在描述我的问题时遇到的困难是我无法找到其中任何一个实例的原因.我正在使用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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...