【问题标题】:What differs when Debug build is ran with debugging and without debugging?在调试和不调试的情况下运行调试构建有什么不同?
【发布时间】:2011-11-09 13:39:03
【问题描述】:

我曾经相信,如果我们有一个 Debug 构建,那么是否:

  1. 我们运行它。
  2. 或者我们对其进行了调试。

一切都会一样。

但是最近我遇到了 2 个不同的问题,很明显,当代码刚刚运行或调试时,有些东西是不同的,即使代码版本应该是相同的。 (即Fluent NHibernate cannot load MySql.Data from GAC in debug mode of a testNpgsql - Specified method is not supported)

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

【问题讨论】:

    标签: .net debugging clr


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,我的机器上的设置已经关闭,可能这是默认值,因为我不记得曾经设置过。
    • 您在调试/异常...下检查过什么吗?您是否在 Tools/Options/Debugging 中检查了 Just My Code ?
    • hmm 实际上我有公共语言运行时异常(2 个复选框),我已取消选中它们,看来问题已经消失了。这是为什么?比起 fuslogvw 方法,我更喜欢这种方法。我理解异常抛出,我不明白为什么之后测试失败,我猜异常仍然抛出,但由于我没有打破它,我得到不同的执行路径?
    • 我不认为执行路径不同。异常在调试器中中断。如果继续执行,它应该遵循相同的路径。
    • 哦,问题是,它不遵循相同的路径!
    【解决方案2】:

    解决程序集问题的首选武器是fuslogvw.exe,它向您显示它在哪里寻找程序集以及使用什么配置来告诉 CLR 在哪里找到程序集。

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

    【讨论】:

    • 这一定很接近正在发生的事情,谢谢。但是你能详细说明什么是“次要故障模式”和什么是“主要?故障模式”(如果存在的话)我不确定这是你说这个的方式,还是我的情况的一些通用名称。
    • 主要 = 第一个可能的问题:错误的配置,fuslogvw.exe 会显示给您的那种。次要 = 下一个可能的问题:DLL Hell。
    【解决方案3】:

    有几个问题需要警惕。

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

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

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

    【讨论】:

    • 1) 不,如果您知道调试多线程应用程序,则在调试时中断所有其他线程,因此仅调试一个线程。如果您在附加到正在运行的应用程序之后在源代码行中放置断点,这将是相同的操作顺序。
    • 2) 不,只需打开调试选项以在调试时找到精确的源匹配
    • 3) 不,只是关闭属性和变量的评估,消除副作用
    • 1) 什么?所做的只是强制执行代码将以不同顺序执行的概念。 2) 不是默认值,即使是默认值,您也可能没有调试该代码,可能只是依赖于返回值。 3) 同样,不是默认设置,如果您禁用评估,则会禁用有用的工具。例如,我的代码不会导致评估副作用,所以我会保留它,因为它很有用。其他人的代码可能表现得不太好。最后的想法,所有这三点都引起了我自己或与我合作过的开发人员的注意。因此我觉得它们是有效的。
    【解决方案4】:

    调试代码的时间会稍有不同,如果您在函数中停留的时间过长,则更是如此。因此,如果代码对时间敏感,您可能会遇到奇怪的错误。我能想到的就这些了。

    【讨论】:

    • 是的,我现在也是,我没有提到这一点,因为我所经历的显然与此无关,而且差异更大(如果您按照问题进行操作)
    • 这是真的,但我怀疑流利的 NHibernate 有大量的时间敏感代码。
    • 我不确定这两个问题都与流利的 nhb 相关,一个似乎主要与 npgsql 相关。这意味着两者都可能由于不同的原因而失败,因为 npgsql 与 GAC 无关(我认为) 这就是 mysql 失败的原因
    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多