在 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".
转到 Tools
> Options
> Debugging
> General
并取消选中 Enable Just My Code
复选框。
确定您需要在哪个函数上设置断点。它并不总是那么明显 - 你可以做的一件事是在代码中编写 set given 属性 value,开始调试,然后右键单击和 select Go To Disassembly
,你将看到如下列表:
所以在这种情况下,我想在 PresentationTraceSources.DataBindingSource.Switch.Level
上设置断点 -
属性 更改,但我需要设置断点
System.Diagnostics.SourceSwitch.set_Level
.
Debug
> New Breakpoint
> Function Breakpoint
.
输入函数名称设置断点。在我的例子中是 System.Diagnostics.SourceSwitch.set_Level
.
请注意,您需要为每个新会话设置相同的断点。
我遇到了一个奇怪的情况,有些东西将主 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".
转到
Tools
>Options
>Debugging
>General
并取消选中Enable Just My Code
复选框。确定您需要在哪个函数上设置断点。它并不总是那么明显 - 你可以做的一件事是在代码中编写 set given 属性 value,开始调试,然后右键单击和 select
Go To Disassembly
,你将看到如下列表:
所以在这种情况下,我想在 PresentationTraceSources.DataBindingSource.Switch.Level
上设置断点 -
属性 更改,但我需要设置断点
System.Diagnostics.SourceSwitch.set_Level
.
Debug
>New Breakpoint
>Function Breakpoint
.
输入函数名称设置断点。在我的例子中是 System.Diagnostics.SourceSwitch.set_Level
.
请注意,您需要为每个新会话设置相同的断点。