2

我有一个在 Visual Studio 2010 中构建的 Windows 控制台应用程序,它一直在崩溃,但是 Visual Studio 调试工具和我的代码中的 try/catch 语句都没有捕获到错误。

我已设法在我的系统上找到 WER 文件,并希望能够理解文件的内容,以便准确查明导致未处理异常的原因。

如果有人能提供一些关于如何使用以下信息来定位导致我这个问题的过程以及异常可能是什么的想法,我将非常感激......

WER 文件中的信息是:

Version=1
EventType=APPCRASH
EventTime=129973086237604286
ReportType=2
Consent=1
ReportIdentifier=91331e8b-2dc8-11e2-977b-080027f7e5bb
IntegratorReportIdentifier=91331e8a-2dc8-11e2-977b-080027f7e5bb
WOW64=1
Response.type=4
Sig[0].Name=Application Name
Sig[0].Value=SAGE_TESTING.vshost.exe
Sig[1].Name=Application Version
Sig[1].Value=10.0.30319.1
Sig[2].Name=Application Timestamp
Sig[2].Value=4ba2084b
Sig[3].Name=Fault Module Name
Sig[3].Value=ntdll.dll
Sig[4].Name=Fault Module Version
Sig[4].Value=6.1.7600.16385
Sig[5].Name=Fault Module Timestamp
Sig[5].Value=4a5bdb3b
Sig[6].Name=Exception Code
Sig[6].Value=c015000f
Sig[7].Name=Exception Offset
Sig[7].Value=000845bb
DynamicSig[1].Name=OS Version
DynamicSig[1].Value=6.1.7600.2.0.0.272.7
DynamicSig[2].Name=Locale ID
DynamicSig[2].Value=2057
DynamicSig[22].Name=Additional Information 1
DynamicSig[22].Value=0a9e
DynamicSig[23].Name=Additional Information 2
DynamicSig[23].Value=0a9e372d3b4ad19135b953a78882e789
DynamicSig[24].Name=Additional Information 3
DynamicSig[24].Value=0a9e
DynamicSig[25].Name=Additional Information 4
DynamicSig[25].Value=0a9e372d3b4ad19135b953a78882e789

这是我认为导致抛出异常的代码部分:

//Data from the project linked to the split data
if (oSplitData.Project != null)
{
    oProject = oSplitData.Project as SageDataObject190.Project;

    oBasicDetail.ProjectID = oProject.ProjectID;
    oBasicDetail.ProjectReference = oProject.Reference.ToString();
}
else
{
    oBasicDetail.ProjectID = -1;
    oBasicDetail.ProjectReference = "NO_PROJECT";
}

除了以上所有内容之外,我似乎发现有一个一般性异常被抛出,但它对我没有多大帮助 - 如果有人能对此有所了解,那就太好了:

Unhandled exception at 0x78bc7361 in SAGE_TESTING.exe: 0xC0000005: Access violation reading location 0xfeeefeee.
4

3 回答 3

3

如果您的程序是多线程的并且异常是在生成的线程之一中引发的,则可能不会捕获异常,具体取决于您在程序中进行异常处理的方式。

您可以像这样添加一个包罗万象的异常处理程序:

class Program 
{
    static void Main(string[] args) 
    {
        AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
        // Your code here
    }

    static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
    {
        Console.WriteLine(e.ExceptionObject.ToString());
        Environment.Exit(1);
    }
}

更新

根据您发布的代码,这里有一些要查看的内容

  • 在您发布的代码周围放置一个 try/catch 块。
  • 您确定oSplitData不为空吗?
  • 在以下行中,如果 oSplitData.Project 不是 SageDataObject190.Project 类型,则 oProject 将为空。测试null

    oProject = oSplitData.Project 作为 SageDataObject190.Project;

于 2012-11-13T20:37:16.393 回答
0

您是在调用非托管 C++ 或其他代码吗?

我会尝试类似的东西

static void Main()
{
  try
  {
    DoSomethingUseful() ;
  }
  catch ( Exception e )
  {
    // managed exceptions caught here
  }
  catch
  {
    // non-managed C++ or other code can throw non-exception objects
    // they are caught here.
  }
  return ;
}

请参阅CLR 会同时处理 CLS 投诉和非 CLS 投诉异常吗?

还有 C++ 在 msdn 上的 try、catch 和 throw 语句:http: //msdn.microsoft.com/en-us/library/6dekhbbc (v=vs.100).aspx

并且 MSIL 操作码throw(0x7A) 允许抛出任何对象引用。但是,C# 不允许这样做。

但看起来他们使用 .Net 2.0 改进了一些东西,并开始将古怪的东西包装在 .Net 2.0 中RuntimeWrappedException

于 2012-11-13T20:53:38.447 回答
0

您可能正在处理所谓的损坏状态异常。这些异常以某种方式破坏进程,因此杀死进程通常更安全,因为很难从这样的错误中恢复,即使它只是为了运行一个简短的 catch 子句。例如 StackOverflowExceptions、OutOfMemoryExceptions 或 AccessViolationExceptions。

本文对损坏状态异常进行了广泛且普遍有趣的解释。

帮助处理此类异常的方法是使用 DebugDiag。使用 Microsoft 提供的此工具(在此页面上下载),您可以定义一个崩溃规则,该规则会为您的失败进程生成崩溃转储。您可以在 Visual Studio 中轻松打开这些转储文件,您可以在其中找到导致失败的异常源。这不能保证,但过去它经常帮助我确定一些令人讨厌的错误。

于 2012-11-13T21:27:53.680 回答