软件调试笔记29 - 运行库和运行期检查

PC游戏运行库检测工具:确保游戏顺畅运行 运行库,简称DLL(Dynamic Link Library,动态链接库),是一组预先编译的代码模块,能够被多个程序同时调用以执行特定的任务。在PC游戏中,运行库通常包含音频、视频解码器、图形渲染引擎、物理模拟等核心组件,这些组件能够帮助游戏高效且稳定地运行在不同的操作系统上。在操作系统层面上,运行库提供了一系列预先定义好的函数和类,供游戏程序调用。这种模块化的结构不仅减少了代码的重复使用,也简化了程序间的依赖关系,使得更新维护变得更加便捷。 阅读详情

C/C++运行库:

编译器在将高级语言编译到低级语言的过程中,比较复杂的运算符对应比较多的低级语言指令,为了防止指令段多次重复,编译器通常将他们封装为函数,将高级语言翻译成对应的函数调用,比如VC编译器通常把new, delete编译为malloc 和free函数的调用。这些相配套的函数库或者类库称为支持库support library或者运行库runtime library,比如C标准定义的标准C函数,C++标准定义的C++标准类库等。实现支持库是实现编译器的一项重要任务。


C运行库:

C标准定义了C库函数的原型和功能,但没有提供实现,这个任务留给了编译器,每个编译器实现的通常是标准C函数库的一个超级,称为C支持库或者C运行库,简称CRT。主要函数如下,



C++标准库:

由三大部分组成:C标准库,IO流和标准模板库STL。VC编译器是将c++编译器所使用的C标准库与C编译器所使用的C运行库一起实现,而把IO流和STL单独实现。


链接运行库:

为了满足不同的需要,运行库通常有多个版本,比如为了辅助调试的版本,包含了断言,内存检查等功能,这些不会放在发布版本。调试版本和发布版本是共享源代码的,只是.lib和DLL文件不同。


静态链接和动态链接:

程序能顺利运行,使用运行库的程序在运行时必须可以找到库中的函数,有静态链接和动态链接两种方法。静态链接就是将使用的库函数复制到程序文件中,称为本模块的代码,但是会导致一个进程内的多个模块中,某些运行库函数重复存在于多个模块。动态链接在程序运行时动态加载包含支持函数的DLL,并更新程序的IAT表,使程序可以顺利调用DLL的支持函数。可以通过编译器选项来设置链接支持库的方式。/MT代表静态链接,/MD代表动态链接。如果使用调试版本则加d, 比如/MTd。


运行库的初始化:




DLL模块的用户入口函数是DllMain。 


编译器支持通过/ENTRY:function来指定其他函数作为入口。


初始化:

CRT入口函数主要包括以下:



可以在自己的程序文件中注册初始化和清理函数,比如以下例子,



多个运行库实例:

对于静态链接的程序模块,每个模块内都复制了一份运行库的变量和代码(部分),也就是每个模块中都有一个运行库的实例。当进程中有多个运行库实例时,每个都有自己的数据和资源(堆),有时候可能引发问题,比如从弄个一个CRT堆分配的内存被送给另一个CRT实例来释放。在调试版本中,CRT的内存检查功能会发现这个问题并报告错误,但是发布版本,便会导致严重的问题。


运行期检查:

运行期检查是位了发现程序运行时所暴露出的各种错误,即运行期错误。编译器通常采取如下几种措施:



前两种是编译器的运行库和编译过程自动提供的,称为编译器的自动检查,第三种需要人为插入代码来调用编译器提供的宏或函数,称为手工插入的检查,比如_ASSERT和—_RPT等。


自动的运行期检查:



断言ASSERT:



_ASSERT, _ASSERTE区别就是后者会把断言表达式也显示出来。


注意:断言不会出现在发布版本,所以不能在里面改变变量值,比如自增,可以使用VERIFY宏,因为它的表达式在发布版本一样会编译进目标代码。


