关于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. elasticsearch基本概念理解+elasticsearch 的shards unassigned处理方法 -- 最佳运维实践 - 集群规划

    1.es与MySQL的概念对比 2.概念理解 2.1 Index : 一个索引即是文档的集合 2.2 Document : 一个文档即是一个可被索引的基础单元信息,一条记录: 2.3 Replicas ...

  2. webpack4实例

    webpack现在已经成为前端很多的打包器.网上关于webpack的相关文章也是很多,本文主要是根据自己的学习步骤来记录的,进行简单的webpack实例的讲解. 注意:一定要确定安装的node.js的 ...

  3. Sed命令的使用详细解释

    Sed命令的使用详细解释 一:sed命令的简介 sed是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处 ...

  4. Java集合框架——Set接口

    第三阶段 JAVA常见对象的学习 集合框架--Set接口 List集合的特点是有序的,可重复的,是不是存在这一种无序,且能保证元素唯一的集合呢?(HashSet )这就涉及到我们今天所要讲的Set集合 ...

  5. SpringBoot 项目如何在tomcat容器中运行

    一. SpringBoot内嵌容器的部署方式 SpringBoot内部默认提供内嵌的tomcat容器,所以可以直接打成jar包,丢到服务器上的任何一个目录,然后在当前目录下执行java -jar de ...

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

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

  7. docker-compose搭建elasticsearch+kibana环境,以及php使用elasticsearch

    一.elasticsearch的Dockerfile 增加中文搜索插件analysis-ik FROM docker.elastic.co/elasticsearch/elasticsearch:7. ...

  8. 列表推导:python2和python3中作用域的问题

    python2中: x = 'my love' dummy = [x for x in 'ABC'] print x 此时x打印为:'C' python3中: x = 'my love' dummy ...

  9. 5.Linux常用排查命令

    可以使用一下命令查使用内存最多的10个线程     ps aux | sort -k4nr | head -n 10   可以使用一下命令查使用CPU最多的10个线程     ps aux | sor ...

  10. Redis 使用指南:深度解析 info 命令

    Redis 是一个使用  ANSI C 编写的开源.基于内存.可选持久性的键值对存储数据库,被广泛应用于大型电商网站.视频网站和游戏应用等场景,能够有效减少数据库磁盘 IO, 提高数据查询效率,减轻管 ...