您的位置:首页 > 其它

使用_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},
程序便会遇到断点. 这样, 您就可以调试了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: