关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法

news2024/7/4 6:14:52

一、常见故障介绍  

  最近在开发相机项目(项目细节由于公司保密就不介绍了),程序运行5个来月以来首次出现msvcr100.dll故障等问题,于是乎开始了分析之路,按照度娘上的一顿操作,期间也是出现了各种不一样的问题,现总结了遇到的问题如:

1、MSVCR100.dll/MSVCR100D.dll/MSVCP100.dll/MSVCP100D.dll问题

  问题事件名称: APPCRASH

  故障模块名称: MSVCR100.dll

2、R6010错误

  现场遇到的情况基本都是这两类

二、故障排查

1、静心思考

  主要说一下我走过的历程,心酸只有自己知道,排查问题难免浮躁,但一定要沉得住,浮躁主要有以下几点:

  • 程序明明在自己机器上运行的好好的在客户机器上就会出问题;

  • 程序明明试着好好的,可你一离开就出现问题;

  • 程序连续运行好几个月版本都稳定了,可突然出问题,换电脑又复现不出来;

  • 连续处理一段时间后仍然没有结果,客户领导天天催。

2、检查库

  • 1、如果新打包的程序提示缺少MSVCR100.dll、MSVCP100.dll”或者“MSVCR100d.dll\MSVCP100d.dll”等类似错误信息,请从源机器或者网上下载该库拷贝到目标机器,库分32位和64位(跟自己操作系统有关),32拷贝到C:\Windows\System32,64位拷贝到C:\Windows\SysWOW64,记住库一定要统一版本,不要从别的机器东拼西凑,以一个机器为准;

  • 2、程序发布时最好将所需要的库也一并打包,在这我以vs编译器为例,可以从vs安装目录里拷贝MSVCR100.dll等相关运行库,记得区分32或者64位版本,目录如下:

  • 3.如果以上两步完成,程序重启后,还会出现类似问题,则继续往下排查,我给现场换完所有库之后,出现了R6010问题引起程序宕机

3、排查代码

1)、代码层面检查

  以上若还没解决问题,此时一定不要再纠结库(不要以为库版本不对),一定是你代码的问题,检查代码着重检查

  • 1.非法指针访问和内存泄漏

  • 2.设置的指针范围跟你运行的不对

  • 3.指针访问内存越界出现问题。

  • 4.因为不支持中文。

  • 5.内存不够分配

  • 6.多线程访问资源出的问题。

  • 7.检查exe和dll是否混用的不同版本的crt

代码检查出异常更新版本后若问题解决皆大欢喜,若还没有解决,请接着往下走(本人就属于后者)。

2)、生成dump文件

  一定要正视你的代码,C++系统崩溃无非就是内存访问无效、无效对象、堆栈溢出、空指针调用等常见的问题,当然有些问题不是立马能复现,它需要一定的条件,而这个条件它很复杂又由许多因素所制约;

  Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中,Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg、VS打开,当程序崩溃时会生成dump文件,通过生成dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用,dump文件生成的方式如下:

(a)通过任务管理器生成

打开任务管理器,找到对应的进程,右击,选择创建转储文件

生成的文件路径如下:

生成的转储文件可以通过VS打开,但是正常运行的程序生成.DMP文件并没有什么大的作用,上述的方法要求在程序崩溃时并不直接退出时才可以使用,但是一般程序都是粗鲁的退出,所以这种方法适用于特定场合。

(b)编写代码生成

  一定要生成debug版本程序

  Windows提供了SetUnhandledExceptionFilter函数,MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

用于当程序遇到未经处理的异常(主要指非指针造成)导致程序崩溃宕机时的异常接受处理,该函数必须在异常可能发生之前调用才有效,我们可以在该函数中生成dump文件,以方便我们调试,代码网上很多,我贴出一部分(大佬不嫌弃请留言),在程序崩溃后会生成dump文件

