我故意在下面这个非常简单的函数中将NULL句柄传递给GetExitCodeThread()
以理解某些内容。
void CStringDemoDlg::OnBnClickedButtonTest()
{
DWORD dwExitCode = 0;
HANDLE hThread = 0;
GetExitCodeThread(hThread, &dwExitCode);
}
在常规运行中,没有什么不好的事情发生,但是当我使用我的内存检查器工具运行时,它会捕获一个NULL句柄正在传递并停止执行,我看到句柄是NULL,到目前为止一直很好。
现在如果我选择继续调试,它会抛出以下异常。
但它提到的地址(773bbb47)与寄存器或其他任何内容都不匹配。寄存器的值是:
0:000> r
eax=00000000 ebx=00000000 ecx=0043e104 edx=0043e105 esi=77560560 edi=0043e6c4
eip=77560572 esp=0043e568 ebp=0043e588 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
ntdll!NtQueryInformationThread+0x12:
77560572 83c404
最重要的是,在它抛出第一次机会异常之后它抛出了上面的对话但是在后续运行之后它不再抛出异常错误对话框但是抛出了第一次机会(似乎现在正在处理而没有任何代码更改! ?)
我的问题是这个错误对话框中地址的真正含义是什么?为什么它不对应什么?
如果我尝试在这个地址上设置断点,结果在下面(它没有找到符号),但符号实际上不是一个问题,因为它们被加载(我从源代码运行)。这只是另一个意外错误。
0:000> bm r 773bbb47
No matching code symbols found, no breakpoints set.
我知道我不应该担心这个错误对话框,因为它显然是由NULL句柄产生的,但我想理解为什么这样的内存会出现与内存不对应的异常!