之前也看过别人写的一些单元测试框架,google的gtest算是比较有名的了,还有其它一些,基本实现都大同小异。总的来说,gtest显得有些重量级,另外的一些,测试用例不能分组,所有的用例只能一起运行,感觉不是很方便。周末的时候,折腾了一个相对比较轻量级的单元测试框架,命名为ZTest, 通过定义不同的测试类,可以支持对用例进行分组。下面从四个方面,对ZTest做一个介绍:
1. ZTest是什么?
ZTest是一个轻量级的c++程序单元测试框架
2. 如何获得ZTest?
可以从google code:http://xiao5geproject.googlecode.com/svn/trunk/ztest 处获得ZTest的源码。
3. 如何使用ZTest?
阅读全文…
本文是手把手教你玩转GDB的第三篇,主要内容是介绍一些在程序调试过程中最常用的GDB命令,废话不多话,开始今天的正题。
1.attach process-id/detach
(1)attach process-id: 在GDB状态下,开始调试一个正在运行的进程,其进程ID为process-id
(2)detach: 停止调试当前正在调试有进程,与attach配对试用
2.kill
(1)基本功能:杀掉当前GDB正在调试的应用程序所对应的子进程
(2)如果想不退出GDB而对当前正在调试的应用程序重新编译、链接,可以在GDB中执行kill杀掉子进程,等编译、链接完后,再重新执行run,GDB便可加载新的可执行程序启动调试
3.多线程程序调试相关:
(1)thread threadno:切换当前线程到由threadno指定的线程
(2)info threads:查看GDB当前调试的程序的各个线程的相关信息
(3)thread apply [threadno] [all] args:对指定(或所有)的线程执行由args指定的命令
4.多进程程序调试相关(fork/vfork): 阅读全文…
本文是《手把手教你玩转GDB》系列的第二篇,主要内容是用GDB调试程序中比较常用到的断点(breakpoint)、监视点(watchpoint)和捕捉点(catchpoint)。虽然说这三类point的功能是不一样的,但它们的用法却极为相似。因此,本文将以断breakpoint为例,进行详细的介绍,关于watchpoint和catchpoint的介绍就相对比较粗略,相信读者朋友如果能够理解breakpoint的部分,那么便可以触类旁通,学会watchpoint和catchpoint的用法。
1. Breakpoint: 作用是让程序执行到某个特定的地方停止运行
(1)设置breakpoint:
a. break function: 在函数funtion入口处设置breakpoint
b. break +offset: 在程序当前停止的行向前offset行处设置breakpoint
c. break –offset: 在程序当前停止的行向衙offset行处设置breakpoint
d. break linenum: 在当前源文件的第linenum行处设置breakpoint
e. break filename:linenum: 在名为filename的源文件的第linenum行处设置breakpoint 阅读全文…
写在最前面:GDB是unix相关操作系统中C/C++程序开发必不可少的工具,它的功能之强大,是其它调试器所不能匹敌的。但是,现实的工作中,有很多开发者因为GDB本身入门门槛比较高,而被拒之门,与如此强大的失之交臂。笔者在近两年的C/C++开发工作中,对GDB本身的有一点研究,在这里总结出一系列《手把手教你玩转GDB》的文章,一方面权当是对自己经验的一个总结,一方面也是真的想能够对刚接触GDB的开发者朋友带去一些帮助,让更多的人来使用如此强大的工具。今天推出第一篇:
第一部分 牛刀小试:启动GDB开始调试
1. 启动GDB开始调试:
(1)gdb program ///最常用的用gdb启动程序,开始调试的方式
(2)gdb program core ///用gdb查看core dump文件,跟踪程序core的原因
(3)gdb program pid ///用gdb调试已经开始运行的程序,指定pid即可 阅读全文…
相信用GDB调试过程序的朋友都知道,C/C++程序在GDB调试状态是不能直接响应外部信号的。比如,你正在用GDB运行一个程序,然后,你按了Ctrl+C,GDB收到SIGINT信号,程序本身并不会收到这个信号。那么,倒底如何让GDB把信号传递给应用程序本身呢?且听我一一道来。
GDB中有一个handle命令,可以指定如何处理收到信号,GDB支持的对信号的处理主要有以下几种: 阅读全文…
最近调试程序学到的几个挺有用的函数,分享一下,希望对用C/C++的朋友有所帮助!
1. 调用栈系列
下面是函数原型:
1
2
3
4
| #include "execinfo .h"
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd); |
接下来,对上面三个函数进行介绍:
(1)backtrace用来获得当前程序的调用栈,把结果存在buffer中。通常,我们用gdb调试程序,设置合适的断点,停下来之后,用backtrace(bt)命令,就可以看到当前的调用栈。但是,有的时候,用到条件断点的时候,gdb的功能就没有程序本身的强大了,这个时候,可以考虑在程序中调用backtrace函数,来获取调用栈。
(2)backtrace_symbols把用backtrace获取的调用栈转换成字符串数组,以字符串数组的形式返回,使用者需要在外面释放返回的字符串数组所占用的内存
(3)backtrace_symbols_fd把用backtrace获取的调用栈信息写到fd所指定的文件中 阅读全文…
写在前面:本文是《深入浅出C/C++中的正则表达式库》系列的第三篇,本文的主要内容是介绍PCRE和PCRE++,因为它们两个是很有渊源的,所以放在一起讲。
1. 什么是PCRE? 什么是PCRE++?
PCRE,全称是Perl Compatible Regular Expressions。从名字我们可以看出PCRE库是与Perl中正则表达式相兼容的一个正则表达式库。PCRE是免费开源的库,它是由C语言实现的,这里是它的官方主页:http://www.pcre.org/,感兴趣的朋友可以在这里了解更多的内容。
要得到PCRE库,可以从这里下载:http://sourceforge.net/projects/pcre/files/
PCRE++是一个对PCRE库的C++封装,它提供了更加方便、易用的C++接口。这里是它的官方主页:http://www.daemon.de/PCRE,感兴趣的朋友可以在这里了解更多的内容。
要得到PCRE++库,可以从这里下载:http://www.daemon.de/PcreDownload 阅读全文…
写在前面:本文是《深入浅出C/C++中的正则表达式库》系列的第二篇,如果对本文感兴趣,相信你也会对《深入浅出C/C++中的正则表达式库——GNU Regex Library》感兴趣。本文主要介绍Boost中的正则表达式库,通过介绍其基本内容与相关接口,希望能够教读者朋友学会如何使用该库。
1. 什么是Boost.Regex?
Boost是C++中仅次于STL的一套库,它的功能比STL更加全面。这里是Boost的主页,想了解Boost的朋友可以看一下:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html。需要说明的一点是,Boost目前还不是C++标准库的一部分,因此如果要使用Boost中的库,需要自己安装一下。
Boost.Regex是Boost中的正则表达式库,它是由John Maddock提供的,它的全部文档在这里:http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html 阅读全文…
写在前面: 本文是面向有正则表达式基础的读者朋友的,如果你还不知道正则表达式是什么,请先到这里学习一下
:http://en.wikipedia.org/wiki/Regular_expression。
正则表达式(Regular Expressions),又被称为regex或regexp,是一种十分简便、灵活的文本处理工具。它可以用来精确地找出某文本中匹配某种指定规则的内容。在linux下,grep, sed, awk等工具都支持正则表达式,这些工具的存在,为我们日常的文本处理带来了极大的便利。但是,有时候,我们自己写的程序中也需要用到正则表达式来处理一些文本,这时候就需要一些正则表达式库的支持了。由于我本人是用C/C++做为主要开发语言的,所以,在本文以及接下来的几篇文章中,我将介绍几个常用的C/C++的正则表达式的库,通过我的介绍,以及对具体的使用进行举例,希望能够给读者朋友在C/C++程序中使用正则表达式时有点帮助,这将是我莫大的荣幸。 阅读全文…
C++中内存的动态分配与管理永远是一个让C++开发者头痛的问题,本文通过对C++中内存的动态分配释放的基本原理的介绍,让读者朋友能对C++中的内存的动态分配与释放有较为深入的理解,从而更好驾驭C++程序。
1. 函数(Function)
(1) operator new function
1
2
| void * ::operator new(size_t); //Global
void * class-name::operator new(size_t); //Class |
阅读全文…
今天在调试程序的过程中遇到的一个小问题,在这里记录一下,希望能对遇到同样问题的朋友有所帮助。 阅读全文…
一篇关于C++的很不错的文章,是C++作者Bjarne Stroustrup写的,值得一看。
为了保护作者著作权,这里不做转载,只是给出链接:
http://www.royaloo.com/bjarne/interviews/BS_Artima_1_2003.htm
本文是继上一篇文章之后的一点深入吧~~ 学了一些关于C/C++ CGI的相关知识,为了方便使用,所以做了这个封装,由于我也是刚刚开始玩CGI,所以写的过程中难免会有所疏漏,所以希望看到这篇文章的朋友,有什么好的建议,都可以在这里留言,我会一一回复大家的,谢谢! 阅读全文…
闲来没事,玩玩CGI,先搞清楚什么是CGI,下面是原文定义:
The Common Gateway Interface (CGI) is a standard for external gateway programs to interface with information servers, such as HTTP servers.
简单地来说,CGI就是一种用来和HTTP等信息服务器来交互的一种接口。
要进行CGI编程,需要配置一下Web服务器,这里以Apache2.2为例进行说明,关键有两个地方: 阅读全文…
近期评论