Оптимизация запуска приложений .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 0000187C

VADump –sop <proc ID> 

Важно помнить, что VADump показывает, что загружено в память, только при работе средства, поэтому оно может пропустить модули, загружаемые в память на короткое время. Оно также не показывает ту часть приложения (код или данные), которая была записана на диск. Задача состоит в том, чтобы на основании отчета VADump определить, нужно ли загружать все модули в списке. Например, если приложение не использует XML, а System.Xml оказался загружен, нужно разобраться.

Выяснить, что загрузило сборку, можно с помощью команды sxe в отладчике Windows (windbg). Команда "sxe ld:< имя dll>" прерывает работу отладчика при загрузке указанного DLL. Затем можно проверить стек вызовов и выяснить, какая функция загрузила DLL в память. Не следует недооценивать эту часть исследования. Очень легко потерять контроль за тем, что приложение загружает в память.