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

一、常见故障介绍  

  最近在开发相机项目(项目细节由于公司保密就不介绍了),程序运行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文件

 1 int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName)
 2 {
 3     BOOL bOwnDumpFile = FALSE;
 4     HANDLE hDumpFile = hFile;
 5     MINIDUMP_EXCEPTION_INFORMATION ExpParam;
 6 
 7     typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
 8         HANDLE,
 9         DWORD,
10         HANDLE,
11         MINIDUMP_TYPE,
12         PMINIDUMP_EXCEPTION_INFORMATION,
13         PMINIDUMP_USER_STREAM_INFORMATION,
14         PMINIDUMP_CALLBACK_INFORMATION
15         );
16 
17     MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
18     HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
19     if (hDbgHelp)
20         pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
21 
22     if (pfnMiniDumpWriteDump)
23     {
24         if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
25         {
26             //TCHAR szPath[MAX_PATH] = { 0 };
27             TCHAR szFileName[MAX_PATH] = { 0 };
28             //TCHAR* szAppName = pwAppName;
29             TCHAR* szVersion = L"v1.0";
30             TCHAR dwBufferSize = MAX_PATH;
31             SYSTEMTIME stLocalTime;
32 
33             GetLocalTime(&stLocalTime);
34             //GetTempPath(dwBufferSize, szPath);
35 
36             //wsprintf(szFileName, L"%s%s", szPath, szAppName);
37             CreateDirectory(szFileName, NULL);
38 
39             wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
40                 //szPath, szAppName, szVersion,
41                 szVersion,
42                 stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
43                 stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
44                 GetCurrentProcessId(), GetCurrentThreadId());
45             hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,
46                 FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
47 
48             bOwnDumpFile = TRUE;
49             OutputDebugString(szFileName);
50         }
51 
52         if (hDumpFile != INVALID_HANDLE_VALUE)
53         {
54             ExpParam.ThreadId = GetCurrentThreadId();
55             ExpParam.ExceptionPointers = pExceptionPointers;
56             ExpParam.ClientPointers = FALSE;
57 
58             pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
59                 hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);
60 
61             if (bOwnDumpFile)
62                 CloseHandle(hDumpFile);
63         }
64     }
65 
66     if (hDbgHelp != NULL)
67         FreeLibrary(hDbgHelp);
68 
69     return EXCEPTION_EXECUTE_HANDLER;
70 }
71 
72 
73 LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
74 {
75     if (IsDebuggerPresent())
76     {
77         return EXCEPTION_CONTINUE_SEARCH;
78     }
79 
80     return GenerateMiniDump(NULL, lpExceptionInfo, L"test");
81 }
(c)调试dump文件

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

 

 

 

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

 

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

 

 

右下角会弹出堆栈信息

 

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

 

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

 

转载于:https://www.cnblogs.com/laiyingpeng/p/11541881.html

### 回答1: msvcr100d.dllmsvcp100d.dll是Windows操作系统中的动态链接库文件,这两个文件通常是与C++开发环境相关的库文件。它们的主要作用是提供C++程序在运行时所需的函数和类库。 msvcr100d.dll是Microsoft Visual C++ 2010 Redistributable Package中的一个重要组件,它包含了许多用于C++程序运行的函数和类库。这个文件通常用于开发和调试阶段,在正式发布或部署时,通常需要将对应的dll文件更换为msvcr100.dllmsvcp100d.dll也是Microsoft Visual C++ 2010 Redistributable Package中的一个组件,它主要包含了面向对象编程(Object Oriented Programming)中的一些重要类库,如字符串处理、文件操作等。同样地,该文件在发布或部署时也需要更换为msvcp100.dll。 在Windows 10操作系统中,这两个文件是比较常见的,尤其是在使用C++开发软件时。如果缺少这些文件,可能会导致应用程序无法正常运行或出现错误提示。 如果遇到了缺少msvcr100d.dllmsvcp100d.dll的问题,可以尝试以下解决办法: 1. 确保已安装Visual C++ 2010 Redistributable Package。可以从Microsoft官方网站下载并安装对应的包。 2. 如果已安装了该包,但仍有问题,可以尝试重新安装或修复Visual C++ 2010 Redistributable Package。 3. 如果问题仍未解决,可以尝试将这两个dll文件手动复制到软件运行的目录中。 总之,msvcr100d.dllmsvcp100d.dll是与C++开发环境相关的动态链接库文件,缺少这些文件可能会导致软件无法正常运行。如果遇到问题,可以尝试按照上述方法进行解决。 ### 回答2: msvcr100d.dllmsvcp100d.dll是Microsoft Visual C++的运行库文件,常用于运行和支持基于C++语言开发的应用程序。这两个文件通常与开发环境一起安装,在使用某些应用程序时可能需要这些文件来正常运行。 在Windows 10中,这些文件的安装和使用是相对简单的。一般情况下,如果在运行应用程序时缺少这些文件,系统会自动弹出错误提示,指出缺少这些文件,并提供解决方法。 要解决这个问题,一个常见的办法是通过重新安装相关应用程序来修复缺失的dll文件。可以到官方网站或者开发者提供的链接处下载安装程序,然后运行安装程序按照指引进行安装即可。另外,也可以尝试通过在命令提示符下运行“sfc /scannow”命令来修复系统文件中的错误。 不过,需要注意的是,有时候缺失这些文件可能并不仅仅是由于这些文件没有安装或者损坏,还可能是由于应用程序版本的不兼容性等因素导致的。此时,可以尝试升级应用程序版本或者与开发者进行联系,以获取更详细的解决方案。 总之,对于msvcr100d.dllmsvcp100d.dll这两个文件的缺失问题,通常可以通过重新安装相关应用程序来解决。如果问题仍然存在,可以尝试其他方法或者寻求专业的技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值