gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:53 25 4
gpt4 key购买 nike

这可能是我在描述我的问题时遇到的困难是我找不到其他人的原因。我使用的是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com