【问题标题】:Breakpoint not hit and code not executed?断点未命中且代码未执行?
【发布时间】:2010-12-17 09:23:43
【问题描述】:

我正面临一个我似乎无法解决的问题。

private void IndexEntityType(Type targetType, bool onlyNew)
{
    Logger.Debug("generating index for {0}", targetType);

    using (var wrapper = SessionWrapper.For(targetType, true))
    {
        var session = wrapper.Session;
        session.FlushMode = FlushMode.Never;
        session.CacheMode = CacheMode.Ignore;

        var entities = GetEntities(targetType, onlyNew, session);
        Logger.Debug("Indexing {0} entities", entities.Count);

        // Create a Full Text session.
        using (var fullTextSession = Search.CreateFullTextSession(session))
        using (var transaction = fullTextSession.BeginTransaction())
        {
            fullTextSession.CacheMode = CacheMode.Ignore;

            foreach (var entity in entities)
            {
               fullTextSession.Index(entity);
            }

            try
            {
                transaction.Commit();
            }
            catch (Exception ex)
            {
                Logger.Error("could not commit fulltext session transaction", ex);
            }
        }

        Logger.Debug("generated index for {0}", targetType);
    }

    ReQueueTimers(onlyNew);
}

我正在尝试对此进行调试,并在第一行 (Logger.Debug) 和最后一行 (ReQueueTimers) 设置断点。

但是,在单步执行代码时,永远不会调用最后一次调用 (ReQueueTimers(onlyNew)),也不会遇到断点。怎么可能?编译器是否以某种方式“在优化时将其删除”?

有人对可能触发此行为的原因有任何提示吗?

编辑:如果这可能与它有关,它会在多个线程中运行。

【问题讨论】:

    标签: c# multithreading debugging compiler-construction


    【解决方案1】:

    可能是您的代码引发了异常 - 如果 transaction.Commit() 以外的任何内容引发异常,则不会进行 ReQueueTimers 调用。您可以通过让 Visual Studio 中断所有 CLR 异常来证明这一点 - 在“调试”菜单中,选择“异常”,然后选中“公共语言运行时异常”行上的“抛出”框。然后重新开始调试。

    另一方面,我有时让 Visual Studio 在调试方法的中途放弃单步执行代码。也许这就是原因 - 它可能与多个线程有关。如果您删除第一个断点并将其保留在 ReQueueTimers 调用中,这有什么不同吗?

    【讨论】:

    • 好的,试过了,我确实得到了一些已处理的异常,但据我所知,没有任何会破坏代码的东西。步进时,它实际上会转到 ReQueueTimers() 之前的行(最后一个 })。我刚刚意识到它必须是 .Dispose 的包装器实际上引发了异常......感谢您的提示!
    • 如果它抛出任何类型的异常,那么 try 语句代码就不会发生,该代码中的任何类型的异常都会导致不正确的行为。
    【解决方案2】:

    作为对格雷厄姆所说的一点补充:

    如果您在多个线程上运行并且在该线程上引发异常并且未被捕获,则该线程将被中止。

    【讨论】:

      【解决方案3】:

      我从 2 天开始就遇到了同样的问题,然后把我的头撞死了,直到……我在网上的某个地方找到了这个:

      确保在构建解决方案/项目时实际构建目标代码。 为此,请转到构建->配置管理器并确保选中相应的项目(在最右边的列中)。

      请注意,由于某些只有盖茨知道的神秘原因,该框未被选中!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 2019-10-09
        • 2011-08-28
        • 2017-12-08
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多