程序异常崩溃,该怎么找出原因呢?

lengx7 2015-04-23 10:37:22
VC2008编写的程序,使用AfxBeginThread创建了几条线程,程序有时候会在几个小时后崩溃,有的时候几天也没事
程序崩溃的时候是直接消失,没有什么错误提示框
这样的情况只能把所有的函数都添加try...catch来处理吗?请问还有什么其他简便的方法吗?
...全文
565 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
电子枪 2015-04-29
  • 打赏
  • 举报
回复
使用第三方库写日志文件进行跟踪,如lib4cplus等
lengx7 2015-04-29
  • 打赏
  • 举报
回复
CString testr; testr.Format("%s",11111); 使用1楼的代码,测试上面这段代码,出现异常,程序崩溃,DMP文件输出成功 但是程序在运行中崩溃了却没有DMP文件,难道程序出现的异常是MyUnhandledExceptionFilter也无法捕获的类型么?
void998 2015-04-23
  • 打赏
  • 举报
回复
这个有个最方便的方法,加DMP文件。 这样崩溃后,把DMP和PDB一起调试,就可以直接看到调用堆栈,就和平时DEBUG调试一样的简单咯~ 把如下代码放一个头文件中,添加到工程中
#pragma once  
#include <dbghelp.h>     
#include <shellapi.h>     
#include <shlobj.h>  

#pragma comment( lib, "DbgHelp")  

static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)  
{  
	char lFilePath[MAX_PATH]="";
	GetModuleFileName(NULL, lFilePath, MAX_PATH);
	strncat(lFilePath, ".dmp", MAX_PATH);
	HANDLE lhDumpFile = CreateFile(lFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);  
	MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;  
	loExceptionInfo.ExceptionPointers = ExceptionInfo;  
	loExceptionInfo.ThreadId = GetCurrentThreadId();  
	loExceptionInfo.ClientPointers = TRUE;  

	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpWithFullMemory, &loExceptionInfo, NULL, NULL);  

	CloseHandle(lhDumpFile);  

	::ShellExecuteW(NULL, NULL, L"BugReport.exe", NULL, NULL, SW_NORMAL);  

	TerminateProcess(GetCurrentProcess(),0);

	return EXCEPTION_EXECUTE_HANDLER;  
}  
在入口函数调用这句就可以了
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
这样,程序崩溃了,就会生成一个DMP文件,相当实用。
赵4老师 2015-04-23
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
void998 2015-04-23
  • 打赏
  • 举报
回复
对!版主补充的那个要设置哈,否则没有PDB,光有DMP也不行的哈。
oyljerry 2015-04-23
  • 打赏
  • 举报
回复
代码属性中生成pdb文件,然后异常的时候,产生dump文件,结合windbg来分析
void998 2015-04-23
  • 打赏
  • 举报
回复
那记得给我分哟~哈哈 如果有空,也记得来群哈,大家一起交流学习!
lengx7 2015-04-23
  • 打赏
  • 举报
回复
引用 1 楼 void998 的回复:
这个有个最方便的方法,加DMP文件。 这样崩溃后,把DMP和PDB一起调试,就可以直接看到调用堆栈,就和平时DEBUG调试一样的简单咯~ 把如下代码放一个头文件中,添加到工程中
#pragma once  
#include <dbghelp.h>     
#include <shellapi.h>     
#include <shlobj.h>  

#pragma comment( lib, "DbgHelp")  

static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)  
{  
	char lFilePath[MAX_PATH]="";
	GetModuleFileName(NULL, lFilePath, MAX_PATH);
	strncat(lFilePath, ".dmp", MAX_PATH);
	HANDLE lhDumpFile = CreateFile(lFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);  
	MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;  
	loExceptionInfo.ExceptionPointers = ExceptionInfo;  
	loExceptionInfo.ThreadId = GetCurrentThreadId();  
	loExceptionInfo.ClientPointers = TRUE;  

	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpWithFullMemory, &loExceptionInfo, NULL, NULL);  

	CloseHandle(lhDumpFile);  

	::ShellExecuteW(NULL, NULL, L"BugReport.exe", NULL, NULL, SW_NORMAL);  

	TerminateProcess(GetCurrentProcess(),0);

	return EXCEPTION_EXECUTE_HANDLER;  
}  
在入口函数调用这句就可以了
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
这样,程序崩溃了,就会生成一个DMP文件,相当实用。
多谢帮忙!现在就去加上

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