Вопрос

Итак, я пытаюсь отладить эту странную проблему, когда процесс завершается без вызова деструкторов...

В отладчике VS (2005) я нажимаю «Разорвать все» и осматриваюсь в стеках вызовов потоков загадочно исчезающего процесса, когда вижу это:

пахнет ТАК http://img6.imageshack.us/img6/7628/95434880.jpg

Это определенно похоже на создание SO, что объясняет, почему процесс доходит до своего счастливого места, не собирая сначала чемодан.

Проблема в том, что стек вызовов отладчика VS показывает только то, что вы видите на изображении.

Итак, мой вопрос:как я могу найти, где начинается вызов бесконечной рекурсии?

Я читаю где-то что в Linux вы можете подключить обратный вызов к обработчику SIGSEGV и получить дополнительную информацию о том, что происходит.

Есть ли что-нибудь подобное в Windows?

Это было полезно?

Решение

Чтобы контролировать действия Windows в случае нарушения прав доступа (SIGSEGV-эквивалент), позвоните SetErrorMode (передайте ему параметр 0, чтобы вызвать всплывающее окно в случае ошибок, что позволит вам подключиться к нему с помощью отладчика.)

Однако, основываясь на уже полученной трассировке стека, присоединение с помощью отладчика при ошибке может не дать дополнительной информации.Либо ваш стек поврежден, либо глубина рекурсии превысила максимальное количество кадров, отображаемых VS.В последнем случае, вы можете захотеть снижаться размер стека процесса по умолчанию (использовать /F переключатель или эквивалентную опцию в свойствах проекта), чтобы проблема проявилась раньше, и убедитесь, что VS воля отобразить все кадры.В качестве альтернативы вы можете захотеть установить точку останова в std::basic_filebuf<>::flush() и пройти через нее до фазы уничтожения (или отключить ее до момента, непосредственно предшествующего фазе уничтожения).

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

Ну, вы знаете, в какой нити проблема - может быть, просто проследить ее с самого начала, чтобы увидеть, где она уходит в сорняки.

Другой вариант — использовать один из отладчиков в Инструменты отладки для Windows package — они могут показать больше, чем отладчик VS (возможно), даже если они, как правило, более сложны и трудны в использовании (на самом деле, возможно, из-за этого).

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

Либо вы просто делаете шаг вперед и смотрите, какие деструкторы вызываются и когда они перехватываются.Или вы можете поместить printf/OutputDebugString в каждый деструктор соответствующих объектов (это нужно только тем, которые являются глобальными).Если сообщение — это первое, что делает деструктор, то последнее сообщение, которое вы видите, исходит от деструктора, который зависает.

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

Я бы не исключал, что такой обработчик есть в Windows, но никогда о нем не слышал.

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

Попробуйте поставить Sleep() вызывает выбранные функции в вашем источнике, которые могут участвовать в рекурсии.Это должно дать вам больше шансов проникнуть в процесс до того, как стек полностью переполнится.

Я согласен с Дэном Бреслау.Ваш стек фиктивный.Хотя может быть просто потому, что у вас нет подходящих символов.Если программа просто исчезает без активации обработки WER, обычно это связано с нехваткой памяти.Вы исследовали такую ​​возможность?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top