吉军 的个人资料truely,madly,deeply照片日志列表更多 ![]() | 帮助 |
|
3月21日 fix bug切身体会(二)写c++程序最头疼的莫过于看到程序崩溃的那个讨厌的对话框。如果应用程序发生了不可挽回的错误的时候,并且程序本身没有定义处理的方法的时候,Windows做的很干脆,就是让你的程序直接停掉,并且弹出一个对话框,告诉你程序发生了严重的错误,是否要发送给微软。如下图所示:
弹出这个对话框的原因是程序没有捕获操作系统内置的异常,比如访问异常,比如被零除等等。当发生这样一个异常的时候,操作系统会首先检查当前出问题的程序当中是否有debugger attach进来,如果有操作系统会首先通知debugger程序发生了异常,对于debugger来讲这就是first chance exception,如果debugger不予理会,操作系统会检查程序是否捕获了这个异常,如果捕获了则执行程序的异常处理的代码,如果程序没有捕获,操作系统会再次通知debugger,这对于debugger来说是second chance exception,如果这个时候debugger也不理会,windows就直接弹出图2-1所示的对话框。我做测试时候把操作系统中默认的调试器关掉了。把HKEY_LOCAL_MACHINE/SOFTWARE/Windows NT/CurrentVersion/AeDebug 下面的Auto置为0,否则如果设置了默认的Debugger的话就不会弹出图2-1的对话框,而是启动调试器来调试程序。这就是为什么装了VC之后,以后任何程序崩溃了,都会弹出VC来,让你debug。 还有一种异常是C++内部的异常,用throw抛出来的,如果程序没有捕获的话,程序也会崩溃,但是弹出的对话框会不一样。如下图所示:
如果给客户友好提示的话最好就是设定一个默认的未知异常处理函数。用这个API就可以了,SetUnhandledExceptionFilter(...)。如果想做一个更加专业的crash report的程序的话可以参考一下这篇文章:http://www.codeproject.com/KB/debug/XCrashReportPt1.aspx 。 可以说在实际变成过程中,C++程序当中90%的崩溃是内存访问异常造成的。英文叫做Access Violation ( 0xC0000005)。简称AV,此AV非彼AV。当发生了crash的时候首先要想到是否是AV造成的。如果有了crash reporter生成的dump,可以直接分析dump。所以建议打开华生医生去抓dump,因为华生医生是和同操作系统一起安装的,不需要额外的第三方工具。激活华生的方法是在命令行中输入c:\windows\system32\drwtsn32 -i。AV产生的最大的来源就是赋值给一个指针所指向的非法内存,或者访问已经释放了的动态内存。这就是为什么对内存以及指针的操作一定要小心,一定要养成好的习惯,比如分配动态内存之后,首先检查是分配否成功,成功之后要初始化,使完动态内存之后要释放等等。关于内存的事情以后会继续写。 3月20日 fix bug切身体会(一)我要在博客里把我工作中遇到的问题以及解决问题的方法记录下来,没准将来这是一笔宝贵的财富呢。
如果你也和我一样是一个c++程序员(确切地说我是vc程序员),相信你们也会遇到和我一样的烦恼。为什么程序那么容易就崩溃呢,为什么一不留神内存就泄漏了呢,为什么我想简单写几行代码打印一个向java那样的callstack都成了奢望了呢,为什么...,与其在这里问十万个为什么,不如多总结些经验,争取以后少犯类似的错误。c++本身没有问题,有问题的是程序员。你不能对着一头奶牛说,来,给我一杯奶,问题在牛还是在人呢?以上就是我打算写这些文章的最初想法。
工欲善其事,必先利其器。首先说一下我使的调试工具。我比较喜欢的一个windows平台下的一个调试工具是windbg。为什么我不用numega的soft-ice呢?首先windbg是微软鼎力打造的一款调试工具,血统正宗,功能异常强大,短小精悍,与微软的系统配合天衣无缝。而soft-ice有很多痼疾,装了soft-ice会让我的系统变得极不稳定,并且使用symbol也不是那么方便。当然soft-ice也有很多的优点,但是我更看重微软强大的技术支持。我甚至不确定numega什么时候或者已经停止了对soft-ice的开发和升级工作。所以就内核级别的调试器来说,我更倾向于windbg。我所debug的程序是自己的程序,既然自己有原代码,为什么不直接用visual studio的vc调试工具直接进行原码调试呢?这主要是因为某些场合vc的调式工具没办法介入,而windbg却能够很好的胜任那些工作。 可以说只要是vc调试工具能做的事情windbg都能做,而windbg能做的事情vc调试工具却不一定能做的了。简单列举几个vc调试工具不适用,windbg却适用的场合:
1,windbg可以调试内核,vc调试工具不可以,至少在我的机器上不可以,不知道微软自己用的可不可以。
2,在某些deploy的设备上没办法使用vc调试工具。最好的例子就是我们公司生产的嵌入式设备,性能有限的设备安装一个臃肿的vs是不现实的。而windbg这么轻量,跑在我们的xpe上完全没问题!当然如果抓了dump拿到develop的设备上用vc调试工具分析也可以,但是却没办法进行live debug。
3,有的时候拿不到原码。比如我们的程序就用到了adobe的flash.cox控件,这个控件在调用停止播放方法的时候,声音有时就会停在最后一桢,即使画面停止了,声音也一直以一个单调的monotone响下去,这对一个商业软件是绝对不能容忍的。可又没有flash的源代码,只能用windbg这样的工具跟下去了,如果配合IDA这样静态反汇编工具,效果会更好。这时vc的调试工具是心有余力不足阿。还有在微软ctc 调查和fix vista 兼容性bug的时候都是用windbug,因为没办法拿到vendor的源代码。
说了这么多,就是因为winbug有这么多的优点,它才会成为我的选择。
为了证明windbg的强大,这里先用windbg来解决我开头那么多为什么中的一个----为什么在c++中我想简单写几行代码打印一个向java那样的callstack都成了奢望了呢?有了windbg根本不用写代码就能搞定。当然我这里说的打印callstack不只是简单的用kb,kp等在livedebug的过程中去打印callstak,在程序运行的时候,在无人看守的时候,一样可以打出你想要得callstack,而且还可以保存到一个log文件里。怎么做呢,答案就是条件断点了。
只需要这么做就够了:
.logappend c:\1.log;
bp yourmodule!address "r $t0=@$t0+1; .echo; kb; .printf \"address hit: %d times\", $t0; .echo; g";
.logclose
到这里everything is done。既有callstack,也有指定的断点被执行了几次的消息,很简单吧。如果你还向在每次条件端点的时候看到一些自己的trace信息,你可以在代码里加入DbgPrint 或者 OutputDebugString输出一些自定义的消息到windbg。
我不想把我的文章写成一个windbg教程,我就是想记录我工作中的一些经验。当然在以后的文章中我也会尽量的描述windbg的用法。 3月13日 转一篇赢在中国最令我感动的选手的博文惜别“赢在中国”
12月19 日下午5时, 当我乘坐的飞机从首都机场起飞时, 我透过飞机的旋窗向下看着北京城——我出生的地方, 这块让我魂牵梦绕的土地, 我的眼睛模糊了………, 我不知道我什么时候会再踏上这块土地, 只想多看她几眼, 希望我将来有一天能够“衣锦还乡”的时候能为她做点事!
一路上, 我仔细思考了三位评委给我的点评, “建议我把专利卖给国内领军企业, 这样我可以专注我的学业, 在我擅长的领域继续发展” 。 其实, 我的专利只是一个概念和涉及多学科领域的开发技术, 不是一个产品或配方, 在每一个产品的开发过程中, 都还需要艰苦的攻关,调整和优化, 而且, 一些关键的技术, 中国还没有, 必须送回美国做, 也只有经过专业训练的人才可以正确使用它。等到产品开发出来, 我是会licensing , 但到那时, 卖给谁, 我已没有自主权, 比如, 现在在美国开发的抗感染的隐形眼镜, 在开发基金到位前, 我已和政府签署了法律协议, 如果成功了, 政府有绝对优先权claim 这个产品和开发技术, 如果政府没有claim , 这个产品只能卖给美国公司, 外国公司出再高的价格也不能卖, 这是法律, 人人必须遵守。
评委们担心我会因为创业而荒废学业, 建议我专注我的学业和科研领域。 其实, 我的学业就是生物材料和纳米工程学, 是一个应用学的领域, 我所从事的研发公司和我的学业不矛盾。研发公司, 说的通俗一点, 就是一个实验室, 从事高科技领域的研发和攻关, 我就是授权公司使用我的专利开发医疗产品。按照美国和国际专利法, 专利归个人所有, 专利所有人有权支配。我会一直从事研发公司的事业, 我不会成为一个传统意义上的商人,我既不会从事生产, 也不会从事销售, 在产品通过一期临床实验后, 我会选择一个可靠的企业, licensing 给他们, 因为每一个产品的后面都是一个鲜活的生命! 我也不会为了读书而读书, 而且, 美国的教育, 不仅仅是培养优秀的学生, 更侧重寻找和造就在各个领域里勇于探索和敢于创新的年轻人。从中学开始, 我大部分业余时间都是用在实验室里, 我感到, 她不但没有影响我的学业, 反而开阔了我的视野, 促进了我的思考能力, 提高了我的试验技能, 更激发了我的学习热情, 考大学时, 我一共报了6所美国名校, 5所大学都是以全额奖学金录取我了,在美国, 以全奖读大学本科, 尤其是读私立大学本科还是比较少的。 我选中霍普金斯大学, 因为我知道她有世界上一流的科学家, 一流的实验室, 在医学生物材料领域里的研究遥遥领先。
我完全能理解风险投资商对我的项目持有顾虑, 因为她周期很长, 从产品开发到完成动物实验要3-4年, 还要有3年的 1,2,3 期 临床实验, 而且, 回报慢,确实有风险。 然而, 任何一个新的东西都要经历从有风险到无风险, 这是从创造到制造必须经历的一个痛苦的过程, 没有办法避免的, 也是创造者和投资者都必须承受的巨大压力。在36进12现场,我清楚地陈述我会请2个我熟悉的专业科学家来中国,我曾想,如果能付他们和美国一样的工资,我再把属于我的股份分给他们一部分,是可以请动他们的,因为他们知道开发成功的可能性有多少,我还会请我的导师作为总顾问,一个在生物材料领域耕耘了30 多年,手持40多项专利, 国际著名的生物材料学家,我相信,有他的保驾和护航,项目的开发不会搁浅。其实, 当人们亲眼看到实验录象和数据, 就不会怀疑这个项目的可行性, 这就是为什麽她能在国际INTEL 科技大赛中从1500多个科技成果中荣获银牌奖,庞大的评审团中,坐有7个诺贝尔奖得主;在国际COLLEGIATE INVENTOR,她荣获金牌奖,评审委员会里也有2个诺贝尔奖得主,而且,评审是在非常公正的条件下进行的,我们霍普金斯大学的一位教授(评委)被剥夺了投票权,尽管我们并不认识;一位德国来的评委,因为认识我在霍普金斯大学的导师,也不能参加最后的投票。
我虽然放弃了“赢在中国”, 但我没有放弃我的项目。 全世界尿管的需求量每年是9千6百多万,10-50% 的短期尿管使用者(小于7天)发生感染,100%的长期尿管使用患者(大于28天)发生感染, 病人是苦不可言。在美国,治疗一个尿管引起的局部感染,平均需要568 美元,治疗一个尿管引起的菌血症, 需要2421美元, 治疗一个尿管引起的败血症,需要26473美元,患者死亡率高于对照组三倍以上,所以,开发抗感染的尿管是势在必行。我已经着手整理实验数据, 动笔写“抗感染的尿管和尿道支架GRANT”, 并将和我的导师们, 以及尿管发明人联手, 在美国和全球范围内寻找开发基金, 我也没有放弃在中国寻找开发基金, 如果可能, 我还是想在中国从事这个产品的开发, 我不想让她将来姓德国, 姓日本 ( 两大尿管出口国)….., 我希望她会姓中国, 这也是我这次回中国的主要目的。
我非常感谢“ 赢在中国”项目组的所有工作人员, 我能感受到您们对我的关心, 照顾和疼爱。我很喜欢这个栏目, 人无商不富, 国无商不强, 再过10 年, 50 年, 您们会看到您们曾经做了一件多么了不起的事; 我也很欣赏王力芬女士的点评: 每个人的尊严都和这个国家的强大有关, 在海外回味这句话, 真有一种刻骨铭心的感受。如果“赢在中国”能有政府扶持基金,并增加科学家评委审核科技项目,可能会给高科技,高风险,慢回报,长周期的项目提供可以生根,开花,结果的土壤。自从回美国后,我陆续接到一些留学生的电话,咨询有关“赢在中国”,也很关注我为什麽会弃权………。
为参加“ 赢在中国”, 我临时俜请了一位中文很好的秘书, 我所写的所有博文都是在他的翻译, polish 和讨论后定稿的。写到这里,我突然想说,虽然我的中文不好,可我找到了合适的人,我仍然可以把我的博克写的挺好,不是麽?所以,只要用心去做,没有什麽克服不了的困难,即使我不了解中国国情。我的中文水平是可以听, 可以说, 可以读, 但写不好, 这是我为什么没有给大家一一回复的原因。 中文,我写不了, 写英文, 我又怕您们感到不舒服, 但我博克里175 个留言, 我都一一读过了, 而且不止读一遍, 这175个留言和四进一现场41位观众的投票, 使我深深感动了, 我会永远珍惜在我最孤独, 最无助的时候你们给我的鼓励和支持, 她是我人生第一笔最宝贵的财富, 并会一直伴随我在路上, 我谢谢您们, 我不会让您们失望的!
2008年已经开始了, 我在大洋彼岸给大家拜个晚年, 遥祝所有真诚,善良的朋友们阖家欢乐, 事业有成, “好人一生平安”。 3月11日 (转)同感应在中国扬帆小妹的真诚偶在官网上浏览,看了36进12的第九场比赛,见到了平时少有镜头的扬帆的现场图片和她最终放弃比赛的过程,颇有感慨......作为年龄最小有科学家身份的海归创业精英扬帆参赛赢在中国一直备受人们的关注!扬帆这次回来参加比赛,深受大家的关爱和尊重!从我和她在北京晋级 36强短暂的几天接触中,她的腼腆特别是她的谦虚态度感动着每位选手,大家都亲切叫她小妹妹.由于长期在国外的原因,她的国语说得不好,很少见她和大伙酣畅交流.她可说是在比赛中唯一的一个"本色"参赛选手!作为一个科学工作者,求实和创新将是他毕生的信念!扬帆更不例外.当她不远万里来到赢在中国这个争奇斗艳的大秀场时,自已才方觉得那么陌生和不适!在美国崇拜务实的国度里,她已习惯了真实!在如此一个作秀的环境里她真的是感到不知所措!她与人无争,就是项目组安排她讲话她也显得比较勉强,与绝大多数鲜明表现自已的选手形成强烈反差!她最终在关键时刻弃权比赛,也许是她真正发现节目"秀"的成份太大,已不适合自已再继续走下去!在36进12的比赛里,选手们更是疯狂地伪装自已!对名利的追求尽显八仙过海!这一群"淘金"者,仿佛在经过无数次辛勤劳作后突然挖掘到一座硕大的"金矿",大家磨拳擦掌,正"虎视眈眈"瞪着快滴出血的鸡蛋眼,在起跑线上等待发号枪一声令下......强大的"阵势"面前,此时的扬帆似乎无动于衷,显得出奇的平静.犹如一个正玩耍的五六岁的小孩看着忙碌的大人们不停地奔波而感到好奇......扬帆率真,扬帆仆实,扬帆谦逊!她反复强调她的成绩是"站在巨人的肩膀上",可比赛中她辛酸的哭泣已证明成功的不易!特别值得一提的是同组扬帆旁边的胖哥张宗昕对小妹突如其来的哭泣深感不知所措和不安,老张无奈又憨态可鞠的形像定格在画面上......其实,扬帆的真诚已感动了包括老张在内及在场的所有人,感动了赢在中国成千上万的观众!在"名""利"面前,扬帆小妹似乎"看破红尘",明白唯"务实"才是她的根本!因此突然放弃了有望晋级的机会, 重新回到现实的真我中去.为商之道,"术"短矣,"道"长矣!小妹之所为,令我震撼......3月2日 我的饭碗很久没有写网志了,我不知道写网志这种东西是不是不成熟的一种表现,自古文人多伤情阿。在不知不觉中,我的2007就已经过去了。2007年是我人生当中过得最快的一年,快得我还没来得及细细的品位,感觉每天都是在复制粘贴,丝毫没有新意。一些零零散散的记忆就是我2007的全部了,天津大学跳舞的女孩,五月的一封拒信,QZ,五道口,北师大,雨中的北郊医院,7月28日,丢掉电影票,中日友好医院,大兴,《集结号》,就这些了,就连烤鱼也都是2008的事了。我年轻的生命就又这样的过去了一年,难道我们不应该在我们最美好的时光去作出一些有激情的,无愧于我们青春的事吗。如果我们再不把握,真的就快30了,自己确实已经不小了。想想现在的生活真的是很没劲,工作就像一个很重的饭碗,我每天把它抱在手里,因为很重,我不能把手腾出来去做些别的事情,而饭碗每天又能提供给我吃的,让我不至于饿死,可是饭碗总也填不满,总是无法满足我的胃口,现在我面临的选择就是要不要扔掉这样一个饭碗。这的确是一件很难抉择的事,虽然每天举着饭碗很烦,但饭碗不会让我饿死,更不会把我撑死。扔掉饭碗的后果有两个,一个就是再去捡一个稍微大一点儿的饭碗,还有就是以后都再也不需要饭碗了。有一期赢在中国让我感慨挺多,一个叫做文亨利的美国人,沃顿商学院的高材生,放弃了100多万的年薪,原因很简单,就是自己不想要那样的一种生活。我觉得这种人才是真性情,真洒脱。不是每个人都有那种魄力,换成是我,我肯定不会那么做,所以人和人是有差别的,这也就是为什么有马云,史玉柱这种人,但为什么更多的是我们这种碌碌无为的人。我在想我到底要过什么样的一种生活,为了买房,买车而生活是不是生活的太累,那样的过真的有意义吗?等我发现我有房有车的时候,我可能都不懂得什么叫生活了。哎,管它呢,那样的过,肯定不叫生活,只能算作活着。也许,哪天我会把饭碗当成铁饼给飞了。hoho。 |
|
|