在将我们庞大的分布式系统部署到我们的客户之后,我们遇到了意外错误.在调查期间,我们将导致错误的组件替换为我们添加了一些诊断代码的组件.我们使用的DLL是在调试模式下构建的.突然一切都行了!
使用发行版本(使用诊断代码)替换调试dll会使其再次崩溃.
我们的代码中没有预编译器指令,条件调试属性等.在两个不同的安装站点中发现了这个问题,而在几个安装站点中它可以正常工作.
(该项目混合了C#和VB.NET,麻烦组件是VB.NET ..,如果这有什么不同)
所以问题是:你在这样的情况下做了什么?原因可能是什么?欢迎任何有关调试此问题的建议.
对于原因......好吧,一些症状的暗示会有所帮助.一种可能性是你有一个类似方法的代码Debug.WriteLine
有副作用(即使其工作).[Conditional(...)]
除非您定义了正确的符号,否则不会编译对标记为的方法的调用- 因此任何标记的内容[Conditional("DEBUG")]
都将被静默删除.
它也可能是编译器错误,但这有点不太可能(但并非不可能).
什么是症状?怎么破?
作为上述例子:
static string Bar { get; set; } static void Main() { Bar = "I'm broken"; Debug.WriteLine(Foo()); Console.WriteLine(Bar); } // note Foo only called in DEBUG builds static string Foo() { Bar = "I'm working"; return "mwahahah"; }
在DEBUG模式下编译它打印"我正在工作"; 在RELEASE模式下编译它打印"我坏了".这听起来有点类似吗?检查您是否直接使用具有副作用的东西调用任何调试方法.在大多数情况下,您可以通过间接修复:
string foo = Foo(); Debug.WriteLine(foo);
现在它以任一模式调用.
您可以尝试在Build Settings中关闭Optimize Code.你得到的实际错误是什么.
您可以做的另一件事是在发布模式下编译,但启用#Debug条件.如果你使用Diagnostics.Debug及其中的代码影响你的应用程序,这将处理这种情况.