Archive for May, 2008

Vim tips for SVN

Tuesday, May 27th, 2008

function! SVN_diff()
let fn = expand(’%:p’)
vnew +setl\ ft=diff\ bt=nowrite
exe “:.!svn diff -r BASE ” . fn
unlet fn
endfunction

map ,v :call SVN_diff()

Paste above code in your ~/.vimrc, then you can use `,v‘ to display a diff in a vertical-split window.

程序随笔 - 5

Tuesday, May 27th, 2008

有个棘手的bug,昨天鼓捣了一天没搞定,而一向灵光的“睡眠大法”也没有让我在梦里得到答案。但早晨刚来时灵光乍现,很快便root-cause了,根本原因也是一个竞态,fix也不难。回头看看这个过程却挺有意思。

这个bug至今只能在物理机上重现,但是用strace,GDB或者valgrind跟踪时则一切OK,而且下次再跑的时候一切完全“康复”,让人觉得分外诡异。幸运的是,我刚开始就加入了backtrace功能,在segfault的时候能看见堆栈的call trace,而不至于一筹莫展、无从下手。

早晨又仔细观察了一下call trace,多看了两眼#10 frame之外的信息(以前我基本只看最近的十个frame),接着便是如醍醐灌顶般的顿悟。这个bug的难处在于重现的概率很低,现场很容易被破坏,并且日志和core dump都让人很困惑 — 再次诅咒一下多线程。

提交了补丁,顺手又fix了一个P3的bug,还剩下两个P4,感觉松了一口气。

程序随笔 - 4

Thursday, May 22nd, 2008

ESR在TAOUP的第七章讨论多道程序设计中需要避免的问题时,写下了这段话:

Threads — Threat or Menace?

“From a complexity-control point of view, threads are a bad substitute for lightweight processes with their own address spaces; the idea of threads is native to operating systems with expensive process-spawning and weak IPC facilities.”

读到这句话时是大学毕业,并没有深刻的感受。随着项目RC2阶段的结束,有些 bug也越来越隐秘,难以调试。调试多线程的网络程序让人体会到类似量子物理 里的“测不准原理” — 因为竞态都是时间相关的,在调试器下观察程序的行为 使得程序本身的行为发生了改变。

1. Bug #1984

耗费了我昨天一个下午和今天一个上午,也就是整整一天,还不算昨晚在家屁颠 屁颠调试到午夜的时间。我们的C, Java和Ruby的客户端API在调用两个XML-RPC 远程调用时都会莫名奇妙的发生问题:第一次调用是成功的,第二次会失败,并 且此后的调用都会失败。因为其它类似客户端API都工作的很好,因此我怀疑是服 务器代码的问题。

手工写了服务器端代码和一个简单的客户端,服务器端只提供这个出问题的调用, 客户端工作正常。而服务器端工作也非常正常,苦闷。怀疑是 libary 兼容性的 问题。

祭出“printf大法”,一切显示服务器端的数据都很正常,而C客户端的日志显示 处理一次HTTP-read的时候读到了一次EOF。于是跟踪了一晚所用library的源代码, 无果而终。

上午回到公司,在服务器端把所用怀疑的fooDoSomething()去除:
- ret = fooDoSomething();
+ ret = 0;

一切都工作正常。OK了,那一定是fooDoSomething()的bug了,后续的调试果然证 明了这个结论。但开始时该bug只在64位平台发生,而且如果打开debug后,错误 的行为会稍有一点小变化。我想这和编译器还有代码的内存布局有关。请相关同 事做了相关fix后,天下太平。

2. Bug #2034

这是一个race-condition,出自我的代码。问题在于代码完成后为了其它同事的 方便修改了一些接口。事实上如果我的代码不是那么小心,这个竞态反而更不易 出现。这暴露出多线程程序下,对数据读写需要异常小心。因为多线程环境下, 所有数据默认都是共享的。而因此需要的加锁解锁又使得程序性能下降,印证了 ESR的在TAOUP中的论断。但不幸的是,根据“墨菲法则”,RC2的代码刚好在一小 时前冻结,于是我的补丁要大佬们在例行会议时讨论通过才能提交到svn仓库。

3. Bug #2041

不再赘述。出于对C++的迷信以及些许over-skill,虽然也不是我的bug,但再次 证明了“Lessons from Debian/OpenSSL Fiasco”中的一句话:“Try not to write clever code. Try to write well-organized code.”

无题

Sunday, May 18th, 2008

这几天电视上都是地震的报道,画面催人泪下。各种来源的捐款剧也已积累成一个数额庞大的数字。但心里总有种说不出来的感觉 — 领导总是那么英明,我们的党也一只那么光辉,救灾的总是“最可爱的人”,最受悲痛绝望的从来都是老百姓。压抑着,直到在solidot上看见这句评论:“人们渴望被感动,渴望沉浸于悲情,渴望悲情被抚慰,渴望感受到力量,渴望民族主义,唯独没有给思考留下位置。”

灾难会再重演,悲伤会被遗忘,因为我们从来都缺乏痛定思痛的勇气。

天佑吾民

Tuesday, May 13th, 2008

前天下午,正在屁颠屁颠改代码的时候,突然听到左右说地震了。有的说西安,有的说北京,还有的说上海。接着,我们的QE在MSN上说北京site震感明显。开了个小会回来后,状态已经“away”,五点左右在家里爬上线说是强制疏散了。周围的电话开始频繁。MSN上收到朋友消息说成都地震了。对,我现在一直自诩是official的成都人。晚上短了老大和潇总,无回音,心开始往下沉。

昨晚。第一次上了天涯,看到多张图片。心里放心不下,又拨了电话。老大的电话始终无法接通,急。拨潇总,“喂?我还活着。”听到回音差不多只用了三秒。顿时如释重负,却不知所云。再次短了老大,过了会儿回复说没事。终于放下心来。

荀子说,“天行有常,不为尧存,不为桀亡。应之以治则吉,应之以乱则凶。”但愿天佑吾民。