crashrpt3 开源项目的Vs 2022 C++20及其以上的编译

news2024/12/26 22:36:57

1. 首先从github 下载源代码 crashrpt3

2. 用CMake Gui 编译成vs studio 工程文件

2.1 点击 config 按钮在这里插入图片描述
2.2 依次点击 Generate 按钮、Open Project 按钮.之后vs 2022 会打开编译好的sln工程文件在这里插入图片描述

3.全选解决方案里面的所有项目,设置C++语言标准,我这里设置是最新C++,即启用的是C++23的标准

在这里插入图片描述 根据实际需要调整32位/64位和字符串集合
在这里插入图片描述

设置CrashRpt工程属性

在这里插入图片描述添加: /Zc:__cplusplus 选项,这个是解决 “__cplusplus 这个宏上,可以看到它的值展开为:199711L”

接着修改3个文件,因为C++20弃用了一些C++17的语法,导致编译失败,所以需要进行调整:

1. 修改CrashHandler.h 只有一处要修改

struct ThreadExceptionHandlers
{
    ThreadExceptionHandlers()
    {
        m_prevTerm = NULL;
        m_prevUnexp = NULL;
        m_prevSigFPE = NULL;
        m_prevSigILL = NULL;
        m_prevSigSEGV = NULL;
    }

    terminate_handler m_prevTerm;        // Previous terminate handler

 //unexpected_handler m_prevUnexp;   <-----这条语句修改为一下:
//  
 #if __cplusplus < 202002L
     unexpected_handler m_prevUnexp;      // Previous unexpected handler (only for C++ versions < C++20)
 #else
    std::terminate_handler m_prevUnexp;  // Using terminate_handler as a substitute in C++20 and later
#endif



  //  unexpected_handler m_prevUnexp;      // Previous unexpected handler
    void (__cdecl *m_prevSigFPE)(int);   // Previous FPE handler
    void (__cdecl *m_prevSigILL)(int);   // Previous SIGILL handler
    void (__cdecl *m_prevSigSEGV)(int);  // Previous illegal storage access handler
};

2.修改 CrashHandler.cpp 有两处要修改

int CCrashHandler::SetThreadExceptionHandlers(DWORD dwFlags)
{
    ...//省略
    
    if(dwFlags&CR_INST_UNEXPECTED_HANDLER)
    {
        // Catch unexpected() calls.
        // In a multithreaded environment, unexpected functions are maintained
        // separately for each thread. Each new thread needs to install its own
        // unexpected function. Thus, each thread is in charge of its own unexpected handling.
        // http://msdn.microsoft.com/en-us/library/h46t5b69.aspx

//handlers.m_prevUnexp = set_unexpected(UnexpectedHandler);   <-----这条语句修改成以下:
/        
#if __cplusplus < 202002L
        handlers.m_prevUnexp = set_unexpected(UnexpectedHandler);
#else
        handlers.m_prevUnexp = std::set_terminate(UnexpectedHandler);
#endif
/               
    }
}

int CCrashHandler::UnSetThreadExceptionHandlers()
{
   ...//省略
    if(handlers->m_prevUnexp!=NULL)
    {

//set_unexpected(handlers->m_prevUnexp);  <-----这条语句修改成以下:
    
#if __cplusplus < 202002L
        set_unexpected(handlers->m_prevUnexp);
#else
        set_terminate(handlers->m_prevUnexp);
#endif

    }
}

3.修改 CrashRpt.cpp 只有一处要修改

crEmulateCrash(unsigned ExceptionType) noexcept(false)
{
...//省略
    case CR_CPP_UNEXPECTED_CALL:
        {
            // Call unexpected
           // 
 //   unexpected();  <-----这条语句修改成以下:    
// 
#if __cplusplus < 202002L
        unexpected();
#else
        std::terminate();
#endif
//     
        }
        break;
}

修改完上述3个文件之后,工程就可以在C++20及其以上编译成功了.

修复一个使用中的bug:生成的crashrpt.xml和crashdump.dmp中的修改时间是UTC时间非本地时间

