посмертная отладка - использование событий windows с файлами MAP - PullRequest
0 голосов
/ 22 февраля 2012

В последнее время я работаю с приложением VC ++, работающим ежедневно (Win Server 2003 SE, SP2), в течение последних нескольких лет.Время от времени (каждые несколько месяцев) происходит сбой приложения из-за необработанного исключения.Очевидно, у нас есть исполняемый файл релиза, работающий на prod, и он не изменится.

Изучение последнего сбоя:

Два события (просмотрщик событий):

Событие приложения (ошибка):"Ошибка приложения XXX,неисправный модуль mfc42.dll, версия 6.6.8032.0, адрес ошибки 0x00026e12 "

SYSTEM Событие: информация (всплывающее окно приложения) " Уведомление о сокетеРаковина: XXX ошибка приложения: Инструкция на 0x73ed6e12 ссылается на память на 0xd4273c00. Память не может быть прочитана "

ОК, я довольно неопытныйс удаленной отладкой, но я пытаюсь использовать эту информацию вместе с доступными файлами MAP.Любой ввод в правильном направлении поможет.

Очевидно, исключение запускается из mf42.dll.Я также могу убедиться в этом, используя утилиту под названием Ходок зависимостей ;запустив это в нашем приложении, я вижу, что адрес ошибки действительно находится в пределах диапазона для mfc42.dll (предпочтительная база - 0x73dd0000 , за которой следует 0x74320000).

(Вспомогательный вопрос относительно файла MAP для mfc42.dll в моем распоряжении: его дата намного раньше, чем у dll (карта 1998 - dll 2007 ...). Я думаю, что эти даты должны быть похожими, если нетидентичен для MAP-файла, чтобы иметь смысл? Я все равно попробую:)

mfc42.map устанавливает предпочтительный адрес загрузки: 5f400000 ,Я предполагаю, что это отличается от адреса, который я получил для mfc42.dll от обходчика зависимостей из-за конфликта и перемещения, правильно?В любом случае, я полагаю, что это все еще можно использовать, если я могу определить смещение адреса ошибки от перемещенного предпочтительного адреса загрузки.Мне кажется, что это смещение может быть уже задано из события приложения ( 0x00026e12 );обратите внимание, что это удивительное сходство нижней части с системным событием 0x73ed6e12 (которое, я предполагаю, является абсолютной ссылкой на адрес).Было бы неплохо, если бы вычитание первого из последнего дало бы предпочтительный адрес загрузки для mfc42.dll .. но это не так.Вычитание дает 0x73eb0000 , а не 0x73dd0000 .

И наоборот, я бы подумал, что вычитая предпочтительный адрес загрузки mfc42.dll ( 0x73dd0000 ) из абсолютного ошибочного адреса, указанного в системном событии ( 0x73ed6e12 ) должно дать мне смещение адреса ошибки.Хорошо, это дает 0x106e12, который не только отличается от заданного в событии приложения, но, что более важно, добавляя его к предпочтительному адресу загрузки, указанному в mfc42.map, дает адрес вне диапазона общедоступных символов.

Кажется, единственный путь, ведущий к фактическому общедоступному символу в mfc42.dll - это добавление 0x00026e12 (applicationatoin event) и 5f400000 (предпочтительный адрес загрузки из mfc42.map), который дает функциючто, однако, никогда не используется из нашего приложения (может быть, используется через другую DLL ??)

Ваши комментарии будут наиболее ценно .. Я использую этот случай, чтобы ознакомиться с отладкой посмертно, но комментарии к конкретной ошибкетакже приветствуются (например, в отношении Socket Notification Sink ).И наконец, что наиболее важно, какие-либо общие предложения по удаленной / посмертной отладке?Я сталкивался с некоторыми из них и сейчас проверяю это из dr dobbs !, хотя ссылка на источник кажется сломанной, кажется ОЧЕНЬ аккуратной ...

...