进程终止C ++

我有下面的问题:我有一个应用程序(服务器永远不会结束)用C ++编写,作为一个包含在主线程内的服务运行,也包含3个线程(主要是做IO)。

在主循环中,我捕捉所有可能的例外。

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

  1. Windows是否像在UNIX中创build核心文件?
  2. 如果从事件日志中获得内存地址,是否有任何方法知道应用程序中哪一部分发生了?
  3. 也许这是一个线索:与此同时,我开始另一个应用程序(不是相同的types)。

Windows是否像在UNIX中创建核心文件?

它不,自动。 但是你可以通过在你的代码中实现这个文件,或者使用外部应用程序作为windbg或Dr.Watson来启用这样的文件

如果从事件日志中获得内存地址,是否有任何方法知道应用程序中哪一部分发生了?

如果一般情况下没有办法,如果你不保留调试信息文件(pdb)

也许这是一个线索:与此同时,我开始另一个应用程序(不是相同的类型)。

这是没有用的信息,除非两个应用程序互相交互

尝试将windbg设置为事后调试器。

  1. 安装windbg
  2. 从命令行执行“ windbg -I
  3. 开始你的应用程序,然后当你的应用程序得到一个未处理的异常时,windbg将被激活。
  4. 从windbg使用"kb" or "!uniqstack"来查看"kb" or "!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; } 

请记住, catch(...)不会拦截在您的代码中可能出错的所有内容,除非您正在使用结构化异常处理。 例如

 #include“stdio.h”
 int main(char ** argv,int c)
 {
  尝试{
     int this_will_be_zero =(c == 9999);
     int blowup = 1 / this_will_be_zero;
   } catch(...){
     printf(“你不会看到这个消息\ n”);
   }
 }

在构建应用程序时,您需要使用/ EHa编译器开关,以便使用C ++ try / catch构造捕捉窗口结构化异常(例如访问冲突)。

在Visual Studio中,这是在项目属性配置属性 – > C / C ++ – >代码生成 – >启用C ++异常。 你想要“是有SEH例外(/ EHa)”。 我记得阅读设置这有一些重大的缺点,虽然我不记得他们是什么。

链接: 关于C ++异常处理模型的MSDN

编辑:正如通常所说,直接使用结构化异常可能比/ EHa更好

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

  [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug]
 “自动”= “0”
 “Debugger”=“My_Debugger”-p%ld -e%ld“
 “UserDebuggerHotKey”= DWORD:00000000

您可以将My_Debugger更改为您用于调试的任何程序/ IDE的完整路径。

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