C++ 进程终止C++;
我有以下问题:我有一个应用程序(服务器永远不会结束),用C++编写,作为一个包含主线程内部的服务,也有3个线程(主要是做IO)。 在主循环中,我捕获所有可能的异常 进程终止,主循环或线程本身没有打印任何内容。我在事件日志中看到进程以代码1000停止C++ 进程终止C++;,c++,windows,process,termination,C++,Windows,Process,Termination,我有以下问题:我有一个应用程序(服务器永远不会结束),用C++编写,作为一个包含主线程内部的服务,也有3个线程(主要是做IO)。 在主循环中,我捕获所有可能的异常 进程终止,主循环或线程本身没有打印任何内容。我在事件日志中看到进程以代码1000停止 Windows是否像在unix中一样创建核心文件 如果从事件日志中获得内存地址,是否有方法知道它发生在应用程序的哪个部分 也许这是一个线索:在它发生的同时,我启动了另一个应用程序(不同类型) 请记住,catch(…)不会截获代码中可能出错的所有内容,
请记住,
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
”“kb”或“!uniqstack”
查看堆栈跟踪
并寻找如何进行分析
#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
”“kb”或“!uniqstack”
查看堆栈跟踪
并寻找如何进行分析
#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结构化异常(例如访问违规)。
<>编辑:如<>强> WHONMR 建议,直接使用结构化异常可能比E/EHA < P>更好。在构建应用程序时,需要使用/EHA编译器开关,以捕获带有C++尝试/catch结构的Windows结构化异常(例如访问违规)。
这不是有用的信息,除非这两个应用程序彼此交互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++异常,而不是。