使用CRT调式库调式运行时堆
#include<iostream>
#include<Windows.h>
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>using namespace std;//客户端块挂钩回调
void DumpClientFunction(void* userPortion, size_t blockSize)
{cout << userPortion << ":"<< blockSize<<endl;
}
/*
#define debug_new new(__FILE__,__LINE__)
void* __cdecl operator new(size_t nSize, const char* lpszFileName, int nLine)
{cout << lpszFileName << ":" << nLine << endl;return malloc(nSize);
}
#define new debug_new
*/
#ifdef _DEBUG
#define DBG_NEW new ( _CLIENT_BLOCK , __FILE__ , __LINE__ )
#else
#define DBG_NEW new
#endif
int main()
{// _crtBreakAlloc = 99;//设置内存分配编号断点//_CLIENT_BLOCK块内存转储挂钩函数_CrtSetDumpClient(DumpClientFunction);//客户端块是针对MFC程序 CObject 此处没作用//设置报告模式_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);//内存块检测点_CrtMemState s1, s2, s3;_CrtMemCheckpoint(&s1); auto p = new double;auto pr = new double;auto pc = DBG_NEW char;//_CLIENT_BLOCK分配动作_CrtMemCheckpoint(&s2);if (_CrtMemDifference(&s3, &s1, &s2))_CrtMemDumpStatistics(&s3);//内存泄漏转储_CrtDumpMemoryLeaks();using Fntype = void(*)();HINSTANCE hdll = LoadLibrary("memd.dll");Fntype fn=(Fntype)GetProcAddress(hdll, "Print");//此处对于链接器所见链接性不会有任何影响,因为链接器不需要管,是在运行期直接寻址fn();return 0;
}
CRT 调试库使用
C 运行时 (CRT) 库提供广泛的调试支持。 若要使用 CRT 调试库之一,必须使用 链接/DEBUG并使用 、 /MTd或/MDd 进行编译。
客户端块挂钩
使用 _CrtSetDumpClient 安装挂钩函数后,每次转储块时 _CLIENT_BLOCK 都会调用它。 然后,可以使用 _CrtReportBlockType 获取有关转储块的类型或子类型的信息。
利用CRT调式堆
调式堆中的块类型
_NORMAL_BLOCK【正常块】
调用 malloc 或 calloc 创建 Normal 块。 如果打算仅使用 Normal 块,并且不需要客户端块,则可能需要定义 _CRTDBG_MAP_ALLOC。 _CRTDBG_MAP_ALLOC 将所有堆分配调用映射到调试版本中的调试等效项。 它允许在相应的块标头中存储有关每个分配调用的文件名和行号信息。
_CRT_BLOCK【运行时库分配的块】
由许多运行库函数内部分配的内存块被标记为 CRT 块,以便可以单独处理这些块。 因此,泄漏检测和其他操作可能不受它们影响。 分配永不可以分配、重新分配或释放任何 CRT 类型的块。
_CLIENT_BLOCK【客户端自定义标记块】
出于调试目的,应用程序可以专门跟踪一组给定的分配,方法是使用对调试堆函数的显式调用将它们作为该类型的内存块进行分配。 例如,MFC 将所有 CObject 对象分配为客户端块;其他应用程序可能会在客户端块中保留不同的内存对象。 还可以指定客户端块的子类型,使跟踪粒度更大。 若要指定客户端块的子类型,请将该数字向左移 16 位,并使用 _CLIENT_BLOCK 对其进行 OR 运算。 例如:
C++
#define MYSUBTYPE 4
freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));
可以使用 安装 _CrtSetDumpClient客户端提供的用于转储客户端块中存储的对象的挂钩函数,然后在调试函数转储客户端块时调用。 此外, _CrtDoForAllClientObjects 可用于调用应用程序为调试堆中的每个客户端块提供的给定函数。
_FREE_BLOCK【仿释放块:释放动作不移除块;而是给其标记为仿释放标记】
通常,所释放的块将从列表中移除。 若要检查释放的内存是否未写入或模拟内存不足的情况,可以将释放的块保留在链接列表中,标记为可用,并使用当前0xDD) (已知字节值填充。
_IGNORE_BLOCK【把一定时间内的分配动作产生的块标记为 可忽略块】
可以在一定时间间隔内关闭调试堆操作。 在该时间段内,内存块保留在列表上,但被标记为“忽略”块。
详见 _CrtSetDbgFlag函数说明
配置调试堆【调式模式会使用到堆函数的调式版本,这些版本函数被调用时会对上下cookie已经debug head进行检查】
对堆函数(例如 malloc、free、calloc、realloc、new 和 delete)的所有调用均解析为这些函数在调试堆中运行的调试版本。 释放内存块时,调试堆自动检查已分配区域两侧的缓冲区的完整性,并在发生覆盖时发出错误报告。
使用调试堆 将应用程序的调试版本与 C 运行时库的调试版本链接。
线程栈模块堆:不同的模块所用的运行时堆不同,CRT调式堆函数只能检查他们所在运行时堆的信息
使用CRT调式库调式运行时堆相关推荐
- crt 运行时库dll跨模块传递crt对象,出现的崩溃问题
参考链接: https://blog.csdn.net/weixin_30653097/article/details/96512399 (讲述了,运行时库在启动的时候在exe或dll入口点之前就使用 ...
- C++堆被破坏 运行时库
每个进程都有一个默认堆,在进程初始化的时候会创建这个默认堆,可以通过GetProcessHeap()获取默认堆的句柄.使用CRT时,也会有一个CRT堆,VS项目属性 ~ C/C++ ~ 代码生成 ~ ...
- 什么是c/c++运行时库
什么是c/c++运行时库 在各个版本的编译器中,我们可以通过配置选项来设置程序使用的C和C++运行时库的类型.如下图(其他版本编译器大同小异): MT选项:链接LIB版的C和C++运行库.在链接时就会 ...
- “ compiler-rt”运行时runtime库
" compiler-rt"运行时runtime库 编译器-rt项目包括: • Builtins-一个简单的库,提供了代码生成和其他运行时runtime组件所需的特定于目标的低级接 ...
- 如何在VS2005下生成动态运行时库
如果我们的工程采用的是动态链接MFC库,那我们的程序如果拷贝到一个没有转VC的电脑中,我们的程序要想正确运行,除了拷贝程序外,还要将运行时库拷贝过去,下面记录下如何创建动态运行时库: file-> ...
- 运行时so库::主动加载C符号
本节主要讨论运行时so库的主动加载C符号, 以飨读者. 对于C/C++程序而言, 很多时候都会自动加载符号.除此之外, 主动加载符号能够让模块实现热插拔, 在程序发布, ...
- 也来看看Android的ART运行时
之前因为需要,研究了一下ART的相关源码,也做了一些记录与总结,现在重新整理了一下与大家共同讨论和交流一下. 0x00 概述 ART是Android平台上的新一代运行时,用来代替dalvik.它主要采 ...
- DotNetAnywhere:可供选择的 .NET 运行时
我最近在收听一个名为DotNetRock 的优质播客,其中有以Knockout.js而闻名的Steven Sanderson 正在讨论 " WebAssembly And Blazor &q ...
- DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
目录 1.前言及本章内容提要 2.初识DirectXMath库 3.使用独立堆创建常量缓冲 4.理解管线状态对象 5.理解围栏同步 6.完整代码 1.前言及本章内容提要 经过了之前3篇教程的跨度有点大 ...
最新文章
- iis 站点中文乱码 解决方案
- 淘宝网消费者年维权成功金额达1.69亿
- Spring Cloud Alibaba 项目工程准备
- Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize %ORACLE_HOME%\bin\oci.dll
- mapreduce的规约(Combiner)
- 使用纯HTML和OmniFaces构建动态响应的多级菜单
- MySql某一列累计查询
- 驳《阿里「Java开发手册」中的1个bug》?
- libiconv字符集转换库在C#中的使用
- jQuery form插件使用详解
- 刚大学毕业,学习的C++,到底能做什么?
- CVPR2021论文整理
- with 语句的妙用
- 虚拟机中模拟uboot启动
- spark记录(6)SparkCore的调优之开发调优
- 使用参数非参数和机器学习方法分析印度降雨变化,能给我国带来什么警示?
- SPSS典型相关分析(Canonical Correlation Analysis)案例(SPSS25最新版)
- 有了戴森HP04,空调和空气净化器都不用买了
- oa系统服务器什么意思,OA系统是什么意思
- django后台添加学生-jquery实现表单正则表达式验证,判断是否可以进行提交
热门文章
- 应届生找不到工作,咋整?
- 公共教室计算机安全调查报告论文,东风中学现代教育技术应用调查报告毕业论文...
- Altium designer 10导出BOM
- vivo服务器最新版本,vivo服务安全插件
- Mongodb学习技术网站地址一览
- Http常见的状态码
- 看M代码系列(记录一些函数之类的)
- css图片6边形,CSS3 实现六边形Div图片展示效果
- 嵌入式学习笔记--misc
- python重量计算月球地球_没有vpython如何在数值模拟中用python求解地球和月球轨道?...