Я пытался отладить программу, которая использует несколько векторов STL, и кажется, что GDB (7.6.1) неправильно отображает размеры векторов (то есть количество элементов, а не емкость).Излишне говорить, что это создает серьезные трудности при отладке моего кода.Я создал простой фрагмент кода, который повторяет проблему, vector_test.cpp
.Запуск 64-битной Windows.
#include <vector>
#include <iostream>
int main() {
std::vector<int> v;
v.push_back(4);
std::cout << "v.size() = "<<v.size()<<"\n";
v.push_back(8);
std::cout << "v.size() = "<<v.size()<<"\n";
v.push_back(15);
std::cout << "v.size() = "<<v.size()<<"\n";
v.push_back(16);
std::cout << "v.size() = "<<v.size()<<"\n";
v.push_back(23);
std::cout << "v.size() = "<<v.size()<<"\n";
v.push_back(42);
std::cout << "v.size() = "<<v.size()<<"\n";
return 0;
}
После компиляции с g++ -Wall -g -O0 -o vector_test.exe vector_test.cpp
и запуска vector_test.exe
результат будет (естественно)
v.size() = 1
v.size() = 2
v.size() = 3
v.size() = 4
v.size() = 5
v.size() = 6
Но отладка в GDB рассказывает совсем другую историю... v.size()
, кажется, оценивается совершенно неправильно!
(gdb) break vector_test.cpp:5
Breakpoint 1 at 0x401477: file vector_test.cpp, line 5.
(gdb) run
Starting program: C:\Users\Robin Armstrong\Desktop/vector_test.exe
[New Thread 3384.0x1b64]
[New Thread 3384.0x2fa0]
[New Thread 3384.0x300c]
[New Thread 3384.0x1b10]
Breakpoint 1, main () at vector_test.cpp:5
5 std::vector<int> v;
(gdb) disp v.size()
1: v.size() = 1956771
(gdb) next
7 v.push_back(4);
1: v.size() = 0
(gdb)
8 std::cout << "v.size() = "<<v.size()<<"\n";
1: v.size() = 1
(gdb)
v.size() = 1
9 v.push_back(8);
1: v.size() = 3825453421
(gdb)
10 std::cout << "v.size() = "<<v.size()<<"\n";
1: v.size() = 412859506
(gdb)
v.size() = 2
11 v.push_back(15);
1: v.size() = 3825453421
(gdb)
12 std::cout << "v.size() = "<<v.size()<<"\n";
1: v.size() = 412859506
(gdb)
v.size() = 3
13 v.push_back(16);
1: v.size() = 3825453421
(gdb)
14 std::cout << "v.size() = "<<v.size()<<"\n";
1: v.size() = 4
(gdb)
v.size() = 4
15 v.push_back(23);
1: v.size() = 3825453421
(gdb)
16 std::cout << "v.size() = "<<v.size()<<"\n";
1: v.size() = 412859506
(gdb)
v.size() = 5
17 v.push_back(42);
1: v.size() = 3825453421
(gdb)
18 std::cout << "v.size() = "<<v.size()<<"\n";
1: v.size() = 6
(gdb)
v.size() = 6
20 return 0;
1: v.size() = 3825453421
Я совершенно не понимаю, как это объяснить, и не могу найти описание подобной проблемы в другом месте.Есть мысли?