使用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篇教程的跨度有点大 ...
最新文章
- 聊一聊Java 泛型中的通配符 T,E,K,V,?
- 面试季,Java中的static关键字解析
- java中String,int,Integer,char、double类型转换
- 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
- .NET Core 3.0特性初探:C# 8、WPF、Windows Forms、EF Core
- 【java8新特性】——Stream API详解(二)
- python urllib3 request 无返回结果_python urllib request urlopen请求网页返回bytes类型
- 人工智能写小说python_1月下旬值得一读的10本技术新书(人工智能、C++、Python数据科学等)!文末有福利!...
- 力扣1512.好数对的数目
- 异常处理简单例子--python except Exception as e
- Java转码amr_java amr格式转mp3格式(完美解决Linux下转换0K问题)
- 三节点潮流计算matlab,电力系统分析大作业matlab三机九节点潮流计算报告.doc
- ftp服务器连接不了文件路径,Serv-U和CuteFTP无法连接FTP服务器问题解答
- RS485MODBUS RTU转PROFINET网关/PROFINET转MODBUS RTU网关将施耐德ATV610变频器接入西门子1500 PROFINET网络配置方法
- 期末复习—计算机组成原理—计算机的分类
- oracle excel导入卡死 新解决办法
- 白苹果了怎么办_iOS更新白苹果处理及第三方售后吐槽
- Minimum-Cost Spanning Tree
- 【深度学习】计算机视觉(七)——使用GPU进行目标检测详解(上)
- php反向引用,JavaScript 正则应用详解【模式、欲查、反向引用等】
热门文章
- IBM软件集团副总裁:三个层面解析IBM云计算
- 维克设备管理软件 v2.15 通用版 免费
- 运用波利亚的怎样解题表来解决事件绑定问题
- Invoking “make -j12 -l12“ failed
- 女博士计算机类,女博士年薪156万入职华为!网友:美貌与智慧并重
- Python案例——利用接口实现【自动抠图+改色】
- python制作标书_Python爬取比比网中标标书并保存成PDF格式
- oracle11系统安装,Windows系统下安装Oracle 11g R2教程,oracle11g
- 学生资质领取阿里云7个月免费服务器,飞天加速3.0-高校计划
- 换了显卡之后显卡占用率上不去掉帧求解