在 CrashSender工程里面的 ErrorReportSender.cpp
//crashdump.dmp的修改时间改成本地时间
BOOL CErrorReportSender::CreateMiniDump()
{
   ...//省略
cleanup:
/
    //change to local time
    if (hFile != INVALID_HANDLE_VALUE) {
        SYSTEMTIME localTime;
        GetLocalTime(&localTime);  
        FILETIME ft;
        SystemTimeToFileTime(&localTime, &ft);          
        SetFileTime(hFile, &ft, &ft, &ft);
    }
/
<----------加上上述代码    
    // Close file
    if(hFile)
        CloseHandle(hFile);
}
///crashrpt.xml 修改时间改成本地时间
void CErrorReportSender::AddElemToXML(CString sName, CString sValue, TiXmlNode* root)
{
   ...//省略
cleanup:
    //if(f)
    // fclose(f);
   //<---改为如下代码:
///
    if(f)
   {
        fclose(f);
        HANDLE hFile = CreateFile(
            sFileName,
            GENERIC_WRITE,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

        if (hFile != INVALID_HANDLE_VALUE)
        {
            // Get the current local time
            SYSTEMTIME localTime;
            GetLocalTime(&localTime);

            // Convert local time to FILETIME
            FILETIME fileTime;
            SystemTimeToFileTime(&localTime, &fileTime);

            // Set the modification time of the file
            SetFileTime(hFile, NULL, NULL, &fileTime);

            // Close the file handle
            CloseHandle(hFile);
        }
    }
//    
}


crashrpt3 提供了一些Demo可以先熟悉一下,再修改提交dump的对话框以及一些修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Solidity基础语法

Solidity的在线编辑器&#xff1a;https://remix.ethereum.org/ 一、合约结构 1、SPDX许可标识&#xff1a;指定代码的开源许可 2、pragma指令&#xff1a;声明Solidity版本 3、导入语句&#xff1a;引入其他合约或库 4、合约声明&#xff1a;使用contract关键字 5、状态变量&…

【关系模型】关系完整性约束

按照上面的框架我们已经讲了关系数据结构还有关系操作&#xff0c;今天来补充这一章的关系完整性约束 关系完整性约束 完整性约束 完整性约束可以保证数据的一致性和元组的唯一性 实体完整性约束 比如在学生表中&#xff0c;每一个元组都应该是唯一并且元组之间是可以区分…

JavaScript(Web APIs 作用和分类,DOM数是什么,document是什么,根据css选择器来获取DOM元素,修改DOM元素的方式,边量声明)

变量声明 变量声明有三个 var let 和 const建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a; const 语义化更好 很多变量我们声明的时候就知道他不会被更改了&#xff0c;那为什么不用 const呢&#xff1f; 实际开发中也是&#xff0c;…

【unity框架开发8】unity场景Scene的使用, 如何封装一个场景管理器

文章目录 一、场景基本操作1、加载切换场景2、获取场景信息3、激活场景4、场景基本属性获取5、已加载场景个数6、获取场景中所有物体7、创建新场景8、卸载销毁场景 二、使用协程方法来异步加载场景1、AsyncOperation相关的代码应写在一个协同程序中。2、allowSceneActivation加…

AI深湖DeepLate人工智能的数据集格式开源项目

人工智能的数据集格式 文档 • 入门 • API 参考 • 例子 • 博客 • Slack 社区 • Twitter&#xff08;推特&#xff09; 用其他语言阅读这篇文章: English 深湖 Deep Lake Deep Lake 是一种数据集格式&#xff0c;提供简单的 API 以用于创建、存储和协作处理任何规模的…

Spring Security 与 OAuth 2.0 登录实现指南

文章目录 一、项目概述二、环境准备三、创建GitHub OAuth应用四、项目依赖配置五、配置OAuth 2.0六、创建控制器七、创建视图八、运行应用九、用户界面展示十、总结 在现代的Web应用中&#xff0c;安全性是一个不可忽视的因素。OAuth 2.0作为一种流行的授权框架&#xff0c;提供…

浅析主流监控告警系统基本架构和原理

浅析主流监控告警系统基本架构和原理 一&#xff0c;监控系统的作用和目前主流监控系统 1&#xff0c;作用&#xff1a;监控系统一般有以下这几个作用 实时采集监控数据&#xff1a;包括硬件、操作系统、中间件、应用程序等各个维度的数据。实时反馈监控状态&#xff1a;通过…

论文笔记:RelationPrompt :Zero-Shot Relation Triplet Extraction

论文来源: ACL Findings 2022 论文链接:https://arxiv.org/pdf/2203.09101.pdf 论文代码:http://github.com/declare-lab/RelationPrompt 本篇论文是由阿里达摩院自然语言智能实验室于2022年发表的关于零样本关系抽取的顶会论文,本篇博客将记录我在阅读过程中的一些笔记…

AI自动生成PPT解决方案,AI生成PPT-PrensentationGen-Java实现

AI自动生成PPT解决方案&#xff0c;AI生成PPT-PrensentationGen-Java实现。 利用大语言模型生成PPT文件的SpringBoot Web应用&#xff0c;主要功能是自动化创建演示文稿&#xff0c;适用于快速制作演示材料&#xff0c;特色在于其高效的模板处理和文本替换技术。 点击视频观看…

Python入门:如何在Python中优雅地书写多行字符串!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 多行字符串📒📝 什么是多行字符串?📝 三重引号📝 字符串连接📝 反斜杠⚓️ 相关链接 ⚓️📖 介绍 📖 在编程过程中,时常会遇到需要使用多行字符串的场景。例如,在编写长参数、描述文本或代码文档时,多行字符串…

java生成日历数据列表并按日历格式导出到excel

日历格式输出 日历数据列表导出封装日历格式实体类效果 日历数据列表 /**** 封装日历数据* param year 年份* param month 月份*/public List<InspectionDailyStaffPlanCalendarData> selectCalendarDataList(int year,int month,List<InspectionDailyStaffPlan> …

centos7 Oracle 11g rac 静默安装(NFS配置共享存储)

1.环境信息准备 注意&#xff1a; 在配置网络时&#xff0c;Oracle RAC的每个节点必须具有至少两个以上的网卡&#xff0c;一张网卡对外提供网络服务&#xff0c;另一张网卡用于各个节点间的通信和心跳检测等。在配置RAC集群的网卡时&#xff0c;如果节点1的公共接口是eth0&…

随机变量及其分布

定义 1.随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。样本空间中的每个结果都对应于随机变量的一个值。随机变量的值可以是离散的&#xff0c;也可以是连续的。随机变量通常用大写字母表示&#xff0c;如 X、Y 或 Z。 2.随机变量和事…

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…

Java-sec-code学习2

Java-Sec-Code学习1-文件上传漏洞 case1 url: http://127.0.0.1:8080/file/any 这是一个典型的上传页面&#xff0c;我们尝试上传一个文件试试看。 直接上传一个jsp文件&#xff0c;发现可以直接上传&#xff0c;非常顺利。这意味这后端和前端都没有对文件类型进行任何限制。…

[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。

[旧日谈]关于Qt的刷新事件频率&#xff0c;以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候&#xff0c;发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候&#xff0c;其实软件本身的负载并不高&#xff0c;所以…

【LeetCode每日一题】——724.寻找数组的中心下标

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 724.寻找数组的中心下标 四【…

python基础路径的迁移

本人未安装anaconda或pycharm等&#xff0c;仅安装了某个python环境&#xff0c;因此以下方法仅针对基础python环境的迁移&#xff0c;不确保其他软件或插件正常运行 第一步将原python路径的整个文件夹剪切到新的路径下 第二步修改系统环境变量&#xff0c;将原来的python路径…

胤娲科技:AI绘梦师——一键复刻梵高《星空》

想象一下&#xff0c;你手中握有一张梵高的《星空》原图&#xff0c;只需轻轻一点&#xff0c;AI便能化身绘画大师&#xff0c;一步步在画布上重现那璀璨星河。 这不是科幻电影中的桥段&#xff0c;而是华盛顿大学科研团队带来的“Inverse Painting”项目&#xff0c;正悄然改变…

【软件工程】McCabe复杂度计算

文章目录 一、定义与公式二、计算步骤三、示例四、注意事项 McCabe复杂度&#xff0c;又称为环路复杂度&#xff08;Cyclomatic Complexity&#xff09;&#xff0c;是一种用来度量软件程序复杂度的经典方法。它通过计算程序中独立路径的数量&#xff0c;帮助开发人员理解代码的…