Как пройти через код C++ со структурированной привязкой в ​​GDB, не переходя к строке объявления?C++

Программы на C++. Форум разработчиков
Anonymous
 Как пройти через код C++ со структурированной привязкой в ​​GDB, не переходя к строке объявления?

Сообщение Anonymous »

При наличии программы:

[]$ 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

Вернуться в «C++»