Почему GDB отображает неправильный векторный размер? - PullRequest
0 голосов
/ 09 июля 2019

Я пытался отладить программу, которая использует несколько векторов 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

Я совершенно не понимаю, как это объяснить, и не могу найти описание подобной проблемы в другом месте.Есть мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...