Inception
Apr 7, 2011 · CommentsОтладка
Сижу я сегодня на работе, никого не трогаю, отладчиком отладчик отлаживаю. А что, отладчик - тоже человек программа. Тем более что немногим ранее я его немножко совсем поломал, пытаясь добавить поддержку некоей конфигурации, которая текущей реинкарнацией отладчика не поддерживается. Ну вот, запускаю я его примерно вот таким образом:
windbg.exe kd.exe -k com:port=com1,baud=115200
…и замечаю, что что-то не так. А именно - опять сломался наш корпоративный прокси. А я как раз хотел посмотреть в… ну скажем MSDN. Попробовал и так и сяк. Не работает, вылетает по таймауту. Ну хорошо, но тут начитают происходить еще более мистические вещи. Outlook вдруг перестает реагировать мышь и клавиатуру; IE вообще не запускается – процесс стартует, но окно не показывается. Несколько подозрительно для проблем с прокси.
Иду на другую машину. Открываю тот же сайт. Не работает – таймаут. Значит, все-таки, прокси шалит. Звоню в службу поддержки. Описываю ситуацию. Хорошо, говорит. Давай я на твою машину зайду. Запускаю Office Communicator, чтобы через него техник мог зайти через Windows Remote Assistance. Коммуникатор стартует и надежно повисает зеленой иконкой в трее, не реагирующей на нажатия клавиш. Очень подозрительно.
Ну ладно, пробую отправить письмо с ключом для Remote Assistance. Окно письма с приложенным фалом появляется, забиваю поле «To», нажимаю «Send». А ну да, Outlook-то еще висит…
Мысль, что «что-то здесь не так» продолжает зудеть. Отладчик, кстати, тоже повис. Хм. Убиваю все процессы: отладчик, IE, Outlook; снова запускаю IE – работает. Сайты открываются как положено. Запускаю отладчик – бум, IE повисает. Повторяю пару раз для надежности. Все верно, стоит запустить отладчик HTTP трафик отключается.
Вежливо прощаюсь со службой поддержки. Еще раз запускаю отладчик. Запускаю еще один отладчик. А чо, у меня их тыщи. : -) Подсоединяюсь к процессу отладчика, который отлаживает отладчик. Чувствую себя при этом как Ди Каприо в «Inception». Отладчик говорит мне, что «Could not aquire a Wininet mutex». Ага!
Ищу это место в коде. И выясняется такая штука. Отладчик проверяет два mutex’а, один из которых зовут «WininetProxyRegistryMutex». Комментарии в коде намекают, что этим mutex’ам лучше быть не захваченными иначе функции WinInet звать нельзя. Подвисшие отладчики же занимались, скорее всего, именно этим. По крайней мере, оба пытались прочитать символы с http://msdl.microsoft.com/download/symbols. Смотрю в WinObj и точно, - «WininetProxyRegistryMutex» захвачен:
Получается, что один отладчик вызывал какую-то WinInet функцию, отлаживающий его отладчик прерывал его и пытался тоже подгрузить символы, навечно повисая на уже захваченном mutex’е. Этот же mutex подвешивал всех остальных. А тот сайт просто валялся в тот момент, по этому и с другой машины тоже ничего не работало. :-)