У меня есть большое приложение на C++, которое воспроизводимо зависает в определенный момент. Это не сбой, нет сегфолта. У меня есть доступ к исходному коду, но я не автор. Поэтому я не могу сделать обоснованное предположение о том, что происходит.
Я попытался использовать GDB для его отладки. Проблема, однако, в том, что когда я нажимаю точку останова, приложение зависает. Когда я перехожу, приложение также кажется зависшим. Таким образом, я не могу точно определить, нашел ли я проблему или приложение просто кажется зависшим, потому что выполнение приостановлено в отладчике.
Боюсь, что лучше всего будет вернуться к старой доброй отладке cout. Есть ли другие варианты?
Это также может быть тупик, поэтому обязательно исследуйте все потоки и какие блокировки/мьютексы они удерживают/пытаются войти. И для этого тоже требуется подключенный отладчик.
вернемся к старой доброй отладке cout Как насчет добавления класса журнала, если его еще нет. С учетом вышесказанного я согласен с приведенными выше комментариями.
Что касается процесса разработки, сколько модульных тестов содержит кодовая база?
может быть, вам поможет дезинфицирующее средство для ниток или валгринд? Вы можете получить отчет о блокировке страха напрямую из инструментов.
«Старая добрая отладка cout» предполагает написание кода для отладки написанного вами сломанного кода. Что тут может быть не так?!
@Clifford, добавив ведение журнала cout, вы можете изменить время/поведение кода, что может (и будет) влиять на условия гонки... на самом деле это не лучший способ отладки подобных проблем.
@PepijnKramer - значит, мы согласны друг с другом. Я думаю, вы, возможно, пропустили мой сарказм. Я говорю, что если вы написали неработающий код, писать больше кода для его исправления — это ошибочный подход. Еще одна причина - проблема времени: я работаю со встроенными системами реального времени; Я хорошо знаю. Вам необходимо адресовать свой комментарий в ОП.
Вы можете просто attach
обратиться к программе, когда она зависла, а затем проверить текущее состояние (например, с помощью bt
).
Возможно, он «заморожен», потому что вы вызвали функцию, ожидающую ввода. Если вы пропустите такую функцию, отладчик не остановится до тех пор, пока функция не вернется (возможно, предоставив необходимые входные данные).
Альтернативно вы перешли через невозвратную функцию, потому что сама функция неверна или ей были предоставлены неправильные параметры.
В любом случае, подходящей стратегией будет запуск программы до тех пор, пока она не станет «зависшей», а затем остановка программы, чтобы определить, где она зависла. Вероятно, это код какой-то библиотеки, исходный код которого недоступен. В этом случае вам следует проверить стек вызовов, чтобы определить, как он попал туда, где он находится, и, в частности, отследить вызов, который явно принадлежал вашему коду.
В GDB ctrl+c остановит запущенный процесс. Команда where
выведет стек вызовов.
Запустите программу без точек останова и пошагового выполнения. Когда он «зависнет», сломайте программу, чтобы узнать, где в коде это происходит. Это бесконечный цикл? Это функция, которая чего-то ожидает (например, ввода)?