之前也看过别人写的一些单元测试框架,google的gtest算是比较有名的了,还有其它一些,基本实现都大同小异。总的来说,gtest显得有些重量级,另外的一些,测试用例不能分组,所有的用例只能一起运行,感觉不是很方便。周末的时候,折腾了一个相对比较轻量级的单元测试框架,命名为ZTest, 通过定义不同的测试类,可以支持对用例进行分组。下面从四个方面,对ZTest做一个介绍:
1. ZTest是什么?
ZTest是一个轻量级的c++程序单元测试框架
2. 如何获得ZTest?
可以从google code:http://xiao5geproject.googlecode.com/svn/trunk/ztest 处获得ZTest的源码。
3. 如何使用ZTest?
阅读全文…
好久没用UML的东东了,有点记不太清了,最近要用到了,做个简单的复习。UML中类之间的关系一直让人觉得很容易混淆的东东,这里记录一下今天复习的时候整理的笔记,希望对感兴趣的朋友有所帮助。
1. 关联
关联用来描述类与类之间的连接关系。关联一般是双向的,即关联的对象双方彼此都能与对方通信。换言之,如果两个类的对象之间存在可以互相通信的关系,或者说对象双方能够感知另一方,那么这两个类之间就存在着关联关系。
阅读全文…
本文是手把手教你玩转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即可 阅读全文…
在google code上建立了一个名为“小武哥的开源项目”的project, 地址是:http://code.google.com/p/xiao5geproject/(也可以用http://code.wuzesheng.com进行访问)
,
建立这个项目,基于以下几点考虑:
1. 给自己的代码找一个栖身之所,让自己的代码随时随地处于“可用”状态
2. 积累自己工作、学习中所写的一些相对比较独立的代码,形成自己的代码库
3. 把自己的代码分享出来,希望对需要的朋友有所帮助,少走一些弯路,少做一些重复的工作
4. 把自己的代码分享出来,希望感兴趣的朋友能够指点一二,让我能够把代码写得越来越好,大家共同进步 阅读全文…
写在前面:本文通过构建一个电影推荐系统,深入浅出的介绍推荐系统相关的概念、算法,让读者朋友能够在对推荐系统有比较全面的认识的基础之上,能够轻松地构建出自己的推荐系统。
1. 什么是推荐系统(Recommendation System)
推荐系统是指根据一个群体的偏好,来为群体中的成员提供推荐的系统。现实生活中这样的例子很多,比如豆瓣(Douban.com)读书中的“豆瓣猜”功能,它根据你看过的一些书和相关评价,与整个豆瓣社区其它会员看过的书与评价经过一系列的计算,就能给你推荐一些你没有读过的,但有可能感兴趣的书(如下图所示):
这是我读过的或者正在读的书:
阅读全文…
本文的主要内容是google protobuf中序列化数据时用到的编码规则,但是,介绍具体的编码规则之前,我觉得有必要先简单介绍一下google protobuf。因此,本文首先会介绍一些google protobuf相关的内容,让读者朋友对google protobuf有一个初步的印象,然后,再开始进入正题—-深入浅出地介绍google protobuf中用到的编码规则。下面言归正传,开始今天的话题。
1. Google-ProtoBuf是什么
ProtoBuf,全称是Protocol Buffers, 它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。谷歌自己内部很多程序之间的通信协议都用了ProtoBuf。
ProtoBuf可以支持多种编程语言,目前已经C++, Java和Python,本文中所前的内容用到例子的话,会以C++为例。
2.如何得到Google-ProtoBuf
ProtoBuf在Google Code上的主页是:http://code.google.com/p/protobuf/, 感兴趣的朋友可以在这里下载ProtoBuf的源码,也可以在这里阅读ProtoBuf的详细的文档。 阅读全文…
相信用GDB调试过程序的朋友都知道,C/C++程序在GDB调试状态是不能直接响应外部信号的。比如,你正在用GDB运行一个程序,然后,你按了Ctrl+C,GDB收到SIGINT信号,程序本身并不会收到这个信号。那么,倒底如何让GDB把信号传递给应用程序本身呢?且听我一一道来。
GDB中有一个handle命令,可以指定如何处理收到信号,GDB支持的对信号的处理主要有以下几种: 阅读全文…
今天给别人写的一个小脚本,用来对ip的字符串与整数形式进行相互转换,在这里分享一下,希望对用到的朋友有所帮助,因为程序本身比较简单,这里不多做解释,直接贴内容:

阅读全文…
写在前面:有缘人(Uyuanren.com)是基于UCHome进行二次开发的,因此开发之前对UCHome进行了比较深入的学习,今天这篇文章一方面是写给有缘人的技术人员,供内部学习使用,一方面也是把自己的学习所得给大家分享一下,让研究UCHome的朋友少走一些弯路。
一.整体架构
阅读全文…
最近调试程序学到的几个挺有用的函数,分享一下,希望对用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++程序中使用正则表达式时有点帮助,这将是我莫大的荣幸。 阅读全文…
近期评论