在 visual studio 中,当 属性 更改不属于托管语言(如 C#)时,如何中断调试器

In visual studio, how do you break the debugger when a property changes that you do not own in a managed language (like C#)

我遇到了一个奇怪的情况,有些东西将主 MDI 窗体的 TopMost 属性 设置为 true。经过多次试验和错误后,我们非常确定这一定来自第三方库,但它不在我们期望的任何地方。

如果我们可以将应用程序设置为在设置此 属性 时在调试器中中断,那么修复此问题将非常容易。然而,这个 属性 是由 WinForms 库定义的,所以我们不能只在其中放置一个断点。

如果你正在使用一个没有源代码的库,那将是非常宝贵的,但我担心这个问题没有解决方案,因为托管语言不支持数据断点(因为据我所知)。

那么,在 C# 中,如果您无权在 setter 中放置断点,当 属性 发生更改时,您是否知道有一种方法可以中断?这可以轻松解决许多边缘情况问题,在这些情况下,事情会因您无法预料的原因而发生变化。

可以在不属于您的代码上设置断点。由于 TopMost 是 属性,您所要做的就是在 setter.

上放置一个断点

只需打开 Visual Studio 中的 "breakpoints" 面板(调试 -> Windows -> 断点),单击 "New -> Function Breakpoint" 然后键入:

System.Windows.Forms.Form.set_TopMost

运行 您的应用程序(确保符号已加载),并获利。

请注意,您还需要确保禁用 "Just my code"。进入工具 -> 选项 -> 调试 -> 常规,然后取消选中 "Enable Just My Code".

  1. 转到 Tools > Options > Debugging > General 并取消选中 Enable Just My Code 复选框。

  2. 确定您需要在哪个函数上设置断点。它并不总是那么明显 - 你可以做的一件事是在代码中编写 set given 属性 value,开始调试,然后右键单击和 select Go To Disassembly,你将看到如下列表:

所以在这种情况下,我想在 PresentationTraceSources.DataBindingSource.Switch.Level 上设置断点 - 属性 更改,但我需要设置断点 System.Diagnostics.SourceSwitch.set_Level.

  1. Debug > New Breakpoint > Function Breakpoint.

输入函数名称设置断点。在我的例子中是 System.Diagnostics.SourceSwitch.set_Level.

请注意,您需要为每个新会话设置相同的断点。