Для данной программы:
[]$ cat a.cpp
#include <iostream>
int main(){
auto [a, b] = std::make_pair(1, 2);
for(int x = 0; x < 2; ++x) {
a += b;
b += x;
}
}
Если я скомпилирую ее и буду последовательно проходить по ней в GDB:
[]$ g++ -std=c++17 -g a.cpp
[]$ gdb -q a.out
Reading symbols from a.out...
(gdb) break main
Breakpoint 1 at 0x114d: file a.cpp, line 4.
(gdb) run
Starting program: /tmp/a.out
Breakpoint 1, main () at a.cpp:4
4 auto [a, b] = std::make_pair(1, 2);
(gdb) next
5 for(int x = 0; x < 2; ++x) {
(gdb)
4 auto [a, b] = std::make_pair(1, 2);
(gdb)
6 a += b;
(gdb)
4 auto [a, b] = std::make_pair(1, 2);
(gdb)
7 b += x;
(gdb)
5 for(int x = 0; x < 2; ++x) {
(gdb)
4 auto [a, b] = std::make_pair(1, 2);
(gdb)
6 a += b;
(gdb)
4 auto [a, b] = std::make_pair(1, 2);
(gdb)
7 b += x;
(gdb)
5 for(int x = 0; x < 2; ++x) {
(gdb)
9 }
Затем строка объявления структурированной привязки будет переступать каждый раз переменная доступна или записана в.
Есть ли способ, чтобы она не проходила через эти строки, ожидайте в первый раз, подобно этому:
(gdb) run
Starting program: /tmp/a.out
Breakpoint 1, main () at a.cpp:4
4 auto [a, b] = std::make_pair(1, 2);
(gdb) next
5 for(int x = 0; x < 2; ++x) {
(gdb)
6 a += b;
(gdb)
7 b += x;
(gdb)
5 for(int x = 0; x < 2; ++x) {
(gdb)
6 a += b;
(gdb)
7 b += x;
(gdb)
5 for(int x = 0; x < 2; ++x) {
(gdb)
9 }
- Можно изменить структурированную привязку на
auto& a = pair.first; auto& b = pair.second
, и она работает правильно, но это означает, что структурированная привязка вообще не используется. - Установка точки останова в строке и ввод команды
commands | next | end
не полностью работать и по-прежнему требовать ручной работы для каждой структурированной привязки. - Добавление любого флага оптимизации (даже
-Og
в этом случае) оптимизирует весь код (поскольку он не имеет видимого побочного эффекта); или оптимизирует некоторые неиспользуемые переменные.
Однако, когда наблюдается наблюдаемый побочный эффект, он работает. - Поиск в режиме онлайн «структурированной привязки отладки gdb» или даже «пропуск gdb через определенную строку при переходе» делает не дает никакого полезного результата. Команда
skip
может пропускать только функции, а не строки.
Версия инструментов:
[]$ g++ --version
g++ (Arch Linux 9.2.1+20200130-2) 9.2.1 20200130
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[]$ gdb --version
GNU gdb (GDB) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.