|
用户名:QuanYu 笔名:QuanYu 地区: 行业:高中 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
C++异常相关
未捕获的异常调用terminate
抛出不在异常规范的异常,调用unexpected,而unexpected的默认行为是terminate
越界错误bug一例
最近写一个服务器程序,这程序在我之前已经完成了多半,我在这个基础上继续工作,其中结构可以概括为一个类叫做manager,另外一个类叫做dedup。
manager负责管理资源,并且在完成具体工作的时候,把资源交给dedup。其中涉及到一段缓冲区,以及一个std::map<std::string, seedItem>类型的对象(seedItem类型在后面描述),这个缓冲区根据需要动态分配,但是其中的分配方法是ralloc(这次这个程序是典型c/c++混合风格)。
这个程序多数情况能够顺利运行,但在处理某些输入的时候会像deal loop一样,cpu占用极高。最初怀疑是程序某处有deal lock,后来通过一个测试用例发现是出现在
item = it->second;
这样的语句附近。
其中item的类型如:
struct seedItem {
std::sring home;
std::string uri;
std::string flag;
};
it的类型是std::map<std::string, seedItem>::iterator.
经过分析,发现在该测试用例情况下,it->second被修改(这个map构造完成以后不会再修改,仅仅作查询),发现it->second.home,it->second.uri的size非常大,当进行
item = it->second;操作的时候,是真的在尝试复制一个很大的string,可能core,也可能耗尽虚拟内存。
后来检查了动态分配需求,改为固定大小缓冲区。解决了这个问题。
缓冲区溢出太可怕了,在接受c风格代码时更应该仔细,教训教训!
GNU工程构造
gcc选项
-Weffc++ 这个选项很有趣,说的是要检查Effective C++中描述的风格要求,cool,我的工程除了一堆warning,慢慢改吧。
-fpic 看到老卢写的makefile里面有这个东西,不懂,赶紧查了gcc manual,e 文如下:
Generate position-independent code (PIC) suitable for use in a shared library,
if supported for the target machine. Such code accesses all constant addressesthrough a global offset table (GOT). The dynamic loader resolves the GOT
entries when the program starts (the dynamic loader is not part of GCC; it
is part of the operating system). If the GOT size for the linked executable
exceeds a machine-specific maximum size, you get an error message from the
linker indicating that ‘-fpic’ does not work; in that case, recompile with ‘-fPIC’
instead. (These maximums are 8k on the SPARC and 32k on the m68k and
RS/6000. The 386 has no such limit.)
Position-independent code requires special support, and therefore works only on
certain machines. For the 386, GCC supports PIC for System V but not for the
Sun 386i. Code generated for the IBM RS/6000 is always position-independent.
GDB调试core文件
这件事情对于高手来说应该很熟悉,我以前虽然也看core输出,但是不得要领,最近因为工作原因,必须从core中了解更多的信息,学习了一下通过core来debug。总结如下:
假定core时我感兴趣的函数是
bool foo(const string& arg1, const string& arg2);
可执行程序是叫做bin(通常core文件就叫做bin.core),使用下面命令
1.gdb ./bin ./bin.core
2.使用bt命令看frames,假定在n
3.使用frame n调整frame
4.这个时候可以p任何argument或者local variable
调试p string这样的对象的值,可能由于过长,可以p string 的私有成员,如果p arg1.dat,这样可以通过p arg1.dat+100这样进行偏移。
这样获得了这些数据以后,我们可以将这些数据取出来,构造core的条件,单步跟踪,今天我就用这样的方法找到了一个bug。
stl阅读
1.basic_string::operator[]和at方法的最主要区别是operator[]不会进行range检查,行为和数组一样,at方法则要检查,越界会call _M_throw_out_of_range(),事实上就是抛出out_of_range异常。
2.basic_string::find函数使用alogrithm中的find
3.标准的连续容器包括vector, string deque。非标准的rope也是连续容器。
4. 用container.empty()而不是0 == container.size()是因为empty对所有的容器的实现是常量,而size对于一些list地实现则不是。
5.所有的标准STL容器都缺少虚析构函数
6.VS 2003是支持COAPs的,测试语句vector
7.std::remove算法说的是删除一个区间内值为特定值的元素,并且不改动剩下元素的顺序(稳定排序),删除结束以后,指向一个ForwardIterator ,这个东西指向因为删除了这些特定值的元素后的新的range的尾巴。
8.对数时间,线性时间
9.list和所有的标准关联容器都没有使用默认的分配器,这是因为分配器不能满足如list所需,通常,list
10.当需要一个指向vector内部数据的指针时绝不该使用begin
log4cplus在freebsd上运行感觉
CORE DUMP
这两天在Y FreeBSD上面上开发服务器程序,不停的改CORE,郁闷啊。
容器:list string使用的经历
目前开发一个服务器程序,开发环境YBSD 4.11 gcc 2.95.4,遇到这样一些问题:
1.抛字符串出问题
throw string("This is for tes");
我去看了gcc bugs,的确说到了类似问题、,但是他的环境以及gcc版本不一样。
这个问题需要进一步确认。
2.一个类如:
class A{
string f1;
string f2;
string f3;
};
然后放到list
list<A> hits_;
我发现在list<A>类型析构的时候,出core。
打球第二次大胜康康
Boost使用的编译系统
介绍:
Boost使用的编译系统叫做Boost.Jam(Bjam),是一个基于FTJam的构造工具,而FTJam又基于Perforce Jam
细节:
Jam是make(1)(如果你使用UNIX就知道make(1)是什么,在这里简单说明,make(1)是指系统工具类中,名叫make的东西)的一个替代品,Jam的目标是让构造简单的东西更加容易,而让构造复杂的东西变得简单。下面是一个例子:
Main smail : main.c map.c resolve.c deliver.c misc.c parser.y alias.c pw.c headers.c scanner.l getpath.c str.c ;Smail从一打文件进行构造.Jam自动管理依赖的头文件.
Jam非常易于移植:它能在UNIX,VMS,Mac和NT平台上.多数Jamfiles在上述平台上本身就是可移植的.
Jam is unintrusive: it is small, it has negligible CPU overhead, and it doesn't create any of its own funny files (c.f. Odin, nmake, SunOS make).
Jam can build large projects spread across many directories in one pass, without recursing, tracking the relationships among all files. Jam can do this with multiple, concurrent processes.
Jam isn't under the blinkin GNU copyright, so you can incorporate it into commercial products.
构造Boost.Jam
构造好了Bjam以后,要安装它只需要将生成的执行文件拷贝到PATH变量指定的某个路径下就可以了。各个平台都有相应平台的初始构造脚本用来构造可执行程序。这些脚本都接收一个可选参数,用来编译构造的工具集的名称。如果没有给工具集参数没有给,或做可用工具集的检测,并选用一个。构造脚本接受的参数如:
<build script name> [toolset]无参数的运行脚本可能是最好的选择。
Boost发布的Boost.Jam的源代码在BOOST_ROOT/tools/build/jam_src.
如果脚本检测适当的工具集失败可能是因为你的工具集不能自动检测。在这些情况下,你需要在脚本参数那里指定工具集,当然这假定工具集在PATH中可以找到.注意:编译Boost.Jam的工具集和构造Boost的工具集是独立的。
第一章
第一章:松软泥土
第一节
今天我起了个大早,天气很好。
三个多月以来,我已经慢慢的习惯了这里的生活。刚到的一段时间,我觉得这里太阴郁,一阵一阵的细雨,天空也是阴沉沉的。我似乎都开始怀疑是不是来错了地方;不过,很快我就发现了这里的好处;气候很湿润,雨水来的勤,所以空气很干净,路面微微的润湿,走在上面软软的。人在这种环境呆着,变得很轻松,时间好像变得缓慢。我常常躺在椅子上,看着周围的景物,一动不动的呆上漫长的两三个小时。
就这样,我用眼睛慢慢的认识了这个小山村。四面环山,有条河流穿行于其间,山峰低矮而平缓,半山腰雾气缭绕,远望去,像是白色丝带,山上长满了树,因为气候温湿,即便在冬天,你也看不到光秃秃的树丫;在山腰上就有住家,房子大都是普通的三间房屋,有木结构的也有砖木结构的房子,屋顶上都顶着暗灰色的瓦;也有些人家盖着两层小楼房,看起来很不协调;相对说来,我更喜欢木结构的房屋,原木经过简单的处理,用作柱子,暗黄色的木板镶嵌而成房屋的墙壁,简单,实用,住起来也很舒适。
山坡和山脚下都是田地,山坡上的天地是梯田,据说是土改的时候才有的;山脚下的地被一些小路划分成一小块一小块的正方形,因为土地很少,人口比较多,所以常常一个小正方形属于几户人家共同所有。
我住的这个地方,是在山的延伸部分,地势已经平坦,当初到这个地方之前,我和一个朋友许万平说我想去一个小山村休息一段时间,他眼睛也没有眨就回答我:“我晓得一个地方,保你满意。”“那一家人现在都不在山上住了,全家都搬到县城来了,原来的老房子就空出来了,嫌山上的家具难看,都没有要。”“你给他们点钱,住一年都没有问题。”
许万平问我为什么要离开繁华的城市而要去山村,对于这个问题,我感到很难回答,这时他家来了客人,我起身准备告别,他说:“明天就给你办好,到时候我送你上山。”
我们驱车上山,许万平说:“山上有些人很有钱,就搬出来了,这几年我每年都要上山去打枪,人都熟得很。”他递给我一盒骄子,然后接着说:“我也是山上长大的,以前山上穷得很,我考起高中以后,就不回山上了。”说到这里,他似乎想起了什么心事,不再说话。
我抽了一口烟,向车窗外望去,那时是初春的时节,公路两旁是空旷的田地,远处能看见低矮的山体;慢慢的道路变得越来越窄,车子就行进在刚才看见的山的脚下,道路的另一边是一条河,开始的时候河床几乎只比路面低几米,慢慢的河床和路面之间的落差变得越来越大,到了最后,我从车窗外看去,觉得有点儿惊心动魄了,“有点吓人哈,其实莫得事,路宽得很。”我笑着和他点头,心里却希望他什么话也不说,一心一意的开车,他这时倒似乎来了谈兴,说起几年前这里的一出车祸,“一辆公交车,闷闷得挤了四十多个人,就是从那,”他一只手扶着方向盘,一只手指着远处一个斜坡,“直接就冲下去了,一个活的都莫得。”我开始想象那场惨烈的车祸,想象尸横遍野,不,真正悲惨的应该是那种瞬间的尖叫和绝望,血水一定染红了河水。
我望向远处,不让自己的思绪跟随亡去的魂灵,河床上一线浅浅清澈的河水,灰白的石头大大小小,诚然,若不是刚才听到一个惨烈的故事,抑或不是我顺着许万平的思路去猜想故事的细节,这真是一幕宁静的画面。
汽车拐过一个弯,河床突然从我的视线中消失了,随着汽车爬上一个很急的坡,地势突然开阔,放眼望去,这真是一个完整的世界,房屋、土地、地里干活的人,“前面是一个镇,有一万多人呢,我们要去的地方就是那个小镇的河对面。”
我原本希望要去的目的地是一个更加偏僻的地方,不知道是不是许万平看出了我的想法,他朝我笑了笑,我们的车没花多长的时间,便穿过了小镇,汽车过了两座桥,不到两分钟,便在一家人门口停了下来,这家人盖了两层小楼,大门是用铁管焊接起来;我们的车还没有停稳,就听见院子里的狗叫得厉害。
这时铁门咕的一声打开了,走出一个中年男人,看上去约摸有三十七八岁,脸很宽有些黑,穿着一件灰色的西服,西服里面罩着一件纯毛的浅灰色毛衣,一条蓝色的裤子,他冲着我们的车喊:“许哥,好久没有来啦,稀客稀客!”徐万平拿出烟,递给那个中年男人,“这回要麻烦你了。”“哪里哪里,这就是你们说的韩哥哇,快请快请。”他连拉带扯的把我往院子里带,我注意到,有个小孩子站在铁门边上看着我。
这个叫许万平为许哥的人姓张,当他笑起来的时候,嘴巴里露出被烟草熏黄的牙齿,他早已准备好了酒菜,酒菜就摆在他家院子里的石凳子上,我随意的在他家院子里转了转,许万平就说来来来喝酒。
就这样,我安顿了下来。
第二节
夜幕低垂时分,我坐在门口的木凳子上,喝上一杯浓茶,不远处的山峰渐渐隐没,近处的树木,在微风的吹拂下,能依稀辨别;风在院子的上空游走,我似乎听到了低沉的叹息,院子里那棵四季常青的柚子树,轻轻的摆动叶子,淅淅沙沙的,在这初春,空气里蛰伏着那种奇怪的感觉,在人们没有察觉的那一刻,在人们睡去的那一刻,从隐秘的河床,缓缓升起,轻推人家的窗户,在屋顶小憩片刻。
第三节
这里的人把春天的时间划分得很长,雨水在夜里毫无声息地落在大地上,人们常常冒着毛毛细雨在田间干上一段时间,在我院子门前地里锄地的那个中年男人大声对我说:“过段时间,野物就肥了。”我想起了打枪的事,堂屋的一角挂着一支老猎枪,我把他取出来,枪很完好,除了枪管和枪托的结合处有些轻微的锈迹,还闻得到枪油的气味。
我拿着枪,走到空旷处,拉上撞针,朝着天空,扣动扳机,砰的一声,炮台口冒着烟,枪的后坐力挺强,是把好枪。
第四节
我常常想起,小时候常常要我们写作文,当时觉得写作文最初最要紧的工作就是模仿,其实模仿别人不太难,如果你作文不是你反感的对象,所以就有了很多日出模拟版本,然而有些文章却是很难模仿的。我现在依稀记得小学一年级有课文“秋天来了,一行大雁往南飞,一会儿排成人字形,一会儿排成一字形”。这种文字因为简单直接明了,所以模仿的空间就很小,只有当记忆已经败坏成了季度不完整,这时去尝试回忆这些简单的文字的时候,或许才真正的开始了一些成功的模仿。模仿的本质在于——和你的生命结合,记忆已经腐败,记忆的汁液渗透到了骨髓。
第五节
在一个城市发生的一些故事,如果切换背景,比如发生在北京的一些故事,如果搬到成都去,就会觉得很奇怪。人和事捆绑了在一起,我们假设要想在城市之间迁移,就会发现有一种撕裂的感觉,当然如果不是在现实的生活中经历,这种经历也许会成为一种美好的经历;比如在梦中或者纯粹的是白日梦。
赵洁常处于这两种状态之间,她会弄不清楚事情发生的场景或者时间,这些事情本来是个人的问题,然而如果因为某种原因成为和其他人交流的一个过程或者内容,便会带来出人意料的结果。
第六节
他一直在困惑中,寻找主题,寻找价值,寻找他认为有意义的事情。这么些年,他努力了很多次,然后又放弃了很多次。或者这就是意义所在,有时候他会这样想。他常常在夜里思考如何去避免单调、肤浅。他相信他的生命存在的理由就是写作,为了能够写出伟大的作品他的一切都要服从这个命运。
然而伟大的作品是需要伟大的主题的,每一天的生活,他都费力的沉思。我这样说他费力的沉思,并不意味着他的沉思不货真价实,我们常常有一种错误地认识,总认为哲学家的沉思才能够格叫做沉思;沉思的身段其实并不高。
因为长时间的冥思苦想,他显得比他的年龄大一些,话越来越少。然而客观的事实是,每当在人潮拥挤的时候,他内心深处的言语能力却更加清晰的表达出来,望着无数的潜在听众,心中得伟大演讲便在内心深处拉开帷幕;由于某些细微的干扰,会暂时打断他的这种自我陶醉的状态,就像吃草的羊群偶尔回头观望。
或许我们可以回过头去看看,也许正是在地铁或者在拥挤的公交车上,这种无语的环境激发了他言说的愿望?或者是掩盖了他无语的真实状况!似乎每个人都臆想着自己拥有一个舞台,虽然登上舞台的人对着黑压压的观众也许内心的失望更胜于表达的兴奋,然而人却无视不刻的渴望被关注。这种渴望的表达方式也许各不相同,言说、演讲是一种方式,沉默无语是另一种方式。
言说、演讲这种方式包括用泪水、用欢笑、用手舞足蹈来表达的愿望。他使用语言,他用笑容……,然而当他发现这些活动对于他自己的命运而言毫无意义,他便放弃了这种正向维度的努力,而才用另一种方式,只有在哪些特殊的时刻,两种状态产生了某种交融,这些时刻意味着人山人海。
第七节
我认为他失去了一种能力,琐碎的能力。
第八节
几年前,她还是一个小姑娘。在他的房间里,他紧紧的拥抱着她,像是抱着一个孩子,可能就是从那个时刻起,他试图阻止他们之间裂缝的产生,也许在那之前,他们紧紧贴在一起,从来没有分开过。
“我好像早就认识你。”就是这句话,劈开了他们水乳交融的状态,把容纳他们的完美的,一体的,漂浮着尘埃的时空划分开来,夜里手电筒光为黑夜打开了一个隧道,让他们彼此看见了在这个一体的世界之外,还有各自从不属于彼此的世界。
赵洁什么也没有说,她轻轻的吻着他浅红的嘴唇,脑海里面想象这是清晨带露水的玫瑰花瓣,这场景很能打动她,清晨充满阳光,夜里得寒气清除了昨日的混乱和肮脏。而她,充满活力的参与这个积极的世界。
他再次用力的搂紧,因为长时间的用力,他感觉到胳膊肌肉的疲劳,在持续用力和再次用力之间有一个可以估量但却不明显的休息。他曾经在书上读过,女人喜欢被紧紧拥抱的感觉,通过这种方式,男人可以让女人放松她们的警惕。然而,这么长时间的拥抱,对他来说有些疲惫了,他想坐下,想随意的和她坐在一起,他心里开始预期被释放的胳膊。
忽然赵洁抓住了他的双手,他感觉像被牵引一样,然后因为紧绷后的释放,他的手臂觉得轻微的疼痛。
第九节
这天下午,他们在他那小小的房间里度过了一个带魔幻色彩的下午,虽然在这之间,理智常常穿插,比如寻找安全套,比如赵洁对男人性高潮的轻微恶心。
他很高兴,他这个很小但很整洁的房间,有一扇窗户,下午的阳光透过窗外的树叶,明媚而且清爽,他的意义此刻没有在他身边,他的灵魂此刻在一个女人的呼吸声中,他得到了休息,他想他爱着赵洁,所有关于他们的一切,会凝结成伟大的作品,为什么以前从来没有想过这个问题呢?他要寻找的不是语言、不是故事、命案或者枪杀,或是别的什么,他要寻找的不过是一个女人,一个女人的垂青。
一个好玩的eclipse插件名字
GIEF(Google is Eclipse’s friend)
Python+Eclipse
1.我在eclipse中选择菜单Help—Software Updates—Find And Install
选择Search for new features to install,选择New Remote Site,输入相关信息。把http://pydev.sf.net/updates/作为URL,我将要安装的版本是0.9.8.5.按照文档的说法,如果先前安装了0.9.6,需要先删除,这意味着如果未来升级也可能要删除,那么按照links方式安装这个插件也许更好,结果按照eclipse的指示,果然发现了他会要求你指定安装的位置,赶紧建立了一个目录C:\plugin\PyDev-0.9.8.5-features,将插件安装到这里。
2.然后在links目录中添加了PythonEclipseFeature.link文件,文件的内容是
path=C:/plugin/PyDev-0.9.8.5-features
在path指定的目录中存放了pydev相应的目录结构。
3.对其他软件包的需求
· Eclipse 3.1Eclipse 3.1(the SDK is required)
· Python 2.3.x or 2.4.x
· Java 1.4 or higher
4.下载中途出了几次错误,后来又发现我的eclipse居然是3.0.2(赶紧下载了一个3.1.1)
5.然后发现只能在Window-Preferences菜单当中找到pyDev的踪迹,赶紧阅读帮助文件。
6.初步印象,PyDev不会在File-New-Project中出现一个如Python工程的选项。直接创建后缀为py的文件就可以了,我直接编写了一个HelloWorld.py,然后在Window-Preferences修改Pydev的选项,设置Interpreter-Python以后就可以在Run中选择按照Python运行了。
综上,eclipse下面编写Python的准备工作已经完成了。