在windbg中以用户模式转储中查找hwnd信息

时间:2014-02-25 20:38:43

标签: c++ visual-c++ windbg hwnd window-handles

我正在尝试解决我的一个应用程序崩溃,并且调用堆栈的顶部看起来像这样

0012f480 7739b6e3 0002051e 0000001f 00000000 <Unloaded_A.dll>+0x172b6
0012f4ac 7739b874 15b772b6 0002051e 0000001f user32!InternalCallWinProc+0x28
0012f524 7739c8b8 0b4d074c 15b772b6 0002051e user32!UserCallWinProcCheckWow+0x151 (FPO: [Non-Fpo])
0012f580 7739c9c6 02acfc48 0000001f 00000000 user32!DispatchClientMessage+0xd9 (FPO: [Non-Fpo])
0012f5a8 7c8283c6 0012f5c0 00000018 0012f6f8 user32!__fnDWORD+0x24 (FPO: [Non-Fpo])
0012f5d4 7738a8db 77388416 0002051e 00000000 ntdll!KiUserCallbackDispatcher+0x2e (FPO: [0,0,0])
0012f5ec 0d58c9a6 0002051e 00000000 0012f61c user32!NtUserCallHwndParamLock+0xc

以上是通过在我的转储上执行kv,看起来模块正在卸载但是仍然存在窗口并且没有被正确销毁,

我想知道有关我的hwnd的信息,这里有 002051e ,如窗口标题,窗口程序和其他详细信息。

我尝试在堆上搜索地址以查找与其相关的任何信息,但我找不到任何信息。

有一些像!hwnd可用的扩展可以显示hwnd信息,但我猜这些扩展是微软的内部信息,是否有任何扩展可供每个人使用以显示这些信息?

有什么方法可以找到这些信息吗?

1 个答案:

答案 0 :(得分:1)

我不知道任何WinDbg内置命令,所以我可能会指向SDbgExt,它根据需要提供了!hwnd 命令。它输出,窗口标题和类,窗口样式和扩展样式,父窗口句柄和其他可能有趣的信息。不幸的是,SDbgExt仅适用于实时调试,因为它从系统而不是进程的内存中获取信息。如果它在转储中工作,那么转储和实时系统之间就会发生冲突,您将获得完全误导性的信息。

原因是Windows内核处理Windows和消息队列,因此您在用户模式转储中没有该信息。您需要内核转储来获取该信息 - 可能SDbgExt不是为此用途而设计的。