代码之家  ›  专栏  ›  技术社区  ›  Steve Folly

从未捕获异常获取堆栈跟踪?

  •  4
  • Steve Folly  · 技术社区  · 16 年前

    我有一个Windows结构化异常处理程序来捕获访问冲突等,并生成一个小型转储。但是,由于没有异常的C++异常,当然不会在终止事件中调用,因此没有崩溃转储。

    我现在正在寻找一个Windows解决方案(不管有多脏!),但如果可能的话,我想听听其他平台的情况。

    谢谢

    3 回复  |  直到 16 年前
        1
  •  5
  •   Danny Parker    16 年前

    在上一篇文章中,我们使用本网站的信息为未处理的异常实现了小型转储:

    http://www.debuginfo.com/articles/effminidumps.html

    要捕获windows上未处理的异常,请查看:

    http://msdn.microsoft.com/en-us/library/ms680634%28VS.85%29.aspx ).

    作为一个aisde,我们花了很多时间试验不同级别的minidump,直到我们确定了一个。事实证明,这在现实世界的崩溃中没有实际用途,因为我们不知道在实现迷你转储时它们会是什么。它是非常特定于应用程序的,也是特定于崩溃的,所以我的建议是尽早添加minidump处理程序,它将随着项目和QA的发展而增长,并且在某个时候(希望在现实世界中也会如此)。

        2
  •  4
  •   Frerich Raabe    16 年前

    你可以使用 try-except Statement

    // Your function to get a backtrace from a CONTEXT
    const char *readBacktrace( CONTEXT &ctx );
    
    extern "C"
    static DWORD exceptFilter( struct _EXCEPTION_POINTERS* exInf )
    {
        OutputDebugStringA( readBacktrace( *exInf->ContextRecord ) );
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    try {
      // your C++ code which might yield exceptions
    } catch ( ... ) {
      // In case a C++ exception occurs, raise a structured exception and catch it    immediately
      // so that we get a CONTEXT object which we can use to generate a stack trace.
      __try {
        RaiseException( 1, 0, 0, NULL );
      } __except( exceptFilter( GetExceptionInformation() ) ) {
      }
    }
    

    这有点笨拙,但好的是,您可以将{uu try{}{uu_{uu except(){}部分放到通用程序中 dumpStackTrace()

        3
  •  2
  •   denisenkom    16 年前