gpt4 book ai didi

c++ - 关于条件断点的奇怪 gdb 行为(a && b 不等于 b && a)

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:43 25 4
gpt4 key购买 nike

我有一个小的 C++ 程序:

// test.cpp
#include <vector>
#include <iostream>
using namespace std;

template class vector<int>;
int main()
{
vector<int> v;
for (size_t i = 0; i < 10; ++i)
{
if (!v.empty())
cout << v[0] << endl; //<== Add a cond breakpoint here later

v.clear();
for (size_t j = 0; j < i; ++j)
v.push_back(i);
}

return 0;
}

此程序在 Ubuntu 14.04.3 LTS 中使用 gcc 4.8.4 编译。

g++ -g -O0 -o test test.cpp

用gdb启动程序,在第13行加条件断点,条件为"v.size() == 3 && v[0] == 3",如下图.但是,这种情况不会按预期工作。不满足条件时停止。

(gdb) b 13 if v.size() == 3 && v[0] == 3
Breakpoint 1 at 0x400ca1: file test.cpp, line 13.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400ca1 in main() at test.cpp:13
stop only if v.size() == 3 && v[0] == 3

运行程序,出现错误信息:

...
Error in testing breakpoint condition:
Cannot access memory at address 0x0

Breakpoint 1, main () at test.cpp:13
13 cout << v[0] << endl;

打印v.size()显示为1,这显然不是断点应该停止的条件。

(gdb) p v.size()
$1 = 1

但是如果我用 "v[0] == 3 && v.size() == 3" 替换条件断点,一切都很好。

(gdb) p v.size()
$2 = 3

第一个条件有什么问题?

[更新]

我在 Ubuntu 14.04 上将 gcc 和 gdb 分别升级到 6.1.0 和 7.10(都是从源代码构建的),但是这个问题仍然存在。

$g++ -v

Using built-in specs. COLLECT_GCC=g++COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/6.1.0/lto-wrapperTarget: x86_64-pc-linux-gnu Configured with: ../gcc-6.1.0/configure--prefix=/usr --enable-languages=c,c++ --disable-multilib --disable-bootstrap --with-system-zlib Thread model: posix gcc version 6.1.0 (GCC)

$gdb -v

GNU gdb (GDB) 7.10

最佳答案

我将 gdb 升级到 7.11.1(通过切换到 Ubuntu 16.04.1 LTE),这个问题消失了。

对于这个 gdb 版本,自然支持打印 std::vector,这很好。

(gdb) print v
$3 = std::vector of length 3, capacity 4 = {3, 3, 3}

关于c++ - 关于条件断点的奇怪 gdb 行为(a && b 不等于 b && a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38499396/

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