int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName)
{
    BOOL bOwnDumpFile = FALSE;
    HANDLE hDumpFile = hFile;
    MINIDUMP_EXCEPTION_INFORMATION ExpParam;

    typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
        HANDLE,
        DWORD,
        HANDLE,
        MINIDUMP_TYPE,
        PMINIDUMP_EXCEPTION_INFORMATION,
        PMINIDUMP_USER_STREAM_INFORMATION,
        PMINIDUMP_CALLBACK_INFORMATION
        );

    MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
    HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
    if (hDbgHelp)
        pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");

    if (pfnMiniDumpWriteDump)
    {
        if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
        {
            //TCHAR szPath[MAX_PATH] = { 0 };
            TCHAR szFileName[MAX_PATH] = { 0 };
            //TCHAR* szAppName = pwAppName;
            TCHAR* szVersion = L"v1.0";
            TCHAR dwBufferSize = MAX_PATH;
            SYSTEMTIME stLocalTime;

            GetLocalTime(&stLocalTime);
            //GetTempPath(dwBufferSize, szPath);

            //wsprintf(szFileName, L"%s%s", szPath, szAppName);
            CreateDirectory(szFileName, NULL);

            wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
                //szPath, szAppName, szVersion,
                szVersion,
                stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
                stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
                GetCurrentProcessId(), GetCurrentThreadId());
            hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
                FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

            bOwnDumpFile = TRUE;
            OutputDebugString(szFileName);
        }

        if (hDumpFile != INVALID_HANDLE_VALUE)
        {
            ExpParam.ThreadId = GetCurrentThreadId();
            ExpParam.ExceptionPointers = pExceptionPointers;
            ExpParam.ClientPointers = FALSE;

            pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
                hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);

            if (bOwnDumpFile)
                CloseHandle(hDumpFile);
        }
    }

    if (hDbgHelp != NULL)
        FreeLibrary(hDbgHelp);

    return EXCEPTION_EXECUTE_HANDLER;
}


LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
    if (IsDebuggerPresent())
    {
        return EXCEPTION_CONTINUE_SEARCH;
    }

    return GenerateMiniDump(NULL, lpExceptionInfo, L"test");
}

(c)调试dump文件

  终于在慢慢的等待中,现场程序崩溃,预期生成了dump文件,此时我们将dump文件拷贝到我们当时编译的debug版本可执行程序的同级目录下,注意pdb文件必须也在此目录

用vs打开dmp文件并点击使用仅限本机进行调试

出现异常时的弹窗即UnhandledExceptionFilter为默认的异常处理器工作产生的会出现中断的提示框,此时点击中断

右下角会弹出堆栈信息

双击有问题的一行,会出现弹窗,再选择代码工程所在目录(sln的目录),即可定位到有问题的那一行

分析错误,加上异常保护,重新生成版本,问题解决,收工!

作者:灼光

出处:https://www.cnblogs.com/laiyingpeng

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

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

相关文章

Lombok常见用法总结

