在将庞大的分布式系统部署到我们的客户之后,我们遇到了一个意想不到的错误.在调查期间,我们更换组件导致错误,我们添加了一些诊断代码.我们使用的dll内置在调试模式.突然一切都奏效!
使用发行版本(使用诊断代码)替换debug dll会使其再次崩溃.
在我们的代码中没有预编译指令,条件调试属性等.这个问题已经在两个不同的安装地点被发现,而它的工作正常.
(该项目混合了C#和VB.NET,麻烦汇编是VB.NET ..,如果有任何区别)
所以问题是:在这样的情况下你做什么?一般可以是什么原因?任何关于调试此问题的建议是受欢迎的.
对于原因…好的,一些暗示的症状将有所帮助.一种可能性是你有一个方法,如Debug.WriteLine有副作用(即使它的工作).调用标有[条件(…)]的方法不会被编译,除非你有正确的符号定义 – 所以任何标记为[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);
现在它在任一模式下被调用.