是否有Windbg / NTSD命令告诉我在实时调试会话中附加的进程是32位还是64位?
你能告诉我两个:
和
对于托管版本,我可以在C#中以编程方式找到它,但我仍然想知道是否有针对此的Windbg命令。
更新
我正在调试的目标进程是Microsoft Word(winword.exe)。 Office版本是2016年,但我不确定它是32位还是64位二进制文件。以下是一些观察结果:
目标位置为 C:\ Program Files(x86)\ Microsoft Office \ root \ Office16 \ WinWord.exe
管道(|
)命令告诉我的不过是PID,过程是否附加到调试器以及加载图像的路径(如上面#1中所述)
我正在64位计算机上进行调试。因此,r显示64位寄存器。
在没有崩溃的情况下附加到一个实时,健康的进程(我刚刚打开MS Word并说“Attach to Process”),当前线程(k
)的callstack读取{{1}为最热门的电话。这个#1表明该过程是一个32位进程。
已尝试的命令
但我想知道是否有办法找出答案。
答案 0 :(得分:4)
为了快速测试,我经常使用
lm m wow64
检查是否加载了WOW64图层。如果是这样,它就是一个32位进程。
这种方法在许多情况下都有效,因为OS今天很可能是64位。但是,您也可以使用32位转储32位操作系统,在这种情况下,这种方法效果不佳。
更具权威性的方法
.load wow64exts
!info
不幸的是,它提供了大量输出,因此在脚本中很难使用。
32位输出看起来像
0:000> !info
PEB32: 0xe4d000
PEB64: 0xe4c000
Wow64 information for current thread:
TEB32: 0xe50000
TEB64: 0xe4e000
[...]
如果是64位,则为
0:000> !info
Could not get the address of the 32bit PEB, error 0
PEB32: 0
PEB64: 0x6b33c50000
Wow64 information for current thread:
TEB32: 0
TEB64: 0x6b33c51000
[...]
我没有32位Windows操作系统转储可用,但我认为可以安全地说
如果您知道模块名称,还可以检查文件头:
0:000> .shell -ci "!dh -f notepad" findstr "machine"
8664 machine (X64)
.shell: Process exited
vertarget
对于32位应用程序的64位故障转储不起作用。
$ptrsize
会很好,但这取决于调试器模式:
0:000> ? $ptrsize
Evaluate expression: 8 = 00000000`00000008
0:000> .effmach x86
Effective machine: x86 compatible (x86)
0:000:x86> ? $ptrsize
Evaluate expression: 4 = 00000004
与WOW64图层类似,您可以检查.NET:
lm m mscorwks
lm m clr
lm m coreclr
当然可以直接从本机代码通过LoadLibrary()
加载这样的DLL,而不是使用.NET,但我认为很少使用那些想欺骗你的人。