Формат MAP-файла, генерируемый компилятором или линкеро
Модератор: Модераторы
З.Ы. Устал, завтра на работу. Попробую как-то на недельке добить. Там немного осталось - на основе распакованной информации найти по адресу строку, столбец и имя исходника не сможет только слепоглухотупой. Единственный минус - надо ещё где-то отковырять базовый адрес dll'ы, чтобы прибавить к этим адресам из таблицы.
Урра! Заработала!
dll'а сама сбя пропарсила и доложила номер строки с ошибкой!
Вечерком подгоню в пользование общественностью, а то оно у меня кучу функций движка использует.
dll'а сама сбя пропарсила и доложила номер строки с ошибкой!
Код: Выделить всё
МОДУЛЬ lib_test013.so РУХНУЛ
Крах модуля: непойманное исключение,
Access Violation
Код по адресу 005AE48Eh
(исходник mo_module.pp
позиция 208:3)
превысил свои права на доступ
к какой-то из страниц виртуальной памяти.
Как правило такое случается при обращении
к несуществующим данным (ещё не созданному
или уже уничтоженному экземпляру класса,
неинициализированному указателю, пустой строке
или динамическому массиву нулевой длины и т.п.)Вечерком подгоню в пользование общественностью, а то оно у меня кучу функций движка использует.
И там, и там!
И уже работает - написал и отладил. Осталось лишь, как я уже сказал, выкромсать из моего движка, некоторые функции которого оно использует.
Основная идея - даётся утилита, которой обрабатывается exeшник, после чего он очищается strip'ом. Дело в том, что -gw помимо информации о строках генерирует ещё море ненужного мусора (пример: строки - 50 кб, вся отладочная инфа в целом - 400кб ).
Короче, информацию о строках, имо, лучше хранить параллельно, в отдельном файле.
В принципе, Лазарь позволяет с лёгкостью пристегнуть всё это скриптами (секции "до компиляции"/"после компиляции").
И уже работает - написал и отладил. Осталось лишь, как я уже сказал, выкромсать из моего движка, некоторые функции которого оно использует.
Основная идея - даётся утилита, которой обрабатывается exeшник, после чего он очищается strip'ом. Дело в том, что -gw помимо информации о строках генерирует ещё море ненужного мусора (пример: строки - 50 кб, вся отладочная инфа в целом - 400кб ).
Короче, информацию о строках, имо, лучше хранить параллельно, в отдельном файле.
В принципе, Лазарь позволяет с лёгкостью пристегнуть всё это скриптами (секции "до компиляции"/"после компиляции").
Наткнулся на забавную проблему:
Отладочная инфа организована таким образом, что для длл-ок надо прибавлять к указанному адесу базовый адрес дллы, а для основного екзешника - не надо, он уже добавлен.
И вот эта вот процедура, по адресу эксцепшена вычисляющая имя исполняегого файла (exe или одна из загруженных им dll) а также базовый адрес, под пингвинами у меня дала сбой:
Причина - самая дурацкая. dladdr выдаёт истинное имя файла, разворачивая все симлинки, а ParamStr(0) - нет!
Не знает кто надёжной функции в RTL которая отслеживала бы симлинк до основания?
Отладочная инфа организована таким образом, что для длл-ок надо прибавлять к указанному адесу базовый адрес дллы, а для основного екзешника - не надо, он уже добавлен.
И вот эта вот процедура, по адресу эксцепшена вычисляющая имя исполняегого файла (exe или одна из загруженных им dll) а также базовый адрес, под пингвинами у меня дала сбой:
Код: Выделить всё
procedure GetModuleByAddr(addr: pointer; var baseaddr: pointer; var filename: string);
{$ifdef unix}
var
dlinfo: dl_info;
begin
FillChar(dlinfo, sizeof(dlinfo), 0);
dladdr(addr, @dlinfo);
baseaddr:= dlinfo.dli_fbase;
filename:= String(dlinfo.dli_fname);
if filename = ParamStr(0) then baseaddr:= nil;
end;
{$else}
var
Tmm: TMemoryBasicInformation;
TST: array[0..Max_Path] of Char;
begin
if VirtualQuery(addr, @Tmm, SizeOf(Tmm)) <> sizeof(Tmm)
then raise Exception.Create('The VirualQuery() call failed.');
baseaddr:=Tmm.AllocationBase;
TST[0]:= #0;
GetModuleFileName(THandle(Tmm.AllocationBase), TST, SizeOf(TST));
filename:= String(PChar(@TST));
if filename = ParamStr(0) then baseaddr:= nil;
end;
{$endif} Причина - самая дурацкая. dladdr выдаёт истинное имя файла, разворачивая все симлинки, а ParamStr(0) - нет!
Не знает кто надёжной функции в RTL которая отслеживала бы симлинк до основания?
Разработка идёт. Уже собирался выкладывать, когда обнаружил две засады:
А). Не учитывается возможность релокации dll под Win32. Но это легко доработать.
Б). Утилита strip, паскуда, *не умеет* вырезать из екзешников отладочную информацию dwarf, оставляя внутри тону мусора.
Пишу свой strip, более эффективный.
Под вайном результат его самодеятельности уже запускается, осталось проверить под настоящим маздаем.
А). Не учитывается возможность релокации dll под Win32. Но это легко доработать.
Б). Утилита strip, паскуда, *не умеет* вырезать из екзешников отладочную информацию dwarf, оставляя внутри тону мусора.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Ээ... беру свои слова обратно. [возвращает процедуру на место, отряхивая с неё пыль] .dbg файл здоровый, раза три больше того, что яполучаю выдираньем dwarf line info. И где можно узнать про его формат?
Да и свой стрип, в исходниках, иметь не помешает - мало ль, кому пригодится. До полностью рабочего состояния я его уже довёл, полученный екзешник даже upx жрёт не подавившись.
Хммм... А интересная идея - чтобы не плодить тучу файла, стрипаешь, upx'аешь, а потом dwarf line info вставляешь обратно. Ведь из upx'нутого файла её не выцарапаешь, он всё вместе жмёт.
И вообще, exe файл, как оказалось, такая интересная штука - прямо набор кубиков, перебирай - не хочу.
Да и свой стрип, в исходниках, иметь не помешает - мало ль, кому пригодится. До полностью рабочего состояния я его уже довёл, полученный екзешник даже upx жрёт не подавившись.
Хммм... А интересная идея - чтобы не плодить тучу файла, стрипаешь, upx'аешь, а потом dwarf line info вставляешь обратно. Ведь из upx'нутого файла её не выцарапаешь, он всё вместе жмёт.
И вообще, exe файл, как оказалось, такая интересная штука - прямо набор кубиков, перебирай - не хочу.
Короче, чувствую, замотаюсь и не знаю, когда ещё руки дойдут.
Вылолжил пока что есть: http://www.chebmaster.narod.ru/soft/libs_chelinfo.html
Вроде бы, работает.
Вылолжил пока что есть: http://www.chebmaster.narod.ru/soft/libs_chelinfo.html
Вроде бы, работает.
