关于C++ Builder Codegurad 问题的排查。
关于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 问题的排查。的更多相关文章
- oracle 非空闲等待事件排查
想必大家都知道Oracle的等待时间分为两种,一种我们称之为“空闲等待事件”,另外一种称之为“非空闲等待事件”.“空闲等待事件”——作为DBA可以不用过分的关注这类等待事件.“非空闲等待事件”——当D ...
- 深入Spring Boot: 怎样排查 java.lang.ArrayStoreException
java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.Array ...
- 深入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 ...
- Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 问题排查
自定义的classLoader启动spring容器,遇到 Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not subtype ...
- 解Bug之路-记一次中间件导致的慢SQL排查过程
解Bug之路-记一次中间件导致的慢SQL排查过程 前言 最近发现线上出现一个奇葩的问题,这问题让笔者定位了好长时间,期间排查问题的过程还是挺有意思的,正好博客也好久不更新了,就以此为素材写出了本篇文章 ...
- 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
起因 rhea项目有两个ut一直都是挂的,之前也经过几个同事排查过,但是都没有找到解决办法,慢慢的这个问题就搁置了.因为之前负责rhea项目的同事离职,我临时接手了这个项目,刚好最近来了一个新同事在做 ...
- 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!
疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...
- FeignClient注解属性configuration不生效问题排查思路
FeignClient注解属性configuration不生效问题排查思路 问题背景 我们知道,"如果需要自定义单个Feign配置,Feign的@Configuration 注解的类不能与@ ...
- 疯狂的类构造器Builder模式,链式调用
疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...
随机推荐
- Centos6.5搭建方法
# VSFTP # ## ###安装 vsftp yum install vsftpd* -y ###启动服务 /etc/init.d/vsftpd restart ###配置 ...
- python字典中添加项
body_daily_close = { "mappings": { "properties": { "trade_date": { &qu ...
- TensorFlow.资料
1.ZC:看来 要用 TensorFlow,基本逃不过 Python了... TensorFlow物体识别——通过机器学习搭建属于自己的物体识别库 - 迷途无归的博客 - CSDN博客.html(h ...
- 拯救你丢失的精度——BigInteger和BigDecimal类(入门)
第三阶段 JAVA常见对象的学习 BigInteger和BigDecimal类 BigInteger类 (一) 构造方法: //针对超过整数范围的运算(整数最大值:2147483647) BigInt ...
- 在springMVC框架中集成quartz作业调度器
1.首先需要导入这几个jar包,如下图: 其中log4j,quartz,slf4j-api,slf4j-log4j12我是在项目中都引用了 2.引用完jar包后,新建一个作业调度类,执行作业调度逻辑, ...
- 研究旧项目, 常用 sql 语句
1. select all table select TABLE_NAME from CodingSystem.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = ...
- SpringBoot下实现MongoDB字段类型转换器
1 目的 MongoDB Java String LocalDateTime 2 实现 先定义实体类 @Data // lombok @Accessors(chain = true) @Documen ...
- Idea+Maven部署打包JavaFX项目遇到的坑
用Idea写了一个JavaFX项目,创建artifacts,build artifacts,运行build出来的exe可执行文件时总是遇到 class not found的错误,如下图 一开始根据提示 ...
- Python 序列操作符与函数(字符串)
Python序列包括:元组.列表.字符串. 1.1 序列共同支持的函数: 函数 功能 说明 cmp(seq1,seq2) 比较序列大小 从左到右依次比较,直到比较出大小 len(seq1) 获取序列长 ...
- TypeScript入门六:TypeScript的泛型
泛型函数 泛型类 一.泛型函数 在泛型函数之前,先简单的描述一下泛型,将变量定义成泛型可以在使用变量时来决定它的类型.什么意思呢?假如现在有一个函数,可能出现参数和返回值出现多种情况的现象,只有在调用 ...