netease-im / NIM_Duilib_Framework

网易云信Windows应用开发框架。
MIT License
2.09k stars 834 forks source link

调试程序时按F12健程序抛出异常 提示未加载 ntdll.pdb #442

Closed Zo213 closed 2 years ago

Zo213 commented 2 years ago

问题现象

我的程序有一块功能是监听键盘事件,但是我在调试模式下按下F12程序会异常 ,提示未加载ntdll.pdb,按下F10则无法捕获到键值。

屏幕截图 2022-07-20 233532

然后我下载了netease-im/NIM_Duilib_Framework #[的maser分支的最新代码(#0197de4)进行尝试,发现这个问题依然存在,只要在调试状态下按下F12就会浮现] @nmgwddj 因为程序异常后没有在代码产生中断,忽略之后程序也能正常运行,所以希望能向您寻求到帮助

Zo213 commented 2 years ago

用develop分支的示例程序也会有同样的问题

nmgwddj commented 2 years ago

捕获到异常后栈信息停止在 ntdll.dll 的某个函数中,在 Visual Studio 展示栈信息时会尝试加载 ntdll.dll 符号表文件(ntdll.pdb)以显示完整的函数调用栈。 在您的截图中勾选 Microsoft 符号服务器后点击加载即可加载该符号本地进行调试查看终端函数调用栈信息,排查问题原因。

Zo213 commented 2 years ago

捕获到异常后栈信息停止在 ntdll.dll 的某个函数中,在 Visual Studio 展示栈信息时会尝试加载 ntdll.dll 符号表文件(ntdll.pdb)以显示完整的函数调用栈。 在您的截图中勾选 Microsoft 符号服务器后点击加载即可加载该符号本地进行调试查看终端函数调用栈信息,排查问题原因。

以下是我使用示例项目basic 测试的情况: 我在basic_form源文件中重写了HandleMessage函数来获取 WM_KEYDOWN 事件, 在调试中,按下键盘F1到F9,HandleMessage函数都可以获取到WM_KEYDOWN消息,按下F10无反应,按下F11偶尔有反应,按下F12则会报出异常,加载符号之后信息如下: 屏幕截图 2022-08-02 145358

Zo213 commented 2 years ago

用原版duilib测试也遇到了相同的问题

nmgwddj commented 2 years ago

捕获到异常后栈信息停止在 ntdll.dll 的某个函数中,在 Visual Studio 展示栈信息时会尝试加载 ntdll.dll 符号表文件(ntdll.pdb)以显示完整的函数调用栈。 在您的截图中勾选 Microsoft 符号服务器后点击加载即可加载该符号本地进行调试查看终端函数调用栈信息,排查问题原因。

以下是我使用示例项目basic 测试的情况: 我在basic_form源文件中重写了HandleMessage函数来获取 WM_KEYDOWN 事件, 在调试中,按下键盘F1到F9,HandleMessage函数都可以获取到WM_KEYDOWN消息,按下F10无反应,按下F11偶尔有反应,按下F12则会报出异常,加载符号之后信息如下: 屏幕截图 2022-08-02 145358

尝试脱离 Visual Studio IDE 后,手动运行可执行文件来测试快捷键效果。

Zo213 commented 2 years ago

捕获到异常后栈信息停止在 ntdll.dll 的某个函数中,在 Visual Studio 展示栈信息时会尝试加载 ntdll.dll 符号表文件(ntdll.pdb)以显示完整的函数调用栈。 在您的截图中勾选 Microsoft 符号服务器后点击加载即可加载该符号本地进行调试查看终端函数调用栈信息,排查问题原因。

以下是我使用示例项目basic 测试的情况: 我在basic_form源文件中重写了HandleMessage函数来获取 WM_KEYDOWN 事件, 在调试中,按下键盘F1到F9,HandleMessage函数都可以获取到WM_KEYDOWN消息,按下F10无反应,按下F11偶尔有反应,按下F12则会报出异常,加载符号之后信息如下: 屏幕截图 2022-08-02 145358

尝试脱离 Visual Studio IDE 后,手动运行可执行文件来测试快捷键效果。

我的程序有部分功能是监听键盘事件,其中F10按键动作没有响应。F11和F12有概率没有响应,但是快速持续按这个两个键可以触发出按键事件。

Zo213 commented 2 years ago

已经解决了这个问题。根据微软文档的说明,F10属于系统按键,需要通过WM_SYSKEYDOWN和 WM_SYSKEYUP来捕获消息,并且当前窗口不会接收到其他的按键消息。 要持续地监听键盘事件地话,需要在处理了WM_SYSKEYDOWN和 WM_SYSKEYUP之后将消息传递给DefWindowProc函数 return DefWindowProc(NULL, uMsg, wParam, lParam);

关于调试下按F12报出异常的问题,在win32应用上也会出现。但是不调试运行功能正常。