当前位置: 首页 新闻详细

运行程序出现runtime error怎么回事?win进程弹出Microsoft Visual C++ Runtime Library的解决办法

专业编程培训机构——完成蜕变以后轻松拿高薪

电话+V:159999-78052 ,欢迎咨询编译器报错runtime,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]

一、运行程序出现runtimeerror怎么回事?

运行程序时出现runtimeerror,通常指的是程序在运行时遇到了无法正常处理的情况,导致程序异常终止。

详细来说,runtimeerror是在程序执行过程中发生的问题,这些问题通常与程序的逻辑、资源管理、外部依赖或环境设置有关。这类错误不同于编译时错误,后者是在代码编译成可执行文件之前由编译器检测到的语法或类型错误。

运行时错误可能由多种原因引起。例如,程序可能试图访问一个未被初始化或已经被释放的内存地址,这会导致内存访问违规错误。又如,程序可能尝试除以零,这在大多数编程语言中都是非法的操作,会引发除以零错误。此外,如果程序依赖的外部文件或服务不存在、不可访问或格式不正确,也可能导致运行时错误。

解决运行时错误通常需要仔细分析错误消息、检查代码逻辑、使用调试工具以及验证外部依赖和环境设置。例如,如果错误消息指示内存访问违规,开发者可能需要检查所有与内存分配和释放相关的代码,确保所有内存操作都是合法和安全的。如果错误与外部依赖有关,可能需要验证依赖项是否已正确安装和配置。

二、什么是runtimeerror?

Runtimeerror(运行时错误)是指在计算机程序执行期间发生的错误,通常会在程序运行时导致程序崩溃或产生异常行为。这种错误通常是由于编程错误、内存问题、系统资源不足或其他外部因素引起的。

运行时错误与编译时错误不同。编译时错误是在代码编译阶段由编译器检测到的错误,这些错误通常是由于语法错误、类型不匹配或其他违反编程语言规则的问题引起的。而运行时错误则是在程序执行期间发生的,编译器在编译阶段无法检测到这些错误。

运行时错误可能由多种原因引起。一种常见的原因是内存访问错误,例如空指针引用或数组越界。这些错误通常会导致程序崩溃或产生不可预测的行为。另一种原因是资源争用,即多个线程或进程同时访问共享资源时可能发生的冲突。这种错误通常会导致数据不一致或其他不可预测的行为。

为了处理运行时错误,程序员通常需要采取一些预防措施。这包括使用调试工具来查找和修复潜在的编程错误,编写健壮的代码来避免内存访问错误和资源争用等问题,以及使用异常处理机制来处理可能发生的运行时错误。

win进程弹出MicrosoftVisualC++RuntimeLibrary的解决办法

2020-06-0122:47·物物互联梦动者

很多软件通过设置自己的异常捕获函数,捕获未处理的异常,生成报告或者日志(例如生成mini-dump文件),达到Release版本下追踪Bug的目的。但是,到了VS2005(即VC8),Microsoft对CRT(C运行时库)的一些与安全相关的代码做了些改动,典型的,例如增加了对缓冲溢出的检查。新CRT版本在出现错误时强制把异常抛给默认的调试器(如果没有配置的话,默认是Dr.Watson),而不再通知应用程序设置的异常捕获函数,这种行为主要在以下三种情况出现。

(1)调用abort函数,并且设置了_CALL_REPORTFAULT选项(这个选项在Release版本是默认设置的)。

(2)启用了运行时安全检查选项,并且在软件运行时检查出安全性错误,例如出现缓存溢出。(安全检查选项/GS默认也是打开的)

(3)遇到_invalid_parameter错误,而应用程序又没有主动调用
_set_invalid_parameter_handler设置错误捕获函数。

所以结论是,使用VS2005(VC8)编译的程序,许多错误都不能在
SetUnhandledExceptionFilter捕获到。这是CRT相对于前面版本的一个比较大的改变,但是很遗憾,Microsoft却没有在相应的文档明确指出。

下面列出三种解决方法。

方法一:windows进程崩溃时禁止弹出错误对话框

在程序初始化的时候加入以下代码。如果程序中通过
SetUnhandledExceptionFilter捕获异常,需要在
SetUnhandledExceptionFilter后面增加以下代码。

SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX);_set_abort_behavior(0,_WRITE_ABORT_MSG|_CALL_REPORTFAULT);或者//关闭微软堆转储的噪音_CrtSetReportMode(_CRT_WARN,_CRTDBG_MODE_FILE);_CrtSetReportFile(_CRT_WARN,CreateFileA("NUL",GENERIC_WRITE,0,nullptr,OPEN_EXISTING,0,0));SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX);//在abort上禁用令人困惑的“helpful”文本消息_set_abort_behavior(0,_WRITE_ABORT_MSG|_CALL_REPORTFAULT);

_CrtSetReportMode:设置开发编译环境报告类型为警告,报告的输出方式为文件输出。

