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

EMB*_*osa 6 delphi debugging winapi conditional-breakpoint windows-messages

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

Rob*_*edy 12

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

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

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

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

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

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

  • 您可以在特定地址添加断点...运行应用程序在断点处断开后(如调用`GetProcAddress`),转到断点窗口,以某种方式捕获过程的地址,打开在断点窗口中,右键单击并选择"添加">"地址断点".然后你输入地址.调试器在到达该地址时应该会中断.注意:该地址显然仅对您的可执行文件的一次调用有效. (4认同)