【问题标题】:how to debug a c++ excel plugin's exception during excel exiting如何在excel退出期间调试c ++ excel插件的异常
【发布时间】:2018-12-16 15:36:22
【问题描述】:

我有一个用 c++ 构建的 excel xll 插件(在 xlw 的帮助下),它运行得很好,除了 excel 退出时偶尔会发生异常。

令我头疼的是,虽然它看起来像是一些析构函数问题,但我看不出哪里出了问题。

Excel 窗口刚刚关闭,然后弹出 Windows 系统错误消息。

即使我在 Visual Studio 调试模式下运行它,当异常发生时,它已经在 STL c++ 代码中,我也看不到我的代码的哪一部分,例如析构函数,是导致异常的根本原因失败。

确切地说,调用堆栈显示 [External Code] -> Excel.Exe -> [External Code] -> MSO.DLL ... 重复... OART.DLL... 重复... ntdll.cll -> [External Code] -> _cexit() -> common_exit -> __acrt_lock_and_call -> ...

源可见的第一步是exit.cpp in C:\Program Files (x86)\Windows Kits\10\Source\10.0.16299.0\ucrt\startup\exit.cpp,

extern "C" void __cdecl _cexit()
{
    common_exit(0, _crt_exit_full_cleanup, _crt_exit_return_to_caller);
}

【问题讨论】:

  • 您的某个类的全局或静态实例可能正在被破坏。这可能就是为什么您没有获得更好的调用堆栈的原因——由于正在进行全局/静态清理,运行时正在执行销毁。要么是那个,要么你的程序已经损坏了内存(当你说它运行“相当好”时),这个损坏的结果就是你现在看到的。
  • @PaulMcKenzie 可能,因为确实有很多全局变量。我怎样才能确认并找出谁是罪魁祸首?

标签: c++ excel plugins visual-studio-debugging


【解决方案1】:

您是否尝试过在 Visual Studio 设置中设置条件断点来中断任何异常(或您遇到的特定异常)?您可以在退出 Excel 之前启用此功能。这可能有助于跟踪问题并在断点命中时在调用堆栈窗口中为您提供调用堆栈。

还要确保检查您的符号文件 (.pdb) 是否正在为您的代码和任何第三方依赖项加载。另一件有帮助的事情是指定 Microsoft 公共符号服务器,以便加载 Microsoft 系统 pdb 以及在此 article 中提到的。

【讨论】:

  • @athos 您是否在调用堆栈窗口中获得了良好的堆栈跟踪。本文可能有助于正确设置您的调试环境docs.microsoft.com/en-us/windows/desktop/dxtecharts/…
  • 我为那些全局变量的类添加了析构函数,并将异常设置打开为stackoverflow.com/questions/5597421/…,结果发现当excel退出时,会调用全局映射变量的析构函数,并且,STL代码似乎在迭代器和删除上做了一个循环,不幸的是,删除实际上将迭代器设置为无效状态。我将map<string,Foo> 包装到FooMap 类中,在~FooMap() 中做了if(this->size()>0) this->clear(); 似乎解决了这个问题。
  • @athos 很高兴知道您解决了问题。如果我的回答有帮助,请点赞和/或将其标记为已接受的答案,以便它可以帮助可能面临同样问题的其他人。
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多