GDB переходит на предыдущие строки после финиша main - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь выяснить, почему GDB ведет себя не так, как ожидалось.Не уверен, что вызвало это.Увидев эту проблему, я написал минимальную версию основной функции.Он закончил последнюю строку и вышел правильно.После добавления еще одной функции, прыжки вернулись.Даже после комментирования добавленной строки переход назад не исчезает.

Я не уверен, что это связано со ссылками на мою собственную библиотеку, даже после комментирования большей части кода (ни одна строка не ссылается на мойсобственной библиотеки), в процессе сборки все еще используется ссылка (automake):

LDADD = ../libmyown.la

Эта строка использовалась для добавления библиотек ко многим другим программам, встроенным в этот каталог.Я тестировал разные версии GDB и GCC, последняя версия 8.2 для обеих программ.Использовали опцию -g -O0, -ggdb -O0.Я видел сообщения в Stackoverflow об этом типе поведения.Не уверен, что у меня такое поведение, или это была какая-то ошибка в моей собственной библиотеке, чьи ссылки вызвали такое поведение.Хотя эта публикация представляется излишней, но я пытаюсь предоставить больше контекстной информации.Надеюсь, что некоторые из меня найдут решение и помогут другим.

За исключением проблемы с переходом в gdb, двоичная программа выполняется правильно.

Вот несколько расширенная версия основного кода, демонстрирующая проблему с переходом:

Breakpoint 1, main (argc=1, argv=0x7fffffffdeb8) at alnlocalmany.cpp:66
66     if (isDNA(reffile)) {
(gdb) n
67        alignDNAMany(reffile, dbfile, outfile);
(gdb) 
68        return 0;
(gdb) s
39     string reffile, dbfile, outfile;
(gdb) s
73  }
(gdb) s
0x00007ffff6d97b97 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) s
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 15621) exited normally]

Примечаниеон прыгает с 68 до 39 (первая строка в основном), затем 73 (заканчивающийся фигурной скобкой основного)

1 Ответ

0 голосов
/ 04 января 2019

В прошлом была похожая ошибка gcc 49951 , которая позже была закрыта со статусом RESOLVED FIXED.Однако на данный момент его можно воспроизвести с текущей версией gcc (я тестировал с gcc 8.2.1).Другие люди также утверждают, что ошибка не была исправлена, см. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49951#c20.

В качестве обходного пути вы можете попробовать использовать clang вместо gcc, по крайней мере ошибка не была воспроизведена на тестовом примере из ошибки gcc 49951 при строительстве с лязгом.Вы также можете понизить версию gcc до версии 4.4, но пока она слишком старая.

...