2016-07-21 8 views
1

Ich habe ein kleines C++ Programm:Sonderbare gdb Verhalten in Bezug auf bedingten Haltepunkt (a && b nicht gleich b && a)

// 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; 
} 

Dieses Programm in Ubuntu 14.04.3 LTS mit gcc 4.8.4 kompiliert wird.

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

das Programm mit GDB auf Start und einen bedingten Unterbrechungspunkt hinzufügen, auf der Leitung 13. Die Bedingung ist "Bildhöhe() == 3 & & v [0] == 3", wie unten gezeigt . Diese Bedingung funktioniert jedoch nicht wie erwartet. Es stoppt, wenn die Bedingung nicht erfüllt ist.

(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 

Führen Sie das Programm und eine Fehlermeldung gegeben:

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

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

Und v.size() Druck zeigt es 1 ist, was eindeutig nicht die Bedingung ist, dass Haltepunkt stoppen sollte.

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

Aber wenn ich den Zustand Unterbrechungs mit "v [0] == 3 & & Bildhöhe() == 3" ersetzen alles ist in Ordnung.

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

Was ist das Problem der ersten Bedingung?

[Update]

Ich habe ein Upgrade gcc und gdb 6.1.0 bzw. 7.10 auf Ubuntu 14.04 (beide aus dem Quellcode), aber das Problem ist immer noch da.

$ g ++ -v

Mit Einbau-Spezifikationen. COLLECT_GCC = g ++ COLLECT_LTO_WRAPPER =/usr/libexec/gcc/x86_64-pc-linux-gnu/6.1.0/lto-wrapper Ziel: x86_64-pc-linux-gnu Konfiguriert mit: ../gcc-6.1.0/ konfigurieren prefix =/usr --enable-languages ​​= c, C++ --disable-multilib --disable-Bootstrap --with-System-zlib-Thread-Modell: Posix gcc Version 6.1.0 (GCC)

$ gdb -v

GNU gdb (gDB) 7,10

+0

Kann nicht mit GDB 7.11.1 reproduziert werden. Welche Version verwendest du? – TartanLlama

+0

Auf meinem System funktioniert alles perfekt. gcc 6.1.0, gdb 7.10.1. – Klaus

+0

Ich glaube, es ist 7.7 standardmäßig auf Ubuntu 14.04.3. Gerade habe ich von dort auf http://ftp.gnu.org/gnu/gdb/ 'auf 7.10 aktualisiert. Rebuilt gdb. Leider kann ich das gleiche Problem beobachten. –

Antwort

0

ich habe ein Upgrade gdb 7.11.1 (von Ubuntu 16.04.1 LTE schaltend) und dieses Problem ist weg.

Und für diese gdb-Version wird das Drucken einer std::vector natürlich unterstützt, was nett ist.

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