它不会,它会在您发出 Debug + Break 命令时停止在任何活动的代码处。您可以在调试器的调用堆栈窗口中看到。然而,你会中断任何你自己正在执行的代码的可能性非常小,你的程序花费 99% 的时间等待 Windows 告诉它发生了一些有趣的事情。这使得调用堆栈通常看起来像:
[Managed to Native Transition]
System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(System.IntPtr dwComponentID, int reason, int pvLoopData) + 0x444 bytes
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(int reason, System.Windows.Forms.ApplicationContext context) + 0x155 bytes
System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(int reason, System.Windows.Forms.ApplicationContext context) + 0x4a bytes
System.Windows.Forms.dll!System.Windows.Forms.Application.Run(System.Windows.Forms.Form mainForm) + 0x31 bytes
> WindowsFormsApplication1.exe!WindowsFormsApplication1.Program.Main() Line 16 + 0x1d bytes C#
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6b bytes
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x27 bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x6f bytes
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0xa7 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) + 0x16 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x41 bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes
[Native to Managed Transition]
请注意 FPushMessageLoop() 方法如何位于堆栈跟踪之上。这是 Windows GUI 应用程序中著名的消息循环,即接收 Windows 通知的应用程序。如果您还启用了非托管调试,那么您会看到更多,核心 GetMessage() winapi 函数是消息循环的重要组成部分。
请注意>
堆栈跟踪中的标记。这就是您正在谈论的代码行。您看到它的原因是因为它上面的代码是 .NET 框架的一部分。如果你没有安装参考源,你就没有它的源代码。
所以调试器只是沿着堆栈向下走,寻找任何相关的源代码来显示。并且不可避免地会出现在 Program.cs 中的 Main() 方法中,即 Application.Run() 调用。
在 GUI 应用程序中获得有用的中断需要设置断点。