В очередной раз столкнулся с мифом, что, мол, release сборку невозможно отлаживать, так как символов нет. Значит так! Американцы на Луне были! Тьфу ты. В смысле, символы в release сборке включать: а) можно, б) нужно и в) полезно. Генерация отладочной информации не влияет на оптимизацию кода. Хотите, проверьте сами – сравните ассемблерные листинги с генерацией символов и без. Более того, случаи, когда это не так, однозначно трактуются как ошибки, которые можно смело отправлять в Microsoft. Мне, кстати, и самому было бы интересно посмотреть на тест-кейс воспроизводящий подобную ошибку.
Представьте, что где-то в коде есть такой кусок:
BOOL Res =
ReadConsole(
GetStdHandle(STD_INPUT_HANDLE),
Buffer,
sizeof(Buffer),
&ReadChars,
NULL);
Теперь, скажем, нам в какой-то момент нужно корректно прервать вызов ReadConsole() (из другого потока). Как это сделать?
Read more…
На днях пытался понять, отчего и почему крошечное приложение пухнет как на дрожжах при добавлении некоторых библиотек из Boost. Рассматривая сгенерированный map файл, выяснил, что утилита undname.exe поставляется вместе с Visual Studio и в состав Windows SDK не входит. Пришлось написать свою – там всего-то нужно вызвать одну функцию (UnDecorateSymbolName). По ходу дела нашел несколько интересных ссылок по теме:
- Схема, по которой кодируются имена:
- Tips: Visual C++ – упоминает, что UnDecorateSymbolName не умеет декодировать имена классов. Вместо неё предлагается использовать недокументированную функцию, предоставляемую самим компилятором – _unDName. Вот аналогичная жалоба на rsdn.ru.
- Исходный код _unDName из проекта Wine
Разница между UnDecorateSymbolName и _unDName меня совсем не удивляет. Эти функции происходят из двух разных проектов. UnDecorateSymbolName (dbghelp.dll) – это реализация из WinDbg (Windows Division). _unDName (msvcrt.dll) пишут разработчики компилятора (DevDiv). К счастью, новые версии WinDbg выходят гораздо чаще, чем новые версии Visual C++. Есть шанс, что найденные ошибки будет оперативно подправлены.
Просто удивительно, насколько опасной может быть функция Wow64DisableWow64FsRedirection. Эта функция позволяет временно отключить перенаправление файловой системы в Wow64. Еще более удивительно, что лишь малая доля разработчиков соглашается менять свой код, даже после подробного объяснения, в чем, собственно, проблема.
Read more…
Никогда не знаешь к чему приведет отправка патча в какой-нибудь open source проект. Обычно это выглядит так. Программа вас чем-то не устраивает и вы изменяете её под себя. Потом, сообразив, что это будет полезно кому-нибудь еще, вы оформляете красивый патч и отправляешь его разработчикам. Его, как правило, не принимают. По разным причинам. То ли стиль нужно подправить, то ли нужно показать, что патч действительно полезный и что он в канву продукта вписывается. Впрочем, и это тоже не новость, главная задача разработчиков продукта на этом этапе – это выяснить вменяемость автора патча (можно ли с ним работать, вести нормальный диалог и т.д.) и то, насколько предложенные им изменения вписываются в их видение продукта. Короче, если вы новичок в данном проекте, ждите придирок по пустякам. Это нормально и это пройдет, если вы (со временем) впишетесь в стиль работы, принятой разработчиками.
Read more…
В Microsoft, по крайней мере, в той его части, что разрабатывает Windows, весьма неплохо поставлен процесс отладки падений, сбоев и прочих багов. Автоматические тесты при падении вываливаются в отладчик. Если какая либо проблема воспроизводится локально, то обычно не нужно просить прислать crash dump или адрес сессии отладчика – так называемый remote. Словечко происходит от утилиты «remote.exe», которая идет в комплекте с «WinDbg.exe» и делает, в общем-то, тоже самое, что и Telnet, но через именованные трубы (named pipes). Не спрашивайте меня, почему нельзя было использовать тот же Telnet. Для меня это тоже загадка. Но я отклоняюсь от темы.
Read more…
Любой разработчик, кто хоть раз создавал ключ в реестре с помощью функции RegCreateKeyEx задавался вопросом: «а зачем нужен параметр lpClass и что он означает?»
lpClass [in, optional]
The user-defined class type of this key. This parameter may be ignored. This parameter can be NULL.
Read more…
Recent Comments