c++ - 为什么 gdb 在 !=/== 和 &&/|| 时不能计算函数组合在一个表达式中?

标签 c++ gdb

这可能是我在描述我的问题时遇到的困难是我找不到其他人的原因。我使用的是 gdb 7.4-2012.04。

至少看起来任何包含 !=/== 和 &&/|| 的表达式for vectors 或 vector iterators 将无法在 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

如您所见,问题不在于 vector 或其迭代器。如果在 &&/|| 之后以及 ==/!= 的任一侧插入任何运算符(函数),都会触发此问题。

编辑:又忘记了一个问题。我的问题是: 为什么在“p *vecIter == vec[1] or *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++ - 为什么 gdb 在 !=/== 和 &&/|| 时不能计算函数组合在一个表达式中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103906/

相关文章:

c++ - CGAL:带有信息的点的凸包

c++ - 如何在 CMake 中添加 "-l"(ell) 编译器标志

linux - 为什么在 gdb 中使用 `info proc mappings` 时同一个共享库出现多次?

gdb 不会从外部架构读取核心文件

c++ - 后台模式下的gdb断点

c++ - libcurl 是否支持发送不加密的电子邮件?

c++ - realloc 分配失败

c++ - 使用 Qt、QWT 和 C++ 绘制实时数据

c++ - 远程 GDB 检查点/ fork 失败

c - 在指针上调试 C 程序时出错