报告运行期检查错误:

_CrtDbgReport是报告运行期检查信息的一个主要函数,



可以把调试信息送往三个目的地:调试文件,调试器的监视窗口和调试消息对话框。可以通过专门的函数来设置。





PC游戏运行库检测工具开发与实战 DirectX 的版本与功能息息相关,不同版本的 DirectX 支持不同的图形特性。以下是主要版本及其特点:DirectX 版本发布时间支持平台主要特性DirectX 92002年Windows XPShader Model 2.0、多纹理渲染DirectX 102007年Shader Model 4.0、统一渲染架构DirectX 112009年Windows 7DirectX 122015年。 阅读详情

相关推荐

游戏运行库检测软件

游戏运行库检测软件

C++如何检测VS运行时库安装成功?

MsiQueryProductStateA函数实现安装产品查询。如有疑问,敬请留言。

插件开发 1280

DLL动态库检测工具 32位64位检测工具 文件版本检测工具

DLL动态库检测工具 32位64位检测工具 文件版本检测工具 随着64位操作系统的逐步普及,32位软件和64位软件会在很长一段时间并行存在。虽然32位程序可以在64位windows下运行,但也有一些条件,要求EXE程度及所有dll动态库均统一为32位或64位,而不能混合运行。 作为软件开发人员,经常会碰到DLL动态库版本混乱问题,不同位数、不同版本的动态库可能混在一起,难以分清。当没有用到该文件时,也不一定 会报错,但实际上是的隐患留在了后面。 本程序的作用是把指定目录下的所有文件(特别是exe和dll文件)逐一进行检测,详细列出文件的版本号、修改时间、文件大小、位数,一目了然 。 可以导出为文本文件,随时进行比较,快速找不正确的文件。

检测VC++Redistributable运行库 & vcredist_x86.exe

不同版本的VC++Redistributable具有不同的GUID(全局唯一标识),这给检测带来了很大困难。但是一个很明确的问题是——不管是何种版本,都会在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\路径下生成一个注册键key。

机器学习 1万+

工业互联网工控安全与工业质检AI大模型建设方案.pptx

工业互联网工控安全与工业质检AI大模型建设方案.pptx

Codex辅助小说创作:零成本AI写作指南与实战技巧

自然语言处理技术通过深度学习模型理解语义上下文,其核心原理是基于大规模文本训练的语言模型预测能力。在创意写作领域,这项技术的价值在于突破传统写作工具的功能局限,实现从内容生成到风格模仿的智能化辅助。特别是提示词工程的应用,让创作者能够精准控制AI输出的内容和风格。在实际应用场景中,AI写作工具显著降低了小说创作门槛,适用于网络小说、奇幻科幻等多种文学类型。本文以OpenAI Codex为例,详细解析如何利用AI技术完成从故事大纲设计、章节生成到平台发布的全流程创作,其中提示词优化和内容质量把控是提升生成效果

weixin_32678995的博客 557

C运行时库分析-检测内存泄漏篇(模拟实现)

内存泄漏对于每个C\C++程序员来说

yangjian578的专栏 628

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

1小时开发:自制运行库检测小工具

最近在帮同事排查软件兼容性问题时,发现很多报错都和运行库版本有关。微软的运行库(VC++、.NET这些)如果缺失或版本不对,程序就会各种崩溃。但每次手动检查太麻烦,就想着自己写个小工具自动检测。上开发特别顺畅,网页编辑器响应快,还能直接看到运行效果。最惊喜的是它能一键部署成可执行文件,不用折腾打包工具。对于这种200行左右的小工具,从编码到能用真的只要1小时。如果是更复杂的版本,还可以考虑用平台提供的AI辅助功能来优化代码。不过当前这个简洁版已经能满足日常检测需求了,推荐大家也试试自己动手做一个。

SnowflakeJaguar14的博客 854

使用 DEM 模拟金属烧结过程

