如何找到可用的调试开关?或者给定一个开关找出被禁用的内容?
-
09-06-2019 - |
题
在这个 问题 答案是打开调试器拾取的开关,禁用导致问题的无关标头。Microsoft 帮助暗示这些开关是用户生成的,并且没有列出任何开关。
<configuration>
<system.diagnostics>
<switches>
<add name="Remote.Disable" value="1" />
</switches>
</system.diagnostics>
</configuration>
我想知道的是“Remote.Disable”值从何而来以及如何找出可以打开或关闭哪些其他东西。目前它只是一些配置魔法,我不喜欢魔法。
解决方案
正如您所怀疑的,Remote.Disable 会阻止应用程序将调试信息附加到远程请求。它在发出 SOAP 请求的 .NET 框架方法内定义。
基本情况是这些开关可以在代码中的任何位置定义,您只需要使用给定的名称创建一个新的 System.Diagnostics.BooleanSwitch 并且配置文件可以控制它们。
这一特定的定义在 System.ComponentModel.CompModSwitches.DisableRemoteDebugging 中:
public static BooleanSwitch DisableRemoteDebugging
{
get
{
if (disableRemoteDebugging == null)
{
disableRemoteDebugging = new BooleanSwitch("Remote.Disable", "Disable remote debugging for web methods.");
}
return disableRemoteDebugging;
}
}
在你的情况下,它可能是从调用的 System.Web.Services.Protocols.RemoteDebugger.IsClientCallOutEnabled(), ,正在被调用 System.Web.Services.Protocols.WebClientProtocol.NotifyClientCallOut 依次由 Invoke 方法调用 System.Web.Services.Protocols.SoapHttpClientProtocol
不幸的是,据我所知,缺乏反编译框架和搜索
new BooleanSwitch
或任何其他继承人 系统.诊断.开关 课堂,没有简单的方法可以知道哪些开关已定义。这似乎是在 msdn/google/stack Overflow 中搜索特定案例的情况
在这种情况下,我只是使用 Reflector 并搜索 Remote.Disable 字符串
其他提示
您可以使用 Reflector 来搜索 Switch 类及其子类(BooleanSwitch、TraceSwitch 等)的使用。各种开关都是按名称硬编码的,所以据我所知,某处没有主列表。