EVC内存检测

将以下代码保存为.h文件,在待检测的应用中调用它。

  1 /*****************************************************************
  2 为了使用内存检测,需要在待检测代码中进行以下三步:
  3 1. Define _DEBUG #define _DEBUG
  4 2. Include "crtdbg.h" #include "crtdbg.h"
  5 3. Let your first line in the code be: _CrtSetDbgFlag (ON);
  6 ********************************************************************/
  7 #ifndef _CRTDBG_HEADER
  8 #define _CRTDBG_HEADER
  9 #ifdef _DEBUG
 10
 11 extern "C" void WINAPIV NKDbgPrintfW(LPCWSTR lpszFmt, ...);
 12 struct CrtFileName
 13 {
 14 unsigned short* _pusCrtName;
 15 CrtFileName* _pCrtNext;
 16 };
 17
 18 struct _CrtMem
 19 {
 20 CrtFileName* _pCrtFileName;
 21 int _iCrtLine;
 22 unsigned int _uiCrtMemLen;
 23 void* _pCrtMemAddr;
 24 _CrtMem* _pCrtNext;
 25 };
 26
 27 void* operator new(unsigned int s,unsigned short* name,int line);
 28 inline void* __cdecl operator new(unsigned int s)
 29  { return ::operator new(s, _T(__FILE__), __LINE__); }
 30
 31 void __cdecl operator delete(void *pvMem);
 32
 33 class garbageCollector
 34 {
 35 public:
 36 garbageCollector () {}
 37 ~garbageCollector ();
 38 };
 39 #define _CrtSetDbgFlag(ignore) garbageCollector gb;
 40  _CrtMem* _pCrtMemRoot = 0;
 41 CrtFileName* _pCrtFileNameRoot = 0;
 42 void* operator new(unsigned int s,unsigned short* name,int line)
 43 {
 44  void* retPtr = malloc (s);
 45 if (retPtr)
 46 { _CrtMem* _crtMemCell = (struct _CrtMem*)malloc (sizeof(_CrtMem));
 47  _crtMemCell->_iCrtLine = line;
 48 _crtMemCell->_uiCrtMemLen = s;
 49 _crtMemCell->_pCrtMemAddr = retPtr;
 50 _crtMemCell->_pCrtNext = 0; CrtFileName* _tmpCrtFileName;
 51 for (_tmpCrtFileName = _pCrtFileNameRoot;
 52  _tmpCrtFileName && wcscmp(name, _tmpCrtFileName->_pusCrtName);
 53  _tmpCrtFileName = _tmpCrtFileName->_pCrtNext) {}
 54
 55  if (!_tmpCrtFileName)
 56 { unsigned short* _crtName = (unsigned short*)malloc ((wcslen (name) + 1) * sizeof(unsigned short));
 57 wcscpy (_crtName, name); CrtFileName* _crtFileName = (struct CrtFileName*)malloc (sizeof (CrtFileName));
 58 _crtFileName->_pusCrtName = _crtName;
 59  _crtFileName->_pCrtNext = 0; if (!_pCrtFileNameRoot) _pCrtFileNameRoot = _crtFileName;
 60  else { for (_tmpCrtFileName = _pCrtFileNameRoot;
 61 _tmpCrtFileName->_pCrtNext;
 62 _tmpCrtFileName = _tmpCrtFileName->_pCrtNext);
 63  _tmpCrtFileName->_pCrtNext = _crtFileName;
 64 }
 65 _tmpCrtFileName = _crtFileName;
 66 }
 67  _crtMemCell->_pCrtFileName = _tmpCrtFileName;
 68 if (!_pCrtMemRoot) { _pCrtMemRoot = _crtMemCell; }
 69 else { _CrtMem* _tmpMemPtr; for (_tmpMemPtr = _pCrtMemRoot; _tmpMemPtr->_pCrtNext; _tmpMemPtr = _tmpMemPtr->_pCrtNext); _tmpMemPtr->_pCrtNext = _crtMemCell;
 70 }
 71 }
 72 return retPtr;
 73 }
 74
 75 void __cdecl operator delete(void *pvMem)
 76 { if (pvMem)
 77 { _CrtMem* _tmpMem;
 78 if (pvMem == _pCrtMemRoot->_pCrtMemAddr)
 79 { _tmpMem = _pCrtMemRoot; _pCrtMemRoot = _pCrtMemRoot->_pCrtNext; free (_tmpMem);
 80 }
 81 else
 82 { for (_tmpMem = _pCrtMemRoot; _tmpMem->_pCrtNext && (_tmpMem->_pCrtNext->_pCrtMemAddr != pvMem);
 83  _tmpMem = _tmpMem->_pCrtNext);
 84 if (_tmpMem->_pCrtNext)
 85 { _CrtMem* _tmpMem2;
 86 _tmpMem2 = _tmpMem->_pCrtNext;
 87  _tmpMem->_pCrtNext = _tmpMem2->_pCrtNext;
 88 free (_tmpMem2); }
 89 else
 90 NKDbgPrintfW (_T("%s(%i) : Warning : deletes memory pointer not allocated with new!/n"), _T(__FILE__), __LINE__);
 91 }
 92 free (pvMem);
 93 }
 94 }
 95
 96 garbageCollector::~garbageCollector ()
 97  { if (!_pCrtMemRoot) NKDbgPrintfW (_T("No memory leaks detected!/n"));
 98 else { _CrtMem* _tmpMem; NKDbgPrintfW (_T("Detected memory leaks!/nDumping objects ->/n"));
 99 for (_tmpMem = _pCrtMemRoot; _tmpMem; _tmpMem = _tmpMem->_pCrtNext)
100 {
101  NKDbgPrintfW (_T("%s(%i) : normal block at 0x%08X, %i bytes long/n Data <"), _tmpMem->_pCrtFileName->_pusCrtName, _tmpMem->_iCrtLine, _tmpMem->_pCrtMemAddr, _tmpMem->_uiCrtMemLen);
102
103 for (unsigned int i = 0; i < _tmpMem->_uiCrtMemLen; i++)
104 NKDbgPrintfW (_T("%c"), *(((char*)_tmpMem->_pCrtMemAddr)+i)); NKDbgPrintfW (_T(">/n"));
105  }
106 }
107 CrtFileName* _tmpName = _pCrtFileNameRoot;
108 for (;_tmpName;)
109 { _pCrtFileNameRoot = _tmpName->_pCrtNext; free(_tmpName->_pusCrtName); free(_tmpName); _tmpName = _pCrtFileNameRoot;
110 }
111 } #else
112 #define _CrtSetDbgFlag(ignore) #endif //DEBUG #endif //HEADER
时间: 2024-10-25 11:47:17

