最全crashrpt_crachrpt库,1个月学会C C++开发

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}

// 返回TRUE, 由crashrpt生成错误报告
return TRUE;
}



// 日志函数
void log_write(LPCTSTR szFormat, …)
{
if (g_hLog == NULL)
return;

va_list args;
va_start(args);
_vftprintf_s(g_hLog, szFormat, args);
fflush(g_hLog);
}

// 线程处理函数
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// 在该线程中安装crashrpt库对未处理异常的处理



crInstallToCurrentThread2(0);

log_write(_T(“Entering the thread proc\n”));

for(;😉
{
// 在这里模拟一处内存越界
int* p = NULL;
*p = 13;
}

log_write(_T(“Leaving the thread proc\n”));

// 清理crashrpt资源
crUninstallFromCurrentThread();

return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
// 设置crashrpt的各项参数
CR_INSTALL_INFO info;
memset(&info, 0, sizeof(CR_INSTALL_INFO));
info.cb = sizeof(CR_INSTALL_INFO);
info.pszAppName = _T(“MyApp”);
info.pszAppVersion = _T(“1.0.0”);
info.pszEmailSubject = _T(“MyApp 1.0.0 Error Report”);
info.pszEmailTo = _T(“myapp_support@hotmail.com”);
info.pszUrl = _T(“http://myapp.com/tools/crashrpt.php”);
info.pfnCrashCallback = CrashCallback;
info.uPriorities[CR_HTTP] = 3; // 首先使用HTTP的方式发送错误报告
info.uPriorities[CR_SMTP] = 2; // 然后使用SMTP的方式发送错误报告
info.uPriorities[CR_SMAPI] = 1; //最后尝试使用SMAPI的方式发送错误报告
// 捕获所有能够捕获的异常, 使用HTTP二进制编码的方式传输
info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS;
info.dwFlags |= CR_INST_HTTP_BINARY_ENCODING;
info.dwFlags |= CR_INST_APP_RESTART;
info.dwFlags |= CR_INST_SEND_QUEUED_REPORTS;
info.pszRestartCmdLine = _T(“/restart”);
// 隐私策略URL
info.pszPrivacyPolicyURL = _T(“http://myapp.com/privacypolicy.html”);

int nResult = crInstall(&info);
if(nResult!=0)
{
TCHAR szErrorMsg[512] = _T(“”);
crGetLastErrorMsg(szErrorMsg, 512);
_tprintf_s(_T(“%s\n”), szErrorMsg);
return 1;
}

// 添加日志文件到错误报告中
crAddFile2(_T(“log.txt”), NULL, _T(“Log File”), CR_AF_MAKE_FILE_COPY);

// 添加程序崩溃时的截屏到错误报告中
crAddScreenshot(CR_AS_VIRTUAL_SCREEN);

// 添加任意的信息到错误报告中,这里以显卡信息作为示例
crAddProperty(_T(“VideoCard”), _T(“nVidia GeForce 8600 GTS”));

errno_t err = _tfopen_s(&g_hLog, _T(“log.txt”), _T(“wt”));
if(err!=0 || g_hLog==NULL)
{
_tprintf_s(_T(“Error opening log.txt\n”));
return 1; // Couldn’t open log file
}

log_write(_T(“Started successfully\n”));

HANDLE hWorkingThread = CreateThread(NULL, 0,
ThreadProc, (LPVOID)NULL, 0, NULL);

log_write(_T(“Created working thread\n”));

TCHAR* szFormatString = NULL;
_tprintf_s(szFormatString);

WaitForSingleObject(hWorkingThread, INFINITE);

log_write(_T(“Working thread has exited\n”));

if(g_hLog!=NULL)
{
fclose(g_hLog);
g_hLog = NULL;
}

crUninstall();

return 0;
}

该示例程序中有几点需要注意的地方: 

1.如果想要在错误报告中包含日志文件,请记住一定要使用类似于示例中的CrashCallBack函数来设置CR\_INSTALL\_INFO中的pfnCrashCallback域,并在函数中关闭该日志文件的句柄。


2.根据我的使用经验,其实不需要在线程中使用crInstallToCurrentThread2/crUninstallFromCurrentThread这一对函数来安装异常处理过程,只要在主线程中调用了crInstall。就能够捕获到程序中所有线程中未处理的异常。


3.调用crInstall出错的原因一般是没有将CrashRptXXXX.dll、CrashSenderXXXX.exe以及crashrpt\_lang.ini放到正确的路径中,在默认情况下,该路径即是和应用程序相同的路径。其中的XXXX指的是crashrpt的版本号,这篇文章中的版本号为1300。


关于该示例的原文介绍,请参考<http://crashrpt.sourceforge.net/docs/html/simple_example.html>


        最后发一段我使用crashrpt的代码块,我使用的目的是将程序交给测试人员进行测试时,如果程序崩溃后,crashrpt将程序的错误报告保存到本地,测试人员发现程序崩溃后,将该报告发给我进行调试。代码如下所示:





![img](https://img-blog.csdnimg.cn/img_convert/b8b787a030f99a0a450d751505183f6d.png)
![img](https://img-blog.csdnimg.cn/img_convert/20e83cf6c79fe947575382cf2cca772e.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值