关于C++ BUILDER6 我目前不知道有什么特别好的内存排查工具。尤其为了对付memory leak, (Eurekalog 这个工具内存泄漏主要针对delphi,BCB配置比较繁琐)。 除了BCB6 自带的Codeguard。codeguard 在90%的情况还是很给力的。

但是实际项目中codegurad却会因为各种各样的原因罢工。下面是记录codeguard 被修复的2个案例

  • 加载CG后,程序运行起来后报内存错误。

这个问题困扰了我很久,最后不得不关闭codeguard ,直到有一天,我下定决定把这个问题解决。我认为这不是BCB的问题,为什么呢,因为新建的任何工程CG工作都很正常。我当时的排查方式是这样的。用tdump 查看了exe 引用的库 (直觉告诉我的),结果发现了工程中引用了VCL50.bpl. 而我的工程是bcb6 构建的。

于是我找到了使用VCL50.BPL 的这个模块,是一个Lib ,引用的第三方的一个库。我砍掉了这个库。运行CG。REBUILD, 修复了。程序可以正常运行。而且能识别到内存泄漏。

  • CG加载成功,但是CG不能识别到内存泄漏。

这个问题比较怪异。程序能够正常的运行,也能够加载CG。但是,你在程序中故意引发一个内存泄漏,CG居然没有任何反应。我坚持认为不是BCB 的问题。理由还是,新建工程能正常的识别内存泄漏问题。我是这么排查的。

在winmain 函数入口处,引发内存泄漏,然后 直接return 0

 int WINAPI WinMain(....)
{
char* ch = new char[];
return ;
}

CG 识别出了内存泄漏。于是我判断,是执行了某一段代码之后,引发了CG 不能够正常工作。

于是,我不停的挪动 return 0 的位置。 直到找到CG不报内存泄漏的那个段代码。

int WINAPI winMain(.....)
{
char* ch = new char[]; 代码1 代码2 代码3 //<- 执行了代码3之后,CG就不报内存错误了。 return }

继续排查代码3中内部的问题。

最后定位到在代码中有一段非常退出进程的代码。导致了CG无法识别。用过一个简单的例子来模拟就是这样的。

新建一个工程,然后开启CG,拖一个按钮Button1,代码如下。

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop #include "Unit1.h"
#include "tlhelp32.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
char* ch = new char[];
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{ HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,GetCurrentProcessId());
TerminateProcess(hProcess,); }

你会发现,点了Button1 ,CG不会报任何内存泄漏。很好理解,这个动作相当于在进程管理器中杀进程了。CG自然不会报任何错误。

也就是说,如果你的CG 能正常编译,但不报错。那么检查一下,你的程序结束的时候,是从WinMain 正常return 的吗。

最新文章

  1. 【C#】菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类
  2. hibernate缓存机制(转)
  3. 个人纪录(初)----配置文件.properties的简单读取
  4. Ubuntu下deb包的安装方法 (zz)
  5. hdu 4050 2011北京赛区网络赛K 概率dp ***
  6. 更改QTP默认测试脚本路径
  7. 使用phpmaill发送邮件的例子
  8. 关于Android的onResume的2点体会(程序切换之后恢复状态)
  9. Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)
  10. ueditor 单独图片上传 转载
  11. Hive体系结构介绍
  12. PHP中文汉字验证码
  13. 从决策树学习谈到贝叶斯分类算法、EM、HMM
  14. JavaScript创建对象的模式
  15. csdn仍是&amp;quot;待定&amp;quot;对?
  16. PDF解决方案(4)--在线浏览
  17. 话说Angularjs的$resource模块
  18. java~springcloud微服务目录索引
  19. unity---背景循环滚动
  20. C# 8.0的三个值得关注的新特性

热门文章

  1. 在VMware上部署MOS(MirantisOpenStack-6.0)搭建全过程
  2. RestHighLevelClient 之 Scroll
  3. 使用 pycharm调试docker环境运行的Odoo
  4. 解决从github上下载代码仓库慢的问题
  5. CentOS7.1 VNC Server服务配置
  6. docker国内镜像加速
  7. java动态更新枚举类
  8. 运行servlet跳转页面变成了下载界面,或者中文乱码
  9. mysql-事务总结
  10. linux安装java jdk