0

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

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 信息,但我猜这些是 Microsoft 内部的,是否有任何扩展可供每个人使用来显示此信息?

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

4

1 回答 1

2

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

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

于 2014-02-26T12:51:38.720 回答