Деманглинг имен в Visual C++.

November 11th, 2009

На днях пытался понять, отчего и почему крошечное приложение пухнет как на дрожжах при добавлении некоторых библиотек из 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++. Есть шанс, что найденные ошибки будет оперативно подправлены. :-)

, , ,

  1. Denis
    November 12th, 2009 at 01:51 | #1

    Немного не по теме, но, может быть, Вы поможете найти причину порчи памяти в Far’e
    http://bugs.farmanager.com/view.php?id=1145 ? Проявляется только при использовании релизной версии библиотек.

  2. November 12th, 2009 at 15:29 | #2

    @Denis

    Я добавил комментарий с описанием последовательности, приводящей с порче памяти в багтрекер. Надеюсь это поможет.

    PS. Код Far’а по-прежнему ужасен. :(

  3. Denis
    November 12th, 2009 at 23:09 | #3

    Огромное спасибо! А можете поделиться информацией, как с помощью AppVerifier удалось поймать ошибку? Спасибо.

  4. November 13th, 2009 at 07:42 | #4

    @Denis

    http://technet.microsoft.com/en-us/library/bb457063.aspx

    В данном случае достаточно было собрать релизную версию с символами (привет Far Team), включить проверку кучи и воспроизвести баг. Потом нужно было сделать strStr локальной переменной, чтобы знать где именно она портится и все.

  1. No trackbacks yet.
Comments are closed.