Отладка приложений

         

LOM-файлы


Просматривая листинг 14.2, нетрудно заметить, что формат LOM-файлов, генерируемых программой GENLIMODS.EXE, в точности соответствует формату файлов *.INI. В первой секции ([Module info]) хранится главная информация того модуля, который использовался при построении LOM-файла (включая имя модуля, его базовый адрес и метку даты/времени). Когда LIMODSDLL.DLL просматривает модуль в памяти, он проверяет его по этой части LOM-файла; если метка даты/времени модуля отличается от соответствующей метки LOM-файла в LIMODSDLL.DLL, то программа GENLIMODS.EXE генерирует новый LOM-файл для этого модуля. Я сохраняю базовый адрес модуля для того, чтобы LIMODSDLL.DLL мог повторно, "на лету" вычислять диапазоны адресов (в случае перемещения модуля загрузчиком образа). LIMODSDLL.DLL также сообщит пользователю (через вызов функции outputoebugstring), что модуль был перемещен.

Листинг 14-2. Пример LOM-файла 

[Module Info] 

DateTimeStamp=380b75e8

BaseAddress=400000 

ModuleName=LIMODS.exe

[Ranges]

RangeCount=11

Range0=0x004017D0|0x00401C8E|0 ID:\Book\SourceCode\LIMODS\About.cpp

Rangel=0x00401EF0|0x00402313|0 ID:\Book\SourceCode\LIMODS\BigIcon.CPP

Range2=0x00402430|0x00402A5E|0|D:\Book\SourceCode\LIMODS\LIMODS.cpp

Range3=0x00402D60| 0x00403727111D:\Book\SourceCode\LIMODS\LIMODSDoc.cpp

Range4=0x004044B0 0x0040480010|D:\Book\SourceCode\LIMODS\LIMODSOptions.cpp

Range5=0x00404950I 0x00405823|0 ID:\Book\SourceCode\LIMODS\LIMODSView.cpp

Range6=0x00405D70|0x00405DB0|0 ID:\Book\SourceCode\LIMODS\LIMODSDoc.h

Range7=0x00406150|0x0040752110 ID:\Book\SourceCode\LIMODS\LOMFile.cpp

Range8=0x00408D00|0x004090FF|0|D:\Book\SourceCode\LIMODS\MainFrm.cpp

Range9=0x00409270 I 0x00409516|0 ID:\Book\SourceCode\LIMODS\OptionsDialog.cpp

RangelO=0x0040A0A0|0x0040A140I 0 Iappmodul.cpp

[Sources]

Source0=0|D:\Book\SourceCode\LIMODS\About.cpp

Sourcel=0|D:\Book\SourceCode\LIMODS\BigIcon.CPP

Source2=0|D:\Book\SourceCode\LIMODS\LIMODS.cpp

Source3=lID:\Book\SourceCode\LIMODS\LIMODSDoc.cpp


Source4=0|D:\Book\SourceCode\LIMODS\LIMODSOptions.cpp

Source5=0ID:\Book\SourceCode\LIMODS\LIMODSView.cpp

Source6=0|D:\Book\SourceCode\LIMODS\LIMODSDoc.h

Source7=0|D:\Book\SourceCode\LIMODS\LOMFile.cpp

Source8=0|D:\Book\SourceCode\LIMODS\MainFrm.cpp

Source9=0|D:\Book\SourceCode\LIMODS\OptionsDialog.cpp

Sourcel0=0|appmodul.cpp

SourceCount=l1

В секции [Ranges] указаны ( в определенном формате) диапазоны адресов исходных файлов. Именно эту секцию, прежде всего, и использует LIMODSDLL.DLL, чтобы определить, какие предложения трассировки показывать и когда их показывать. Поля каждой записи этой секции расположены в следующем порядке: адрес начала диапазона, адрес конца диапазона, булевское значение (флажок) показа трассы и имя исходного файла. Секция [Sources] используется LIMODS.EXE, чтобы показать имена исходных файлов в их полной форме (с именем диска и полным путем в дереве каталогов). Первоначально формат INI-файла был выбран, чтобы облегчить исходное тестирование и скрыть его в специальном классе доступа в файлах LOMFILE.H и LOMFILE.CPP. В дальнейшем выяснилось, что производительность LIMODS.EXE вполне приемлема, поэтому я так и не перешел "к другому формату.



Содержание раздела