[]$ cat a.cpp
#include
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 = пара.секунда и это работает корректно, но это означает вообще не использовать структурированную привязку.
- Установка точки останова на строке и ввод командных команд | следующий | end не работает полностью и по-прежнему требует ручной работы для каждой структурированной привязки.
- Добавление любого флага оптимизации (даже -Og в данном случае) оптимизирует всю убрать код (поскольку он не имеет видимого побочного эффекта); или оптимизирует некоторые неиспользуемые переменные.
Однако, когда есть наблюдаемый побочный эффект, это работает. - Поиск в Интернете «структурированной привязки отладки gdb» или даже «gdb пропускает определенную строку при шаге» не дает никакого полезного результата. Команда пропуска может пропускать только функции, а не строки.
[]$ 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
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Подробнее здесь: https://stackoverflow.com/questions/605 ... mping-to-t