C++ 进程终止C++;

C++ 进程终止C++;,c++,windows,process,termination,C++,Windows,Process,Termination,我有以下问题:我有一个应用程序(服务器永远不会结束),用C++编写,作为一个包含主线程内部的服务,也有3个线程(主要是做IO)。 在主循环中,我捕获所有可能的异常 进程终止,主循环或线程本身没有打印任何内容。我在事件日志中看到进程以代码1000停止 Windows是否像在unix中一样创建核心文件 如果从事件日志中获得内存地址,是否有方法知道它发生在应用程序的哪个部分 也许这是一个线索:在它发生的同时,我启动了另一个应用程序(不同类型) 请记住,catch(…)不会截获代码中可能出错的所有内容,

我有以下问题:我有一个应用程序(服务器永远不会结束),用C++编写,作为一个包含主线程内部的服务,也有3个线程(主要是做IO)。 在主循环中,我捕获所有可能的异常

进程终止,主循环或线程本身没有打印任何内容。我在事件日志中看到进程以代码1000停止

  • Windows是否像在unix中一样创建核心文件
  • 如果从事件日志中获得内存地址,是否有方法知道它发生在应用程序的哪个部分
  • 也许这是一个线索:在它发生的同时,我启动了另一个应用程序(不同类型)

  • 请记住,
    catch(…)
    不会截获代码中可能出错的所有内容,除非您使用的是结构化异常处理。乙二醇

    #include "stdio.h" int main(char** argv, int c) { try { int this_will_be_zero = (c == 9999); int blowup = 1 / this_will_be_zero; } catch (...) { printf("you won't see this message\n"); } } #包括“stdio.h” int main(字符**argv,int c) { 试一试{ int这将是0=(c==9999); int blowup=1/该值将为零; }捕获(…){ printf(“您将不会看到此消息\n”); } }
    请记住,
    catch(…)
    不会截获代码中可能出错的所有内容,除非您使用的是结构化异常处理。乙二醇

    #include "stdio.h" int main(char** argv, int c) { try { int this_will_be_zero = (c == 9999); int blowup = 1 / this_will_be_zero; } catch (...) { printf("you won't see this message\n"); } } #包括“stdio.h” int main(字符**argv,int c) { 试一试{ int这将是0=(c==9999); int blowup=1/该值将为零; }捕获(…){ printf(“您将不会看到此消息\n”); } }
    尝试将windbg设置为后期调试程序

  • 安装
  • 从命令行执行“
    windbg-I
  • 启动应用程序,然后当应用程序出现未处理的异常时, windbg将被激活
  • 从windbg使用
    “kb”或“!uniqstack”
    查看堆栈跟踪


    并寻找如何进行分析

  • 并尝试使用SEH:

    #include "windows.h"
    #include "stdio.h"
    
    DWORD FilterFunction() 
    { 
     printf("you will see this message first.\n");
     return EXCEPTION_EXECUTE_HANDLER; 
    } 
    
    
    int main(char** argv, int c)
    {
     __try
     {
      int this_will_be_zero = (c == 9999);
      int blowup = 1 / this_will_be_zero;
     }
     __except ( FilterFunction()) 
     {
      printf("you will see this message\n");
     }
    
     return 0;
    }
    

    尝试将windbg设置为后期调试程序

  • 安装
  • 从命令行执行“
    windbg-I
  • 启动应用程序,然后当应用程序出现未处理的异常时, windbg将被激活
  • 从windbg使用
    “kb”或“!uniqstack”
    查看堆栈跟踪


    并寻找如何进行分析

  • 并尝试使用SEH:

    #include "windows.h"
    #include "stdio.h"
    
    DWORD FilterFunction() 
    { 
     printf("you will see this message first.\n");
     return EXCEPTION_EXECUTE_HANDLER; 
    } 
    
    
    int main(char** argv, int c)
    {
     __try
     {
      int this_will_be_zero = (c == 9999);
      int blowup = 1 / this_will_be_zero;
     }
     __except ( FilterFunction()) 
     {
      printf("you will see this message\n");
     }
    
     return 0;
    }
    

    <> p>在构建应用程序时,需要使用/eHA编译器开关,以便用C++尝试/catch结构捕获Windows结构化异常(例如访问违规)。

    中的P>这是项目属性配置属性-> C/C++ + >代码生成->启用C++异常。您需要“是,SEH例外(/EHa)”。我记得阅读设置有一些明显的缺点,尽管我记不起它们到底是什么

    链接:


    <>编辑:如<>强> WHONMR 建议,直接使用结构化异常可能比E/EHA

    < P>更好。在构建应用程序时,需要使用/EHA编译器开关,以捕获带有C++尝试/catch结构的Windows结构化异常(例如访问违规)。 中的P>这是项目属性配置属性-> C/C++ + >代码生成->启用C++异常。您需要“是,SEH例外(/EHa)”。我记得阅读设置有一些明显的缺点,尽管我记不起它们到底是什么

    链接:

    编辑:正如whunmr所建议的,直接使用结构化异常可能比/EHa更好

    Windows是否像在unix中一样创建核心文件

    它不会,自动地。但是,您可以通过以下方式启用此类文件: 要么在代码中实现,要么使用外部应用程序实现 作为windbg,或

    如果从事件日志中获得内存地址,是否有方法知道它发生在应用程序的哪个部分

    一般来说,如果不保留调试信息文件(pdb),就没有办法

    也许这是一个线索:在它发生的同时,我启动了另一个应用程序(不同类型)

    这不是有用的信息,除非这两个应用程序彼此交互

    Windows是否像在unix中一样创建核心文件

    它不会,自动地。但是,您可以通过以下方式启用此类文件: 要么在代码中实现,要么使用外部应用程序实现 作为windbg,或

    如果从事件日志中获得内存地址,是否有方法知道它发生在应用程序的哪个部分

    一般来说,如果不保留调试信息文件(pdb),就没有办法

    也许这是一个线索:在它发生的同时,我启动了另一个应用程序(不同类型)


    这不是有用的信息,除非这两个应用程序彼此交互

    Windows将根据以下中的设置,显示您用作调试器的任何程序:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] "Auto"="0" "Debugger"="My_Debugger" -p %ld -e %ld" "UserDebuggerHotKey"=dword:00000000 [HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] “自动”=“0” “调试器”=“我的调试器”-p%ld-e%ld” “UserDebuggerHotKey”=dword:00000000 您可以将My_Debugger更改为用于调试的任何程序/IDE的完整路径


    这通常设置为Dr Watson,它将创建一个崩溃的日志条目,这不是您想要的。

    Windows将根据以下内容中的设置,显示您用作调试器的任何程序:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] "Auto"="0" "Debugger"="My_Debugger" -p %ld -e %ld" "UserDebuggerHotKey"=dword:00000000 [HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] “自动”=“0” “调试器”=“我的调试器”-p%ld-e%ld” “UserDebuggerHotKey”=dword:00000000 您可以将My_Debugger更改为用于调试的任何程序/IDE的完整路径


    这通常是设置给Watson博士的,它将创建一个崩溃的日志条目,这不是你想要的。

    我主要使用:Test{{} catch(ExabuteA.E)catch(ExabutBue:e)catch(ExpAsTestLeMeExe:e)catch(…),这是他的观点,你只捕获C++异常,而不是。