_CrtSetReportFile:创建一个空的文件,把警告消息输出到这个文件中。即关闭警告消息。

编译器报错runtime

_set_abort_behavior:处理在VS环境下的只会强制把异常抛给默认的调试器的问题,用该函数把异常抛给异常捕获函数。SetErrorMode:控制指定类型的严重错误是由windows处理还是由应用程序处理。

方法二:拦截CRT调用
SetUnhandledExceptionFilter函数,使之无效。

之所以应用程序捕获不到那些异常,原因是因为新版本的CRT实现在异常处理中强制删除所有应用程序先前设置的捕获函数,如下所示:

/*Makesureanyfilteralreadyinplaceisdeleted.*/SetUnhandledExceptionFilter(NULL);UnhandledExceptionFilter(ExceptionPointers);

解决方法是拦截CRT调用
SetUnhandledExceptionFilter函数,使之无效。在X86平台下,可以使用以下代码。

#ifndef_M_IX86#error"Thefollowingcodeonlyworksforx86!"#endifvoidDisableSetUnhandledExceptionFilter(){void*addr=(void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),"SetUnhandledExceptionFilter");if(addr){unsignedcharcode[16];intsize=0;code[size++]=0x33;code[size++]=0xC0;code[size++]=0xC2;code[size++]=0x04;code[size++]=0x00;DWORDdwOldFlag,dwTempFlag;VirtualProtect(addr,size,PAGE_READWRITE,dwOldFlag);WriteProcessMemory(GetCurrentProcess(),addr,code,size,NULL);VirtualProtect(addr,size,dwOldFlag,dwTempFlag);}}

WIN8.1上VirtualProtect报错C0000005,解决方法如下:

boolAdjustPrivileges(){HANDLEhToken;TOKEN_PRIVILEGEStp;TOKEN_PRIVILEGESoldtp;DWORDdwSize=sizeof(TOKEN_PRIVILEGES);LUIDluid;if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,hToken)){if(GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)returntrue;elsereturnfalse;}if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,luid)){CloseHandle(hToken);returnfalse;}ZeroMemory(tp,sizeof(tp));tp.PrivilegeCount=1;tp.Privileges[0].Luid=luid;tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;/*AdjustTokenPrivileges*/if(!AdjustTokenPrivileges(hToken,FALSE,tp,sizeof(TOKEN_PRIVILEGES),oldtp,dwSize)){CloseHandle(hToken);returnfalse;}//closehandlesCloseHandle(hToken);returntrue;}voidDisableSetUnhandledExceptionFilter(){void*addr=(void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),"SetUnhandledExceptionFilter");if(addr){unsignedcharcode[16];intsize=0;code[size++]=0x33;code[size++]=0xC0;code[size++]=0xC2;code[size++]=0x04;code[size++]=0x00;DWORDdwOldFlag,dwTempFlag;//提升debug权限VirtualProtect(addr,size,PAGE_EXECUTE_READWRITE,dwOldFlag);WriteProcessMemory(GetCurrentProcess(),addr,code,size,NULL);VirtualProtect(addr,size,dwOldFlag,dwTempFlag);}}

在设置自己的异常处理函数后,调用
DisableSetUnhandledExceptionFilter禁止CRT设置即可。虽然也可以通过_set_abort_behavior(0,_WRITE_ABORT_MSG|_CALL_REPORTFAULT),signal(SIGABRT,...),和
_set_invalid_parameter_handler(...)解决(1)(3),但是对于(2),设置apihook是唯一的方式。

方法三:禁止弹出“停止工作”对话框

在Win7及以后的系统中,如果一个程序发生了奔溃,系统会弹出一个“XX已停止工作”的对话框,如果不去这个窗口上点击“关闭程序”,那么这个窗口会一直存在,最为关键的是,奔溃的进程并没有真正结束,还一直挂起在那里。这在自动化无人值守程序开发中是不允许的,有时候有的程序只能运行一个实例,如果奔溃的这个进程一直没有真正结束,新进程就无法启动。根据网上资料,在Windows服务管理器中关闭这个错误报告服务,仍然会弹出停止运行的对话框。最后在MSDN上找到了Windows的错误报告服务配置说明:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb513638(v=vs.85).aspx

那如何禁止werfault窗口的弹出呢?

在stackoverflow上找到一个方法,可以通过修改注册表,抑制这个错误窗口的弹出。

具体方法如下所示:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\WindowsErrorReporting]"Disabled"=dword:00000001"DontShowUI"=dword:00000001[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsErrorReporting]"Disabled"=dword:00000001"DontShowUI"=dword:00000001

修改注册表后应该就可以了。

如果还有问题,可能需要重新加载注册表

1.进程中关闭explorer.exe

2.运行explorer.exe

【WINDRISES EMPLOYMENT PROGRAMMING】尊享对接老板

电话+V:159999-78052

机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。

编译器报错runtime
发布人:q511973469 发布时间:2024-10-25