前言

项目组要求给已有的几十个VC工程添加配套的UT工程,需要覆盖到每个类(即每个CPP都要有对应的TEST)。简单观察了一下,还是选用add existing item to project添加.cpp.h的方法最为简单。

人肉创建

验证此方法是否可行

  1. 把某工程的vcxproj及filter拷贝到UT目录
  2. 替换掉vcxproj里的CIinclude, resourceInclude的路径为相对路径
  3. additional path加入gtest和gmock的头文件及lib
  4. def也要改成相对路径
  5. additional Include path 要加上原有工程的路径
  6. application type 改为 exe
  7. link-system-subsystem改为console
  8. gtest gmock的runtime lib都改为/mdd
阅读全文 »

VLD简介

Visual Leak Detector is a free, robust, open-source memory leak detection system for Visual C++.

windows下VC常用开源内存泄露检测工具,代码在codeplex

原理

代码中include了vld.h,在开始运行时构建一个VisualLeakDetector g_vld的全局变量,接管申请内存和释放内存的操作。
此后会记录每次申请内存,并将地址及call stack存到一个set;
释放内存时会删除set中与之相匹配的内存申请记录。
在程序结束时,vld会遍历此set,如果set不为空,说明有内存泄露,会将泄露地址及call stack输出到report中。

阅读全文 »

UT

单元测试是代码的第一道防线,尽量将问题在前期暴露出来,发现越早,解决的成本就越低。

所以,作为码农,必须掌握单元测试的方法,并将UT集成到本地构建及CI服务器上,这样无论是新开发,还是维护重构等等,都能对我们的改动进行检测,及时反馈。

以前用过JUnit和CppUnit,已不太适合当前开发。很多同僚都推荐gtest,我自然不能错过。

阅读全文 »

前言

工作是在windows下开发,业余时间才能玩自己喜欢的东东,一段时间不用就会生疏。随便写两段,加深记忆。

GCC

从代码到可执行文件,会经历四个阶段,对应的命令是

gcc -E test.c -o test.i 中间文件
gcc -S test.i -o test.s ASM
gcc -c test.s -o test.o OBJ
gcc test.o -o test 可执行文件

阅读全文 »

背景

项目组出现过比较有意思的情况:在同一台持续集成服务器,从同一个SVN上取指定版本的代码进行打包,但生成的两个版本有差异,即有DLL不相同导致运行结果不正确。经过定位,推测可能是update代码的过程中出现了异常,没有获取到期望的代码。
因此,CI工程师需要一种方法能够对DLL,EXE等二进制文件进行比对,以验证其正确性。但是即使用普通二进制比较工具(BeyondCompare)进行比较,发现总是有几个字节不相同。于是向我求助。

过程

我曾看过windows的PE文件结构,依稀记得里边会有几个字节存放TimeStamp和CheckSum,所以会有这么几个字节的差异。为避免误人子弟,特找来微软的定义看看:

1
2
3
4
5
typedef struct _IMAGE_NT_HEADERS {  
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
阅读全文 »