delphi - 有没有什么快速方法可以在调试时停止在特定的 Windows 消息或 API 处?

标签 delphi debugging winapi windows-messages conditional-breakpoint

所以我想在特定的 API 或 Windows 消息中放置一个断点。 如果不在任何 Delphi 版本中编写代码,我找不到任何简单的方法来做到这一点。 有没有办法做到这一点,就像我可以在内存访问中设置断点一样?

最佳答案

要停止对 API 函数的任何调用,请在 Windows.pas 的 implementation 部分(或声明感兴趣的函数的任何地方)找到它,并设置断点。它负责处理您在加载时动态链接中使用的函数。对于运行时动态链接(LoadLibraryGetProcAddress),您需要不同的技术。获取 GetProcAddress 结果的变量将保存您想要中断的地址,但我不知道如何在该地址设置断点。

停止在 Window 消息上比较棘手,因为可以在很多地方检索消息。您必须改用条件断点。

要捕获大多数已发布的消息,您可以在调用 PeekMessage 后第一行的 TApplication.HandleMessage 中放置一个断点。将条件设置为 Msg.Message = xHandleMessage 负责处理发布到主 Application.Run 主消息循环的主线程消息队列以及 VCL 模态​​消息循环的消息。不过,其他模式对话框(例如 Windows.MessageBox)不会使用它。

观察发送的消息比较困难,因为操作系统将它们直接分派(dispatch)到目标窗口过程。您必须在您感兴趣的每个窗口类的窗口过程中设置一个断点。您可以通过将条件断点放入 Classes.StdWndProc 中来获取大多数 VCL 窗口类。

请记住,条件断点可能会非常慢。它们的工作原理是调试器在其中放置一个无条件断点,当操作系统触发它时,调试器接管,检查条件,然后在条件失败时恢复执行。这可能会涉及大量开销,在调试器和应用程序之间进行切换;程序接收大量消息,因此,如果您能找到一种方法来避免调试器中断您的程序来检查每一条消息,那就去做吧。

如果这对于您尝试调试的任何内容都不可行,那么我建议您发布一个新问题,在其中描述您真正想要解决的问题。

关于delphi - 有没有什么快速方法可以在调试时停止在特定的 Windows 消息或 API 处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475133/

相关文章:

iphone - 如何从 UIView 或 UIWindow 获取 CGContextRef 以调试外部绘制方法?

delphi - 如何在 Firemonkey 中加载自定义光标?

debugging - 清除 ISE Powershell 环境/调试方法

c - 调试 C 中的函数

c - GWL_WNDPROC未声明

c - iowin32.h 中的 OF 宏

delphi - 如何将 Delphi 字符串传递给 Prism DLL?

delphi - 如何在所有其他应用程序之上监视键盘,然后向它们发送其他键

delphi - 以公制单位准确计算文本宽度

c++ - Winbase.h 不支持创建 DLL 文件