EVC内存检测的相关文章

Cocos2d-x开发---关于内存检测

这几天面试的时候,面试官都会问我在游戏开发过程中是如何应对内存检测的,如何监控程序是否有内存泄漏的问题.在开发的过程中也没有认真的注意过这个问题(当然不是说不去关注程序的内存泄漏问题,而是说并没有特意到去思考如何去监控),因为上家公司使用的是xcode开发工具,其自带了性能监控的工具,平时也就是用的这个,可能没太在意这些吧. 因为面试官问这个比较多,然后我感觉自己确实需要多注意注意程序开发过程中的一些基础性问题,所以把自己所知道的整理整理. Mac上: 使用xcode进行开发,当运行模拟器或者进

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

Android 内存泄露总结(附内存检测工具)

https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它

内存检测

TBOX的内存分配在调试模式下,可以检测支持内存泄露和越界,而且还能精确定位到出问题的那块内存具体分配位置,和函数调用堆栈. 内存泄露检测 内存泄露的检测必须在程序退出的前一刻,调用tb_exit()的时候,才会执行,如果有泄露,会有详细输出到终端上. tb_void_t tb_demo_leak() { tb_pointer_t data = tb_malloc0(10); } 输出: [tbox]: [error]: leak: 0x7f9d5b058908 at tb_static_fix

思科WLC4402内存检测故障

前几天用户打电话过来,说是重启WLC4402之后,https进不去了,于是让其通过console线接入看看,用户反应,系统在内存检测处停止下来,并提示内存检测错误. 后来用户让IT部的人把4402拿走,并打开,发现在4402里面就插了一根DDR一代的内存512M,费了一翻周折,找到一条DDR1代256M的内存换了上去,重新开机,发现启动正常,进去了!!! 但是高兴的事情总是不能够长久,后来客户反应,guest用户在认证时的页面调不出来,我远程检查了一下配置,确认所有的配置都正常,用户甚至连核心交

C/C++内存检测工具Valgrind

内存检测Valgrind简介 Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O'Reilly开源大奖的Julian Seward, 它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测, 我们可以使用它的工具:Memcheck.   Valgrind 安装 方法 1.  valgrind官网:http://valgrind.org下载 方法 2.  Ubuntu  sudo a

CPP内存检测

对C.C++的内存泄露.内存溢出等检查,经过这两天的查资料,总体来说可以使用Valgrind, AddressSanitizer, Dr.Memory等.其中Valgrind对程序运行速度影响较大,运行耗时10倍以上,如果是对Android Native代码进行检查,比较推荐对代码进行必要的修改,编译成可执行文件,在pc Linux系统上检测是否存在内存问题.Dr.Memory则比Valgrind的速度快,比较适合在Windows系统中使用.而对于Android上的使用,Google目前则大力推

Visual Leak Detector 2 2 3 Visual C++内存检测工具

Visual Leak Detector是一款免费的.健全的.开源的Visual C++内存泄露检测系统.相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈. 主页地址:http://vld.codeplex.com/ 旧版地址:http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio 下载Vis

android内存检测

/** * 开启线程检测软件可用内存情况,软件退出后, 调用System.exit(0)该线程才会停止 * * * @param sleep * 每隔一段时间检测内存 * @param standard * 内存超过多少比例报警 */ public static void memoryWatch(final int sleep, final int standard) { if (sleep <= 0) { Log.e(TAG, "memoryWatch, invalid sleep =