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

#c #visual-studio-2010 #debugging #stack

#c #visual-studio-2010 #отладка #стек

Вопрос:

Есть ли способ выяснить, где приложение зависает и не завершает свою функцию? Я открыл стек вызовов, но он пуст. Что это значит. Есть ли у кого-нибудь какие-либо рекомендации по отладке, в которой приложение находилось в тот момент, когда оно начало зависать / перестало реагировать.

Редактировать: я использую Visual Studio 2010

Комментарии:

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

2. Иногда вы можете даже использовать первую отладку в детской версии: распечатать сообщение до и после всех вызовов функций (или, по крайней мере, всех соответствующих) и посмотреть, где программа не возвращается. Затем выберите эту функцию и добавьте сообщения в важные части кода. Надеюсь, таким образом вы сможете сузить круг поиска. Пошаговое выполнение программы в отладчике — более методичный подход, но иногда наивный метод может значительно сократить время поиска.

3. Что ж, вы прочитали мой комментарий несколько часов назад, но не проявляете ни малейших усилий для повышения качества вашего вопроса — поэтому я голосую за его закрытие. Не тратьте время других людей, заставляя их гадать, что вы могли иметь в виду.

Ответ №1:

Когда это случается со мной, я обнаруживаю, что прикрепление Очень сонного профилировщика к отладчику часто упрощает определение места зависания, даже если вы подключаете его после того, как это произошло — просто найдите стековые фреймы, которые были активны в течение 100% сеанса выборки профилировщика (путем сортировки списка по столбцу «Включительно %» и просмотра вверху).

Комментарии:

1. Спасибо. Вверху, как 100%, написано thread 1188 в разделе thread. В разделе местоположение написано «operator new», но иногда переключается на «WinSqmSetIfMaxDWORD». Есть идеи относительно того, что это может означать?

2. извините, забыл включить (at) Омер

3. Извините, понятия не имею, но этот метод является частью ядра Windows. Попробуйте перейти вверх по окну stack frame справа, чтобы попытаться увидеть, какая часть вашего кода его выполняет.

Ответ №2:

Скомпилируйте свое приложение с включенными всеми предупреждениями и с компилятором, выдающим отладочную информацию. В Linux это означает g -Wall -g . Работайте над исходным кодом, пока не перестанете получать предупреждения. Научитесь использовать отладчик (например, gdb в Linux) и используйте его пошаговые возможности.

Но мы не можем помочь вам больше, потому что это зависит от системы, и вы не сказали, какую систему вы используете, и вы не показали нам код, который вы отлаживаете.

Прочитайте, как отлаживать небольшие программы

Комментарии:

1. Извините за это. Я обновил сообщение. Visual Studio 2010.

2. Хорошо. Здесь серьезный вопрос. Это относится ко всей моей программе (5 тысяч строк), а не только к вызывающей функции. Раньше на меня кричали за то, что я не включал вызывающий код, но я не уверен, как, если я не могу точно определить, где зависает функция, отсюда и этот вопрос.

Ответ №3:

В дополнение к использованию отладчика, запустите профилировщик через код. Мой VS довольно устарел, поэтому я не могу предоставить подробную информацию о том, как это сделать, но Google может помочь.

Также было бы полезно иметь много небольших функций вместо нескольких больших, поскольку самая высокая степень детализации профиля — это функциональный уровень.

Ответ №4:

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