目录一、下载和安装二、常见注释(一)Data(二)Getter和Setter(三)NonNull和NotNull(不常用)(四)ToString(不常用)(五&#…

一款丧心病狂的API测试工具:Apifox!

你好,我是测试开发工程师——凡哥。欢迎和我交流测试领域相关问题(测试入门、技术、python交流都可以) 我们平时在做接口测试的时候,对于一些常用的接口测试工具的使用应该都非常熟悉了: 接口文档:Swagge…

Databend 开源周报 第 83 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.com 。Whats New探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。Support for WebHDFSHDFS 是大数…

ArrayList集合底层原理

ArrayList集合底层原理ArrayList集合底层原理1.介绍2.底层实现3.构造方法3.1集合的属性4.扩容机制5.其他方法6.总结ArrayList集合底层原理 1.介绍 ​ ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在 内的所有元素。 每个 Array…

静态库和动态库的打包与使用

静态库和动态库 静态库和动态库的打包 生成可执行程序时链接使用 运行可执行程序时加载使用 提前声明,笔者示例的文件有mian.c/child.c/child.h。OK,我们先了解一下,库文件是什么?它其实就是打包了一堆实现常用功能的代码文件. ⭐…

Python之re库用法细讲

文章目录前言一、使用 re 模块的前期准备工作二、使用 re 模块匹配字符串1. 使用 match() 方法进行匹配2. 使用 search() 方法进行匹配3. 使用 findall() 方法进行匹配三、使用 re 模块替换字符串四、使用 re 模块分割字符串总结前言 在之前的博客中我们学习了【正则表达式】的…

C++ typedef用法详解

typedef的4种常见用法:给已定义的变量类型起个别名定义函数指针类型定义数组指针类型为复杂的声明定义一个新的简单的别名总结一句话:“加不加typedef,类型是一样的",这句话可以这样理解:没加typedef之前如果是个…

云原生架构设计原则及典型技术

云原生是面向云应用设计的一种思想理念,充分发挥云效能的最佳实践路径,帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 API 及 Serverless 等…

Apk加固后多渠道打包

之前一直使用360加固宝进行apk的加固打包,可以一键加固并打多渠道打包。但是,现在360加固宝收费了,在进行加固,多渠道打包,就得一步一步自己操作了,会很繁琐。所以,本文使用 360加固美团Wallet …

c++11 标准模板(STL)(std::unordered_map)(五)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

Java开发 - 单点登录初体验(Spring Security + JWT)

目录​​​​​​​ 前言 为什么要登录 登录的种类 Cookie-Session Cookie-Session-local storage JWT令牌 几种登陆总结 用户身份认证与授权 创建工程 添加依赖 启动项目 Bcrypt算法的工具 创建VO模型类 创建接口文件 创建XML文件 补充配置 添加依赖 添加配…

凭一部手机,7天赚20万?会剪辑的人有多吃香!

影视剪辑容易遇到哪些问题&#xff1a; 1、视频格式格式不对&#xff0c;剪辑软件不支持&#xff1b; 2、视频封面不会做&#xff1b; 3、PR导出视频时&#xff0c;没办法做其他事&#xff0c;效率不高&#xff1b; 4、自己配音不好听&#xff0c;配音软件又不好找&#xff1b;…

第14章 局部波动率模型

这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…

影响redis性能的一些潜在因素

影响 Redis 性能的 5 大方面的潜在因素&#xff0c;分别是&#xff1a; Redis 内部的阻塞式操作&#xff1b; CPU 核和 NUMA 架构的影响&#xff1b; Redis 关键系统配置&#xff1b; Redis 内存碎片&#xff1b; Redis 缓冲区。 先学习了解下 Redis 内部的阻塞式操作以及应对的…

【数据架构系列-03】数据仓库、大数据平台、数据中台... 我不太认同《DataFun数据智能知识地图》中的定义

关注DataFunTalk有2年多了&#xff0c;DataFun确实像创始人王大川讲的那样&#xff0c;践行选择、努力和利他原则&#xff0c;专注于大数据、人工智能技术应用的分享与交流&#xff0c;秉承着开源开放的精神&#xff0c;免费的共享了很多有营养的行业实践专业知识&#xff0c;对…

1.win10环境搭建Elasticsearch7.2.0环境

环境介绍jdk1.8安装Elasticsearch7.2.0下载安装包直接解压进入到bin目录&#xff0c;双击elasticsearch.bates启动成功访问http://localhost:9200/jdk版本1.8,很有可能因为jdk版本的问题es启动失败支持连接https://www.elastic.co/cn/support/matrix#matrix_jvm安装Kibana7.2.0…

云计算介绍,让你更了解云计算

同学们好&#xff01; 第一次接触IT行业吗&#xff1f;没关系&#xff0c;看完这篇文章肯定会让你不再陌生。给自己几分钟时间&#xff0c;认真看完哦&#xff01; 1、不知道什么是云计算&#xff1f; 网络计算云计算 官方定义是&#xff1a;通过网络提供可伸缩的分布式计算…

建立相关在线社群的3个简单步骤

在线社群管理和社交媒体营销通常被视为一回事。虽然社群管理确实是社交媒体营销的一个关键部分&#xff0c;但它的意义超越了社交媒体的内容发布。因此&#xff0c;在线社群对于企业的数字营销十分重要。创建、维护和发展社群不是一件容易的工作&#xff0c;也不是一个快速的过…

枚举学习贴

1. 概述 1.1 是什么 枚举对应英文(enumeration, 简写 enum)枚举是一组常量的集合。可以这里理解&#xff1a;枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.2 枚举的二种实现方式 自定义类实现枚举使用 enum 关键字实现枚举 1.3 什么时候用 存在有限…

利用HGT聚类单细胞多组学数据并推理生物网络

单细胞多组学数据允许同时对多种组学数据进行定量分析&#xff0c;以捕捉复杂的分子机制和细胞异质性。然而现有的工具不能有效地推断不同细胞类型的活性生物网络以及这些网络对外部刺激的反应。 来自&#xff1a;Single-cell biological network inference using a heterogen…