Оптимизация запуска приложений .NET - Определение кода, загружаемого с диска
ОГЛАВЛЕНИЕ
Определение кода, загружаемого с диска
Следующий шаг -- определить, что загружается с диска и выяснить, нет ли кода, который загружается без надобности. Самый быстрый способ определить, что загружается в память -- средство VADump (его можно найти в пакете Windows Platform SDK). На рис. 3 показан фрагмент отчета, создаваемого при выполнении следующей команды:
Figure 3 VADump Output
Category Total Private Shareable Shared
Pages KBytes KBytes KBytes KBytes
Page Table Pages 177 708 708 0 0
Other System 39 156 156 0 0
Code/StaticData 8169 32676 2160 8336 22180
Heap 14042 56168 56168 0 0
Stack 0 0 0 0 0
Teb 0 0 0 0 0
Mapped Data 8 32 0 4 28
Other Data 1 4 4 0 0
Total Modules 8169 32676 2160 8336 22180
Total Dynamic Data 14051 56204 56172 4 28
Total System 216 864 864 0 0
Grand Total Working Set 22436 89744 59196 8340 22208
Module Working Set Contributions in pages
Total Private Shareable Shared Module
72 2 70 0 HeadTrax - HeadTrax.exe
107 7 0 100 ntdll.dll
37 4 6 27 mscoree.dll
77 3 0 74 KERNEL32.dll
6 2 0 4 LPK.DLL
27 4 0 23 USP10.dll
116 4 0 112 comctl32.dll
878 23 79 776 mscorwks.dll
Heap Working Set Contributions
0 pages from Process Heap (class 0x00000000)
0 pages from Process Heap (class 0x00000000)
9332 pages from Process Heap (class 0x00000000)
0x0255850F - 0xC255350F 9332 pages
0 pages from Process Heap (class 0x00000000)
0 pages from Process Heap (class 0x00000000)
4710 pages from Process Heap (class 0x00000000)
0x00040000 - 0x10040000 4710 pages
0 pages from Process Heap (class 0x00000000)
Stack Working Set Contributions
0 pages from stack for thread 00001018
0 pages from stack for thread 000017EC
0 pages from stack for thread 0000187CVADump –sop <proc ID>
Важно помнить, что VADump показывает, что загружено в память, только при работе средства, поэтому оно может пропустить модули, загружаемые в память на короткое время. Оно также не показывает ту часть приложения (код или данные), которая была записана на диск. Задача состоит в том, чтобы на основании отчета VADump определить, нужно ли загружать все модули в списке. Например, если приложение не использует XML, а System.Xml оказался загружен, нужно разобраться.
Выяснить, что загрузило сборку, можно с помощью команды sxe в отладчике Windows (windbg). Команда "sxe ld:< имя dll>" прерывает работу отладчика при загрузке указанного DLL. Затем можно проверить стек вызовов и выяснить, какая функция загрузила DLL в память. Не следует недооценивать эту часть исследования. Очень легко потерять контроль за тем, что приложение загружает в память.