Стоит непростая задача заменить имя PDB-файла в собранном модуле.
На первый взгляд, все относительной просто, при использовании ImageHelp:
1. MapAndLoad
2. находим Debug Directory в Optional Headers (7 элемент).
3. Находим запись с IMAGE_DEBUG_TYPE_CODEVIEW, где расположена сигнатура "RSDS" и имя файла.
Но есть проблема. Если новое имя файла меньше по длине старого, то никаких проблем нет. А если оно больше? то как определить, сколько еще байт за именем текущего PDB-файла можно использовать?
Вариант "полностью разобрать PE-файл, исправить и собрать заново" лучше не предлагать, так как соответствие отладочных символов в PDB трудно гарантировать.
Здравствуйте, Алексей Мартынов, Вы писали:
АМ>Добрый день.
АМ>Стоит непростая задача заменить имя PDB-файла в собранном модуле. АМ>На первый взгляд, все относительной просто, при использовании ImageHelp: АМ>1. MapAndLoad АМ>2. находим Debug Directory в Optional Headers (7 элемент). АМ>3. Находим запись с IMAGE_DEBUG_TYPE_CODEVIEW, где расположена сигнатура "RSDS" и имя файла.
АМ>Но есть проблема. Если новое имя файла меньше по длине старого, то никаких проблем нет. А если оно больше? то как определить, сколько еще байт за именем текущего PDB-файла можно использовать?
Там ведь не просто имя файла, а абсолютный путь. Может быть проще позаботиться, что бы его длина была достаточно короткой? Или попробовать MS-DOS имя.
Кстати, нужно что бы GUID'ы в CODEVIEW и PDB были одинаковы.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
АМ>>Но есть проблема. Если новое имя файла меньше по длине старого, то никаких проблем нет. А если оно больше? то как определить, сколько еще байт за именем текущего PDB-файла можно использовать?
GN>Там ведь не просто имя файла, а абсолютный путь. Может быть проще позаботиться, что бы его длина была достаточно короткой? Или попробовать MS-DOS имя.
Это верно, но задача на самом деле такая — при сборке проекта переименовать пришедший извне EXE-шник (или DLL-ку) вместе с PDB-шником, так как универсальный компонент используется в конкретных целях. В данном случае это что-то вроде svchost.exe. Когда у тебя даже 2 процесса с одинковыми именами, но делающими разное, становится трудновато найти нужный . В крайнем случае, всегда можно оставить вместо полного пути одно имя — фактический поиск WinDBG, например, ведет по имени файла в указанных ему каталогах (причяем без подкаталогов), если по полному пути ничего не нашлось.
Видимо, так и придется сделать.
GN>Кстати, нужно что бы GUID'ы в CODEVIEW и PDB были одинаковы.
Ну это исправляется 2 путями:
1. синхронным переменованием PDB.
2. использованием спецтула. Еще можно пофиксить GUID в PE из PDB-шника.
В общем, мне начинает нравится идея расположения отладочных символов внутри PE-файла в секции, которая не загружается в процесс, чего, похоже в PE просто нет.
Здравствуйте, Алексей Мартынов, Вы писали:
АМ>В общем, мне начинает нравится идея расположения отладочных символов внутри PE-файла в секции, которая не загружается в процесс, чего, похоже в PE просто нет.
CodeView формат, все в .exe все отладчики понимают (даже наш)
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Алексей Мартынов, Вы писали:
АМ>>В общем, мне начинает нравится идея расположения отладочных символов внутри PE-файла в секции, которая не загружается в процесс, чего, похоже в PE просто нет.
СМ>CodeView формат, все в .exe все отладчики понимают (даже наш)
Беда только в том, что мне удавалось с VS.NET 2003 получить отладочные символы в объектных файлах, но линкер их выбрасывал в PDB
СМ>>CodeView формат, все в .exe все отладчики понимают (даже наш)
АМ>Беда только в том, что мне удавалось с VS.NET 2003 получить отладочные символы в объектных файлах, но линкер их выбрасывал в PDB
в 2003 может еще есть опции
/debugtype:cv /pdb:none
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Алексей Мартынов, Вы писали:
СМ>>>CodeView формат, все в .exe все отладчики понимают (даже наш)
АМ>>Беда только в том, что мне удавалось с VS.NET 2003 получить отладочные символы в объектных файлах, но линкер их выбрасывал в PDB
СМ>в 2003 может еще есть опции СМ>/debugtype:cv /pdb:none
СМ>а в 2005 вроде как и нет их уже