日志记录了正式执行测试之前的整个工作过程(以失败经验为主),其中包括:测试方案的制定,方案的可执行性验证,以及方案执行失败后的修改与完善。此次工作为“性能测试”范畴,这个方向也是我的技术短板之一。坦白的讲,以我个人的能力几乎不能做到,之所以解决方案能够通过,在此主要感谢开发同事的全力支持和帮助。
一、初识Toad
任务刚被分配,项目组提交的测试需求为“针对底层sql 语句”执行性能测试。随即向开发人员咨询,被告知Oracle自带工具可以执行sql语句的性能分析及优化功能。但是,因为要执行并发测试,显然这个工具无法满足测试需要。随后又有同事提出使用Toad可以实现直接测试数据库中的sql语句,恰好老李那有这个工具(盗版),要过来安装、破解,通知开发人员提供测试用的sql代码。各种百度,谷歌,开始了Taod的钻研之旅。
虽然在技术帖中搜到的相关功能的介绍,但是始终无法在我的软件环境中找到此功能。直到第二个工作日才弄明白,原来Toad在8.5版本之后将所有功能整合,并通过KEY来区别不同功能,因为这个软件是按功能来收费的 ......
如何交换两个变量的值:
C语言中的传值代码如下:
int change(int x,int y)
{
int temp=x;
x=y;
y=temp;
}
C语言中的传址代码如下:
int change(int *p,int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}
使用C++中的引用类型代码如下:
int change(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
JAVA中代码同上;
上述代码共同点是都是使用的额外变量temp;如何不使用额外变量完成两个数的交换呢?
int change(int x,int y)
{
x=x+y;
y=x-y;
x=x-y;
}
例如:x=3,y=4
第一步:x=x+y=3+4=7;
第二步:y=x-y=7-4=3;
第三步: x=x-y=7-3=4;
如粗完成了连个数的交换,并且每有使用额外的空间. ......
如何交换两个变量的值:
C语言中的传值代码如下:
int change(int x,int y)
{
int temp=x;
x=y;
y=temp;
}
C语言中的传址代码如下:
int change(int *p,int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}
使用C++中的引用类型代码如下:
int change(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
JAVA中代码同上;
上述代码共同点是都是使用的额外变量temp;如何不使用额外变量完成两个数的交换呢?
int change(int x,int y)
{
x=x+y;
y=x-y;
x=x-y;
}
例如:x=3,y=4
第一步:x=x+y=3+4=7;
第二步:y=x-y=7-4=3;
第三步: x=x-y=7-3=4;
如粗完成了连个数的交换,并且每有使用额外的空间. ......
如何交换两个变量的值:
C语言中的传值代码如下:
int change(int x,int y)
{
int temp=x;
x=y;
y=temp;
}
C语言中的传址代码如下:
int change(int *p,int *q)
{
int temp=*p;
*p=*q;
*q=temp;
}
使用C++中的引用类型代码如下:
int change(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
JAVA中代码同上;
上述代码共同点是都是使用的额外变量temp;如何不使用额外变量完成两个数的交换呢?
int change(int x,int y)
{
x=x+y;
y=x-y;
x=x-y;
}
例如:x=3,y=4
第一步:x=x+y=3+4=7;
第二步:y=x-y=7-4=3;
第三步: x=x-y=7-3=4;
如粗完成了连个数的交换,并且每有使用额外的空间. ......
一. 概述
内存泄漏一直是软件开发人员最头大的问题之一,尤其像C/C++这样自由度非常大的编程语言,几乎是每一个用其开发出来的软件都会出现内存泄漏的情况。
如果没有内存泄漏,世界或许会变的美好。然而,完全美好的世界是不存在的,我们能做的就是尽量让它变的更美好。
二. 工具介绍
纵观目前市面上有不少内存泄漏工具,在这里就不多做介绍。笔者最常用的是IBM公司出产的IBM Rational Purify,说起Purify这东西,稳定性虽然不怎么样,但功能很强大。它是IBM Rational PurifyPlus产品组中三剑客的一员。
Purify是面向C/C++, VB, Java语言,测试内存错误,Windows API访问错误,COM方法调用情况等。
图1. Purify主界面
Purify对于C/C++的分析支持源代码级,或通过其专利技术:“目标代码插入(Object Code Insertion)”工作在无源代码级。Purify的功能其实非常之强大,此次我们只讨论怎么通过Purify进行C/C++下的内存泄漏发现。在介绍它的工作流程前,我们来认识一下几个缩写术语的意思:
l ABR: Array Bounds Read,数组越界读
l ......
一. 概述
内存泄漏一直是软件开发人员最头大的问题之一,尤其像C/C++这样自由度非常大的编程语言,几乎是每一个用其开发出来的软件都会出现内存泄漏的情况。
如果没有内存泄漏,世界或许会变的美好。然而,完全美好的世界是不存在的,我们能做的就是尽量让它变的更美好。
二. 工具介绍
纵观目前市面上有不少内存泄漏工具,在这里就不多做介绍。笔者最常用的是IBM公司出产的IBM Rational Purify,说起Purify这东西,稳定性虽然不怎么样,但功能很强大。它是IBM Rational PurifyPlus产品组中三剑客的一员。
Purify是面向C/C++, VB, Java语言,测试内存错误,Windows API访问错误,COM方法调用情况等。
图1. Purify主界面
Purify对于C/C++的分析支持源代码级,或通过其专利技术:“目标代码插入(Object Code Insertion)”工作在无源代码级。Purify的功能其实非常之强大,此次我们只讨论怎么通过Purify进行C/C++下的内存泄漏发现。在介绍它的工作流程前,我们来认识一下几个缩写术语的意思:
l ABR: Array Bounds Read,数组越界读
l ......
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。
内存泄漏的定义
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringfrom( ......
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如Smart Pointer,Garbage Collection等。Smart Pointer技术比较成熟,STL中已经包含支持Smart Pointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;Garbage Collection技术在Java中已经比较成熟,但是在c/c++领域的发展并不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。
内存泄漏的定义
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:
void MyFunction(int nSize)
{
char* p= new char[nSize];
if( !GetStringfrom( ......
#include <iostream>
using namespace std;
void main()
{
char *p,*q;
p = "abcde";
q = p + 3;
*q = 't';
cout<<p<<endl;
cout<<q<<endl;
}
两种语言编译都可以通过
当执行到
*q = 't';
时,C++程序出现内存访问错误,C程序可以运行,并且把第四个内存单元置换为t
C++编译器在编译过程中,给"abcde"分配了常量区的内存单元,常量区的内存单元在运行时无法修改,因此试图对常量区的操作会产生异常。
......
#include <iostream>
using namespace std;
void main()
{
char *p,*q;
p = "abcde";
q = p + 3;
*q = 't';
cout<<p<<endl;
cout<<q<<endl;
}
两种语言编译都可以通过
当执行到
*q = 't';
时,C++程序出现内存访问错误,C程序可以运行,并且把第四个内存单元置换为t
C++编译器在编译过程中,给"abcde"分配了常量区的内存单元,常量区的内存单元在运行时无法修改,因此试图对常量区的操作会产生异常。
......
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C。
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。
C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。
毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。
因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。
2、学习C的过程中,一定要理解结构化编程思维。
为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。
这是现代工程化开发的核心和灵魂。
因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp ......
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C。
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。
C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。
毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。
因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。
2、学习C的过程中,一定要理解结构化编程思维。
为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。
这是现代工程化开发的核心和灵魂。
因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp ......