如何从转储文件确定 /LARGEADDRESSAWARE
有时在调试时,您希望知道某个特定进程是否使用 /LARGEADDRESSAWARE标志链接,从而能够使用高于2Gb边界的用户模式地址。我的解决方案是:
!address -summary将显示进程的有效用户模式地址空间:
0:022> !address –summary
..
Tot: 7fff0000 (2097088 KB) Busy: 278fd000 (648180 KB) <<< 2Gb for non-large-address-aware EXE or large address aware EXE on x86 system without /3Gb in boot.ini
或者
Tot: bd7f0000 (3104704 KB) Busy: 23dee000 (587704 KB) <<< 3Gb for large-address-aware EXE on x86 system with /3Gb in boot.ini
或则
Tot: ffff0000 (4194240 KB) Busy: 268b2000 (631496 KB) <<< 4Gb for large-address-aware EXE running with WoW64 on x64 system
但是,由于第一种情况不明确,要实际查看EXE是否与/LargeAddressware链接,请执行以下操作:
0:000> !dlls -c inetinfo <<< inetinfo is the module name of the EXE in this case]
Dump dll containing 0x01000000:
0x00081eb0: C:WINDOWSsystem32inetsrvinetinfo.exe
Base 0x01000000 EntryPoint 0x0100326e Size 0x00006000
Flags 0x00004000 LoadCount 0x0000ffff TlsIndex 0x00000000
LDRP_ENTRY_PROCESSED
0:000> .shell -i - -ci "!dlls -f 0x00081eb0" FIND "characteristics"
12F characteristics
特征字段是:0x12f&0x20==0x20。这是IMAGE_FILE_LARGE_ADDRESS_AWARE的值。–有关此定义和相关定义,请参阅平台SDK中的winnt.h。
所以这个EXE可以识别大地址。
注意,上面使用的.shell命令(用于shell到另一个EXE,在本例中是“FIND”)是我一直用来过滤调试器命令输出的内容。非常方便。