关于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 的吗。

关于C++ Builder Codegurad 问题的排查。的更多相关文章

  1. oracle 非空闲等待事件排查

    想必大家都知道Oracle的等待时间分为两种,一种我们称之为“空闲等待事件”,另外一种称之为“非空闲等待事件”.“空闲等待事件”——作为DBA可以不用过分的关注这类等待事件.“非空闲等待事件”——当D ...

  2. 深入Spring Boot: 怎样排查 java.lang.ArrayStoreException

    java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.Array ...

  3. 深入Spring Boot:怎样排查 Cannot determine embedded database driver class for database type NONE

    ref:https://www.journaldev.com/13830/spring-boot-cannot-determine-embedded-database-driver-class-for ...

  4. Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 问题排查

    自定义的classLoader启动spring容器,遇到 Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not subtype ...

  5. 解Bug之路-记一次中间件导致的慢SQL排查过程

    解Bug之路-记一次中间件导致的慢SQL排查过程 前言 最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,正好博客也好久不更新了,就以此为素材写出了本篇文章 ...

  6. 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程

    起因 rhea项目有两个ut一直都是挂的,之前也经过几个同事排查过,但是都没有找到解决办法,慢慢的这个问题就搁置了.因为之前负责rhea项目的同事离职,我临时接手了这个项目,刚好最近来了一个新同事在做 ...

  7. 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!

    疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...

  8. FeignClient注解属性configuration不生效问题排查思路

    FeignClient注解属性configuration不生效问题排查思路 问题背景 我们知道,"如果需要自定义单个Feign配置,Feign的@Configuration 注解的类不能与@ ...

  9. 疯狂的类构造器Builder模式,链式调用

    疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...

随机推荐

  1. 最新 汽车之家java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.汽车之家等10家互联网公司的校招Offer,因为某些自身原因最终选择了汽车之家.6.7月主要是做系统复习.项目复盘.Leet ...

  2. kali PIN码破解

    airmon-ng start wlan0   //开启网卡airodump-ng wlan0mon    //监听模式,查找开启wps的apreaver -i wlan0mon -b [ap’s m ...

  3. 《你必须知道的495个C语言问题》读书笔记之第15-20章:浮点数、风格、杂项

    一.可变参数列表 1. Q:为什么调用printf前必须要包含<stdio.h>? A:为了把printf的正确原型说明引入作用域.例如,如果可变参数的调用比固定参数的调用效率低,编译器就 ...

  4. js唤醒手机APP

    if (navigator.userAgent.match(/android/i)) { // 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为 / ...

  5. c# base64及MD5工具类

    using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...

  6. 剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 2 思路和方法 (1)异或:除了有两个数字只出现了一次,其他数字都出现了两次.异或运算中,任 ...

  7. 使用JavaScript随机生成数字混合字母的验证码

      <script> // 封装一个随机生成数字的函数 function random(a, b) { var n = Math.round(Math.random() * (a - b) ...

  8. 第十章 MIZ702 ZYNQ制作UBOOT固化程序

    10.0难度系数★☆☆☆☆☆☆ 10.1是什么是固化 我们前几章将的程序都是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序.JTAG的方法是通过TCL脚本来初始化P ...

  9. 【转载】STM32 IAP 在线升级详解

      (扩展-IAP主要用于产品出厂后应用程序的更新作用,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后 ...

  10. glang flag

    package main import ( "flag" "fmt" "github.com/golang/glog" ) /* 解析 fl ...