了解离散元素法 (DEM) 如何彻底改变烧结工艺,提高制造业的效率和精度。

jkh920184196的博客 1125

别再只抄代码了!深入理解MQ2传感器数据手册,搞定ppm换算公式

本文深入解析MQ2烟雾传感器的工作原理与ppm换算公式,从数据手册解读到数学建模,提供详细的校准与优化方法。通过实际案例和代码示例,帮助开发者准确测量气体浓度,解决常见问题,提升传感器应用的可靠性。

weixin_42713608的博客 504

30分钟打造Visual C++运行库检测工具

这里需要特别注意32位和64位系统的注册表路径差异,以及不同VC++版本对应的注册表键值。它的在线编辑器开箱即用,内置Python环境,不用配置复杂的开发环境就能直接写代码。对于需要分享给别人的项目,还能一键生成可运行的演示链接,省去了部署的麻烦。这个工具的核心功能是扫描系统中已安装的Visual C++运行库,特别是2019版本。用PySimpleGUI创建简单界面,左侧显示检测到的版本列表,右侧用颜色区分状态(绿色表示已安装,红色表示缺失)。二是版本号匹配逻辑,不同年份的VC++版本号格式略有不同;

CyanWave34的博客 862

通达信大单资金实时监控与播报插件:股票分析的实用利器——大红球

本文介绍了一款专为通达信软件设计的大单资金实时监控与播报插件,该插件以其傻瓜式操作和入门级特性在股民中广受欢迎。插件核心功能包括与通达信版面的无缝联动、大单金额范围的自定义设置、资金流动的可视化展示以及智能声音播报等。其技术架构基于本地网页形式,自带分时图显示功能,数据实时更新且无需L2账户,承诺永久免费升级。插件通过红绿球的大小和颜色直观展示资金规模与买卖方向,顶端全局统计功能提供宏观资金流动分析。尽管插件数据具有较高参考价值,但投资者仍需结合其他因素进行综合判断。插件界面可自适应调整,提供个性化使用体验

guleba的博客 6584

网络测试软件要什么运行库,运行库检测工具(All in One Runtime)

运行库检测工具,检测你电脑中缺失的或老版本的系统运行库,智能提供安装与升级功能。相关软件软件大小版本说明下载地址All in One Runtime 是款来自国外的常用运行库检测工具,它会自动检测你系统中缺失的或者版本较老的常用运行库,然后提供给你安装或者升级选项。如果你在运行游戏或者一些软件时经常遇到“没有找到MSVBVM60.DLL”;“应用程序配置不正确,程序未能启动”;甚至在应用程序运行一...

weixin_30701661的博客 3174

MTK平台WiFi学习--Wi-Fi 连线/断线问题初步分析

摘要:本文详细介绍了MTK平台WiFi连接问题的日志分析方法。文章首先阐述了WiFi连接的标准流程,包括指令接收、BSSID选择、信道分配、认证关联、四次握手和DHCP获取等关键步骤。针对常见故障场景,如选网失败、信道申请失败、认证关联失败、四次握手失败等,提供了具体的日志分析方法和排查思路,包括识别关键日志、分析状态码、结合固件日志和抓包数据等。文章还特别强调了不同故障场景下需要收集的日志类型和分析要点,为WiFi连接问题的定位提供了一套系统化的解决方案。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1590

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 665

win11的检测

1. 今天闲来无事,打算升级win11,发现Microsoft的要求太多了,总体上来说,最大的注意点有以下几点: 需要TPM2.0的存在 DirectX的版本 可支持的CPU兼容性 2. 为了验证上述基本硬件支持,此处使用开源工具,WhyNotWin11,下载安装并完成安装后进行检测。软件截图如图: 如果登录不上去,我已上传在站内,无需积分下载,链接:https://download.youkuaiyun.com/download/l8947943/20902233 3.首先开启TPM: 首先判断查..

l8947943的博客 1891

