Как найти, где приложение зависает?

У меня есть большое приложение на C++, которое воспроизводимо зависает в определенный момент. Это не сбой, нет сегфолта. У меня есть доступ к исходному коду, но я не автор. Поэтому я не могу сделать обоснованное предположение о том, что происходит.

Я попытался использовать GDB для его отладки. Проблема, однако, в том, что когда я нажимаю точку останова, приложение зависает. Когда я перехожу, приложение также кажется зависшим. Таким образом, я не могу точно определить, нашел ли я проблему или приложение просто кажется зависшим, потому что выполнение приостановлено в отладчике.

Боюсь, что лучше всего будет вернуться к старой доброй отладке cout. Есть ли другие варианты?

Запустите программу без точек останова и пошагового выполнения. Когда он «зависнет», сломайте программу, чтобы узнать, где в коде это происходит. Это бесконечный цикл? Это функция, которая чего-то ожидает (например, ввода)?

Some programmer dude 10.08.2024 18:59

Это также может быть тупик, поэтому обязательно исследуйте все потоки и какие блокировки/мьютексы они удерживают/пытаются войти. И для этого тоже требуется подключенный отладчик.

Pepijn Kramer 10.08.2024 19:02

вернемся к старой доброй отладке cout Как насчет добавления класса журнала, если его еще нет. С учетом вышесказанного я согласен с приведенными выше комментариями.

drescherjm 10.08.2024 19:02

Что касается процесса разработки, сколько модульных тестов содержит кодовая база?

Pepijn Kramer 10.08.2024 19:04

может быть, вам поможет дезинфицирующее средство для ниток или валгринд? Вы можете получить отчет о блокировке страха напрямую из инструментов.

Klaus 10.08.2024 19:13

«Старая добрая отладка cout» предполагает написание кода для отладки написанного вами сломанного кода. Что тут может быть не так?!

Clifford 10.08.2024 19:33

@Clifford, добавив ведение журнала cout, вы можете изменить время/поведение кода, что может (и будет) влиять на условия гонки... на самом деле это не лучший способ отладки подобных проблем.

Pepijn Kramer 10.08.2024 19:35

@PepijnKramer - значит, мы согласны друг с другом. Я думаю, вы, возможно, пропустили мой сарказм. Я говорю, что если вы написали неработающий код, писать больше кода для его исправления — это ошибочный подход. Еще одна причина - проблема времени: я работаю со встроенными системами реального времени; Я хорошо знаю. Вам необходимо адресовать свой комментарий в ОП.

Clifford 10.08.2024 22:00

Вы можете просто attach обратиться к программе, когда она зависла, а затем проверить текущее состояние (например, с помощью bt).

ssbssa 11.08.2024 00:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, он «заморожен», потому что вы вызвали функцию, ожидающую ввода. Если вы пропустите такую ​​функцию, отладчик не остановится до тех пор, пока функция не вернется (возможно, предоставив необходимые входные данные).

Альтернативно вы перешли через невозвратную функцию, потому что сама функция неверна или ей были предоставлены неправильные параметры.

В любом случае, подходящей стратегией будет запуск программы до тех пор, пока она не станет «зависшей», а затем остановка программы, чтобы определить, где она зависла. Вероятно, это код какой-то библиотеки, исходный код которого недоступен. В этом случае вам следует проверить стек вызовов, чтобы определить, как он попал туда, где он находится, и, в частности, отследить вызов, который явно принадлежал вашему коду.

В GDB ctrl+c остановит запущенный процесс. Команда where выведет стек вызовов.

Другие вопросы по теме