所以我想在特定的 API 或 Windows 消息中放置一个断点。如果不在任何 Delphi 版本中编写代码,我找不到任何简单的方法来做到这一点。有没有办法做到这一点,因为我可以在内存访问中设置断点?
2 回答
要停止对 API 函数的任何调用,请在Windows.pasimplementation
部分(或声明感兴趣的函数的任何位置)找到它并设置断点。这会处理您在加载时动态链接中使用的功能。对于运行时动态链接(和),您需要一种不同的技术。获得结果的变量将保存您想要中断的地址,但我不知道如何在该地址设置断点。LoadLibrary
GetProcAddress
GetProcAddress
在 Window 消息上停止比较棘手,因为可以在许多地方检索消息。您必须改用条件断点。
要捕获大多数已发布的消息,您可以TApplication.HandleMessage
在调用PeekMessage
. 设置条件为Msg.Message = x
。HandleMessage
负责为主Application.Run
消息循环以及 VCL 的模式消息循环发布到主线程的消息队列的消息。不过,其他模式对话框(例如Windows.MessageBox
)不会使用它。
观察发送的消息更加困难,因为操作系统直接将它们分派到它们的目标窗口过程。您必须在您感兴趣的每个窗口类的窗口过程中设置一个断点。您可以通过将条件断点放在Classes.StdWndProc
.
请记住,条件断点可能非常慢。它们通过调试器在那里放置一个无条件断点来工作,当操作系统触发它时,调试器接管,检查条件,然后如果条件失败,则恢复执行。这可能涉及大量开销,在调试器和您的应用程序之间切换;程序会收到很多消息,所以如果你能找到一种方法来避免让调试器中断你的程序来检查每一个消息,那就去做吧。
如果这对于您要调试的任何内容都不可行,那么我建议您发布一个新问题,在其中描述您真正要解决的问题。
您需要进入选项 | 链接器并检查“调试 DCU”。默认情况下不选中此项,因此当您尝试工作时,调试器不会单步执行整个 VCL。