在Delphi中调试时如何跳过汇编代码?

在Delphi中调试时如何跳过汇编代码?,delphi,Delphi,有时,在调试时,特别是在捕获异常并执行调用的析构函数时,Delphi会逐步执行大量汇编代码。按Shift+F8键似乎会造成混乱 我可以告诉调试器自动跳过汇编代码吗?您可以使用{$D-}指令关闭代码块的调试。我想这会让你实现你想要的 另外-不要在汇编代码中使用shift F8,我相信它会导致各种各样的问题-最好将光标放在块后面,并将F4向下移动到块后面。根据我的经验,绝大多数此类汇编代码都使用VCL或RTL单位 如果编译时禁用了“Debug.dcu”,则调试器将不会单步执行此代码。但是,它也不会单

有时,在调试时,特别是在捕获异常并执行调用的析构函数时,Delphi会逐步执行大量汇编代码。按Shift+F8键似乎会造成混乱


我可以告诉调试器自动跳过汇编代码吗?

您可以使用{$D-}指令关闭代码块的调试。我想这会让你实现你想要的


另外-不要在汇编代码中使用shift F8,我相信它会导致各种各样的问题-最好将光标放在块后面,并将F4向下移动到块后面。

根据我的经验,绝大多数此类汇编代码都使用VCL或RTL单位

如果编译时禁用了“Debug.dcu,则调试器将不会单步执行此代码。但是,它也不会单步执行任何其他VCL/RTL代码—汇编程序或Pascal。假设您为项目启用了调试信息,则它仍将逐步执行不属于VCL/RTL的任何代码

关闭VCL/RTL调试单元是否会使调试您可能遇到的任何特定问题变得更容易或更难,这当然取决于您的具体情况,但通常情况下,VCL/RTL代码内部发生的事情影响不大,除非您消除了自己代码中出现错误的可能性,然后需要调查VCL/RTL本身中的潜在错误

对于我自己,我已经关闭了“Debug.dcus”,除非我需要打开它们


您的里程数可能会有所不同。

如果您看到汇编代码,您可能在Alt-F2 CPU视图中。只需关闭CPU视图(旧Delphi上的escape键,或关闭其选项卡),您将继续在pascal源代码中单步执行(例如,按F7或F8)

如果你在.pas文件的中间看到汇编代码(在<代码> ASM……结尾/代码>块),那么你可以尝试到它的结尾(在<代码>结束/代码>级别),按F4(Shift F8是BGGY)。但是请注意,它可能不是在
末尾退出,而是在内部
ret
汇编程序操作代码中退出。因此,我个人的建议是,如果您不了解assembler,请显示调用堆栈(此窗口显示将您带到当前程序位置的函数调用以及传递给每个函数调用的参数),然后双击父调用方。这永远是安全的


有关调试的其他信息,例如,..

发现--1{$D-}作用域对于单元是全局的,因此它不会与代码块一起工作。如果所讨论的代码位于VCL/RTL单元中,这将没有帮助,因为这些代码是预编译的,并且不包括在构建/编译过程中。这正是为什么提供了“Use debug.dcu”选项——它允许您在$D+和$D-版本的VCL/RTL dcu之间切换。我可能错了,但是——正如我的回答所反映的那样——我真的不认为OP指的是“CPU窗口”,因为他特别谈到了通过析构函数的步骤。调试器可能会在CPU窗口中打开,但我认为您不会经常发现自己从源代码进入CPU窗口。更可能的情况是,它引用了VCL/RTL中的那些例程,这些例程被编码为内联汇编程序,并在过程结束时由“编译器魔术”调用,例如FinalizeRecord等。@Deltics默认情况下,您看不到此RTL源代码行。只有CPU视图将显示这些asm行。这是我的第一段。在asm..end blocks内部(如您所描述的),我在第2段中提供了一种安全的方法来检索调用方。如果您有“使用调试DCU”并且正在逐步执行析构函数,那么您将经常看到RTL源代码,特别是当您使用引用类型(如字符串、动态数组或接口)甚至自定义析构函数时(或其他过程)将有编译器注入的尾声代码来调用各种RTL例程,其中许多被编码为内联汇编程序。无论如何,从OP的大量感谢中可以看出,我的灵媒袜子在这个场合工作得很好。:)赢家鸡肉晚餐。正是我想要的。谢谢。另外,还要感谢你的屏幕截图。对于像我这样的新人来说,“关闭Debug.dcus”是非常不神秘的。