17

在编写控制台应用程序时,我使用的是 SAP DLL。尝试添加 SAP 对象时出现以下错误:

调试器已附加到但未配置为调试此未处理的异常。要调试此异常,请分离当前调试器。

代码:

SAPbobsCOM.GeneralService oGeneralService = oCmpSrv.GetGeneralService("WEPPAGE");
SAPbobsCOM.GeneralData oGeneralData = (SAPbobsCOM.GeneralData)oGeneralService.GetDataInterface(di.GeneralServiceDataInterfaces.gsGeneralData);
oGeneralData.SetProperty("U_WebId", "1");
try
{
    oGeneralService.Add(oGeneralData);
}
catch (Exception e)
{
    Logger.WriteLog("Error Add object " + e.Message);
}

尽管代码是用try&catch包装的,但 IDE 会崩溃。

在此处输入图像描述

在网络上进行了多次搜索和建议后,我发现了这篇文章并应用了建议的解决方案,并在项目属性调试选项卡下启用了本机代码调试。

在此处输入图像描述

勾选此选项的结果是,不是让我调试未知错误,而是异常“消失”并且代码运行不受干扰。

问题

  1. 为什么异常消失了,没有被调试?
  2. 是否有可能为这个问题提供不同的解决方法,因为启用本机代码调试会使应用程序减慢 10 倍,而不是真正解决这个问题。
4

1 回答 1

15

虽然代码用 try&catch 包装,但 IDE 崩溃

不,WER 对话框显示崩溃的是您的程序,而不是 IDE。不是您的代码,OBServerDLL 是一个 SAP 组件。鉴于崩溃的性质,使用 try/catch 将无法捕获此异常,它发生在 SAP 代码内的工作线程上。

请记住,崩溃原因非常糟糕,异常代码c0000005相当于 AccessViolationException。通常的原因是内存损坏。永远不要捕获这样的异常,您的程序无法有意义地继续运行。

为什么异常消失了,没有被调试?

这当然应该发生,非常不健康。AVE 确实往往是相当随机的,内存损坏并不能保证崩溃。请记住,当您在调试时确实发生这种情况时,您仍然无法找出原因,您没有 OBServerDLL 的源代码。

启用本机代码调试会使应用程序速度降低 10 倍

这不太可能,除非本机代码以非常高的速率抛出异常。您可以在“输出”窗口中轻松看到的内容。它所做的是减慢调试会话的启动速度。调试器将尝试为所有本机可执行文件查找 PDB,它不会在 Microsoft Symbol Server for SAP 代码中找到任何内容。避免这种延迟的最简单方法是使用工具 > 选项 > 调试 > 符号,取消选中“Microsoft 符号服务器”选项。

SAP 支持论坛上的这个问题在某种程度上具有可比性。也是寻找此类问题帮助的最佳场所。尽管您可能需要 SAP 升级工程师的支持,但他需要一个小型重现项目和崩溃流程的小型转储。

于 2015-05-06T14:59:54.863 回答