Как пройти через код C ++ со структурированным связыванием в GDB, не переходя к строке объявления? - PullRequest
1 голос
/ 03 марта 2020

Для данной программы:

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