使用调试运行Debug构建并且没有调试时有什么不同?

时间:2011-09-03 01:01:55

标签: .net debugging clr

我曾经相信,如果我们得到Debug版本,那么是否真的无关紧要:

  1. 我们跑了。
  2. 或者我们调试了它。
  3. 一切都会一样。

    然而,最近我遇到了两个不同的问题,即当代码刚刚运行时,或者当它被调试时,即使代码版本被认为是相同的,它也会明确不同。 (即Fluent NHibernate cannot load MySql.Data from GAC in debug mode of a testNpgsql - Specified method is not supported

    我想知道.NET 4.0中这两者之间有什么区别?了解不同可能有助于我解决我遇到的问题,因为我至少知道在哪些地方寻找可能导致错误的原因。当我将单元测试全部运行为绿色时,我不明白它,但当我尝试调试它们时,我会抛出各种异常..

4 个答案:

答案 0 :(得分:4)

装配解决问题的首选武器是fuslogvw.exe,它显示了它查找装配的位置以及用于告诉CLR在哪里找到装配的配置。

存在二级故障模式,其中包含您遇到问题的程序集类型。这些dbase提供程序通常是托管包装器,它依赖非托管DLL来完成工作。 Windows必须能够找到这些DLL。如果它们没有复制到PATH上的目录或者复制到与主EXE相同的文件夹中,则往往会失败。仔细阅读这些包装器的部署说明。

答案 1 :(得分:1)

当调试时,代码的时间会略有不同,如果你在函数内部放置太长时间会更多。因此,如果代码对时间敏感,则可能会遇到奇怪的错误。那是我能想到的全部。

答案 2 :(得分:1)

不同之处在于,当附加调试器时,它会在抛出异常时停止,否则会被捕获。

“工具/选项/调试中的异常跨越AppDomain或托管/本机边界(仅管理)”和“启用我的代码”选项中的选项以及“调试/异常”中的选项将确定哪些异常你的调试器会在抛出时中断。

答案 3 :(得分:-1)

有一些问题值得警惕。

1)正如codeninja所说,如果你打破代码,操作的顺序可能会有所不同。

2)文件可能位于不同的位置,路径可能会以不同的方式解析。当您动态加载资源,或者构建DLL并将其复制到插件目录中时,这一点非常重要。在调试下,您可能会意外加载错误的。

3)在调试器中观察变量可能会导致评估。想象一个属性,它愚蠢地增加其后备字段,然后返回增加的值。