使用_CrtSetBreakAlloc调试内存泄露
2015-11-12 23:30
246 查看
按: 在MSDN上发现了一段关于VC调试内存泄漏的文字, 试了一下, 觉得挺好. 好东西不敢独享. 拿出来给大伙儿瞧瞧. 怕您看着麻烦. 随便翻了一下. 翻的不好, 还请大伙儿海涵:)
如果您的确有兴趣, 又觉得翻的实在太烂, 可以查看原文或其连接.
arcoolgg,lieph@163.com
HOWTO: 使用 _crtBreakAlloc 调试内存泄漏
summary:
当使用 C-Runtime 调试跟踪内存泄漏时, 如果能在导致内存泄漏的地方设置一个断点. 将是很有帮助的. 在编译和运行时, 通过设置 _crtBreakAlloc, 能够在指定的内存分配的地方设置一个用户断点.
details:
当使用 VC 的调试器跟踪内存泄漏时, 它通常会在大括号中显示一个内存分配号( allocation number), 下面的例子就是在内存分配号 18 的地方出现内存泄漏.
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00660BE4, 10 bytes long
Data: < > CD CD CD CD CD CD CD CD CD CD
Object dump complete.
在导致内存泄漏的地方设置断点之后. 就能够通过调用栈(call stack)来查看是哪一个函数导致了内存泄漏. 调试函数 _CrtSetBreakAlloc 允许您在特定的内存分配号( allocation number)设置断点. 这种方式下, 每一次您都需要重新编译代码. 另一种更好的方式是使用
Watch 窗口, 动态的设置您要设置断点的内存分配号. 这样的话, 您就不用每次都修改代码, 编译程序了.
如果您的程序是静态链接到 C-Runtime, 您需要设置的变量是 _crtBreakAlloc; 如果是动态连接, 在 VC4.0/4.1, 则是 {,,msvcr40d.dll}*__p__crtBreakAlloc(), 在 VC 4.2 以后, 使用 {,,msvcrtd.dll}*__p__crtBreakAlloc().
如果不知道当前使用的 C-Runtime, 您可以这样来查看:
按 alt + F7, 在系统设置对话框中的 C/C++ 属性页, Category 中选 Code Generation. Use runtime library 中显示的就是您使用的 C-Runtime.
在开始调试程序的时候, 按 F11, 程序停在入口处, 在 Watch 窗口中输入 {,,msvcr40d.dll}*__p__crtBreakAlloc(), 应该可以看到它的值为 -1. 双击它, 输入您想设置断点的内存分配号. 如上例中的 18; F5 运行起来. 在内存泄漏的地方{18},
程序便会遇到断点. 这样, 您就可以调试了.
如果您的确有兴趣, 又觉得翻的实在太烂, 可以查看原文或其连接.
arcoolgg,lieph@163.com
HOWTO: 使用 _crtBreakAlloc 调试内存泄漏
summary:
当使用 C-Runtime 调试跟踪内存泄漏时, 如果能在导致内存泄漏的地方设置一个断点. 将是很有帮助的. 在编译和运行时, 通过设置 _crtBreakAlloc, 能够在指定的内存分配的地方设置一个用户断点.
details:
当使用 VC 的调试器跟踪内存泄漏时, 它通常会在大括号中显示一个内存分配号( allocation number), 下面的例子就是在内存分配号 18 的地方出现内存泄漏.
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00660BE4, 10 bytes long
Data: < > CD CD CD CD CD CD CD CD CD CD
Object dump complete.
在导致内存泄漏的地方设置断点之后. 就能够通过调用栈(call stack)来查看是哪一个函数导致了内存泄漏. 调试函数 _CrtSetBreakAlloc 允许您在特定的内存分配号( allocation number)设置断点. 这种方式下, 每一次您都需要重新编译代码. 另一种更好的方式是使用
Watch 窗口, 动态的设置您要设置断点的内存分配号. 这样的话, 您就不用每次都修改代码, 编译程序了.
如果您的程序是静态链接到 C-Runtime, 您需要设置的变量是 _crtBreakAlloc; 如果是动态连接, 在 VC4.0/4.1, 则是 {,,msvcr40d.dll}*__p__crtBreakAlloc(), 在 VC 4.2 以后, 使用 {,,msvcrtd.dll}*__p__crtBreakAlloc().
如果不知道当前使用的 C-Runtime, 您可以这样来查看:
按 alt + F7, 在系统设置对话框中的 C/C++ 属性页, Category 中选 Code Generation. Use runtime library 中显示的就是您使用的 C-Runtime.
在开始调试程序的时候, 按 F11, 程序停在入口处, 在 Watch 窗口中输入 {,,msvcr40d.dll}*__p__crtBreakAlloc(), 应该可以看到它的值为 -1. 双击它, 输入您想设置断点的内存分配号. 如上例中的 18; F5 运行起来. 在内存泄漏的地方{18},
程序便会遇到断点. 这样, 您就可以调试了.
相关文章推荐
- 项目冲刺第七天
- Java内存泄漏及分析
- Ubuntu14.04下安装Python2.7+Theano0.7+CUDA7.5
- 如何更好地限制一个UITextField的输入长度
- 机器学习算法:kNN(K-Nearest Neighbor)最邻近规则分类
- 在Ubuntu上安装有道词典
- Java发送邮件
- C指针初始化
- 小项目跟踪记录
- UI基础知识 -- 容器视图控制器
- 安卓App热补丁动态修复技术介绍
- Majority Element,Majority Element II
- asp.net下载文件几种方式
- mysql-proxy篇二
- java 的23种设计模式 之单身狗和隔壁老王的故事
- 11 编程指南_流数据
- 使用md编写文档
- linux下vi与vim编辑器的区别及使用方法
- 黑马程序员_JavaSE基础知识总结五:类与对象的区分及封装特性
- MVVM和MVC