Modbus协议学习第一篇之基础概念

因工作需要而接触Modbus,正在恶补知识,利用博客的方式来加深理解和记忆,同时希望同行大佬能一起交流。

hzf978742221的博客 880

5分钟搞定:VS2019 x64运行库检测工具原型开发

这里需要注意32位和64位程序访问注册表的差异,Python 32位程序在64位系统上会默认重定向到Wow6432Node,需要使用KEY_WOW64_64KEY标志。我用QVBoxLayout做整体布局,顶部放一个QLabel显示检测结果,下面放两个QPushButton:一个用于重新检测,一个提供微软官方下载链接。对于需要分享给别人的项目,平台的一键部署功能也很实用,不用操心环境配置问题。下次再遇到类似需求,不妨试试用Python快速实现一个原型,可能会节省大量排查问题的时间。

BlackironPanther23的博客 611

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何检测VC运行库是否安装

通过MSI的API来查询 ,参见MSDN说明 MsiQueryProductState MsiQueryProductState的输入参数为产品ID,其返回值为产品安装状态,若返回值为INSTALLSTATE_DEFAULT则表示已安装,以下为一些VC运行库产品ID: Visual C++ 2005 runtime files Visual C++ 2005 Redistri

编程小战 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

bat 判断vc各版本运行库是否安装

为了覆盖多个版本,你可以编写一个循环,通过不同的注册表路径运行检查。但是,这种方法可能不够全面,因为某些版本的运行库可能不会在预期的注册表路径下有记录。因此,最可靠的方法可能是结合使用多种方法,包括检查注册表、系统文件夹中的DLL文件以及使用第三方工具进行更详细的分析。更复杂的情况是,某些版本的VC运行库可能不会在注册表中留下明显的键,而是使用Windows Installer(MSI)数据库来存储信息。由于各个版本的安装位置和注册表结构可能变化,你可能需要针对每个版本编写单独的检查逻辑。

zengliguang的专栏 1444

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

检测电脑VC++运行库是否安装

#include <Windows.h> #include <msi.h> #pragma comment(lib,"Msi.lib") INSTALLSTATE state = MsiQueryProductState(_T("{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}"));Visual C++ 2005 runtime filesV...

Haryy的博客 1万+

数据库运行情况检查

1、检查操作系统版本和数据库版本是否匹配uname –a2、硬盘可用空间df –lh3、CPU/内存 利用率top4、磁盘io使用。

weixin_44165869的博客 3133

3分钟验证:Visual C++ 2019运行库检查工具开发

注册表查询要注意权限问题,可能需要管理员权限版本号比对要考虑多个子版本号的组合判断程序体积控制在100KB以内,确保快速启动。

SilvermistFalcon19的博客 960

AI如何自动修复游戏运行库缺失问题

很多游戏玩家都遇到过这样的问题:下载了一个新游戏,兴冲冲地双击运行,结果弹出一个错误提示,说缺少某个运行库文件,比如DirectX、Visual C++ Redistributable之类的。这时候就得手动去网上搜索下载,运气好能找到官方版本,运气不好还可能下载到带病毒的文件。AI的引入使得工具更加智能,能够学习用户的使用习惯,提供个性化建议。更麻烦的是,不同的游戏需要不同版本的运行库,有些还需要特定的补丁。这个模型是预先训练好的,能够根据游戏特征(如引擎类型、发行年份等)预测所需的运行库组合。

OnyxPanther23的博客 864

Inno Setup 运行库安装检测脚本,判断 VC++ 2005~2022 运行库、.Net Framework、.Net Core、.NET 运行时

Inno Setup 检测运行库安装状态 [Code] 示例,需要 Inno Setup 6.4.+ 以上版本。

lsxd123的博客 703
上一篇: 软件调试笔记28 - 编译器的调试支持 :标注
下一篇: 软件调试笔记30 - 栈和函数调用 : 栈简介
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值