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

时间:2016-07-21 08:49:12

标签: c++ gcc gdb

我有一个小型的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;
}

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

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

使用gdb启动程序,并在第13行添加条件断点。条件为&#34; v.size()== 3&amp;&amp; v [0] == 3&#34; ,如下所示。但是,这种情况并不像预期的那样奏效。当条件不满足时它会停止。

(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

但是如果我用&#34; v [0] == 3&amp;&amp; v.size()== 3&#34; 一切都很好。

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

第一个条件的问题是什么?

[更新]

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

  

$ g ++ -v

     

使用内置规格。 COLLECT_GCC =克++   COLLECT_LTO_WRAPPER =的/ usr /的libexec / GCC / x86_64的-PC-Linux的GNU / 6.1.0 / LTO-包装   目标:x86_64-pc-linux-gnu配置为:../ gcc-6.1.0 / configure   --prefix = / usr --enable-languages = c,c ++ --disable-multilib --disable-bootstrap --with-system-zlib线程模型:posix gcc版本6.1.0(GCC)

     

$ gdb -v

     

GNU gdb(GDB)7.10

1 个答案:

答案 0 :(得分:0)

我将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}