微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 在调试时,有什么快捷方法可以停止在特定的Windows消息或API上?

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

解决方法

要停止对API函数的任何调用,请在Windows.pas的实现部分(或声明感兴趣的函数的任何位置)中找到它并设置断点.这样可以处理您在加载时动态链接时使用的功能.对于运行时动态链接(LoadLibrary和GetProcAddress),您将需要一种不同的技术.获取GetProcAddress结果的变量将保存您想要中断的地址,但我不知道如何在该地址设置断点.

停止窗口消息比较棘手,因为可以在许多地方检索消息.您将不得不使用条件断点.

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

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

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

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

原文地址:https://www.jb51.cc/delphi/101465.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