0

在过去的几年中,我创建了许多 VSTO 加载项。它们针对许多版本的 MS Word(但主要是 MS Word 2016)运行。我共享一个公共代码库,在处理每个新项目时添加到该库中。

我注意到关闭 Word 时偶尔出现崩溃。这是需要任务管理器清理的严重崩溃:

“Microsoft Word 已停止工作” “关闭程序?”

它很少发生。非常罕见,以至于我将其视为“疯狂的 MS Word..”。

我的同事也多次注意到这个问题。通常在我为它们构建一个新程序集后它就消失了(几乎没有或没有代码更改......)

现在情况更加严重,因为客户在测试时报告了问题。有趣的是,在客户端机器上,崩溃是可重现的。

在过去的几天里,我一直在注释代码以试图找出问题所在。我以为我的问题与一些功能区可见性代码隔离,但事实证明我只是在兜圈子..

我尝试通过以下方式获取崩溃转储:

adsplus.exe -crash -pn winword.exe -o c:\Temp

运行此命令后,我无法重现该错误。

我注意到将 log4net 跟踪级别从 WARN 更改为 DEBUG 导致可重现错误停止。但是,我不确定它是否已修复。

是时间问题吗?知道如何找到问题的原因吗?

- 编辑 -

@Thomas Weller,我能够使用https://docs.microsoft.com/en-us/sysinternals/downloads/procdump获得崩溃转储 看看我如何解释它。

4

1 回答 1

1

我能够使用 ProcDump 获得内存转储,它表明在 Word 关闭时发生了线程异常。

原来,当我以为我使用的是同一个调度程序对象时,我每次都在创建一个新对象。

我的代码类似于:

Dispatcher dispatcher = System.Windows.Application.Current.Dispatcher;
O.CustomXMLParts parts = null;
dispatcher.WaitUntilApplicationIdle(() =>
{
    parts = doc.CustomXMLParts.SelectByNamespace(Office.Namespace);
});
...

public static void WaitUntilApplicationIdle(this Dispatcher dispatcher, Action action)
{
    dispatcher.Invoke(action, DispatcherPriority.ApplicationIdle);
}

而且我必须确保应用程序在 Word 启动时正确设置:

void ThisAddIn_Startup(object sender, EventArgs e)
{
    EnsureApplication();
}

void EnsureApplication()
{
    if (System.Windows.Application.Current == null)
        new Application()
        {
            ShutdownMode = ShutdownMode.OnExplicitShutdown
        };
}
于 2018-06-06T00:27:39.493 回答