Henrylgz的Blog

学习,生活,思考,一切都在继续。
posts - 35, comments - 156, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年2月25日

没 权 :) - hBifTs - 园

使 Win32 . 写 目 饧? 一 . 一 EXE 一 ASP.NET ,之 要 萁 . 1, 使 .NET Remoting ...
www.cnblogs.com/hbifts/archive/2004/07/05/21537.aspx - 42k - -

之 (一) - awei 学习 始 - 园

(Mapping File) Windows械 要一 也 潜 ... 实 堑亩 Windows 私 要 驯 叩 牡 写 ...
www.cnblogs.com/micrographics/archive/2006/04/24/383972.html - 35k - -

在本站搜索内容一直是非常好的学习方法,但是前两天突然发现搜索的结果出现了乱码。
不知道其他朋友是否也有这样的问题。
我在搜索结果页面看了页面编码,是简体中文。没有变化。

posted @ 2008-02-25 16:41 追求卓越 阅读(152) | 评论 (4)编辑

2008年1月14日

北京阿博泰克北大青鸟信息技术有限公司(简称“北大青鸟APTECH”)是北京大学青鸟集团与印度阿博泰克公司(APTECH)合资组建的专业IT职业教育公司。公司服务于国内IT职业教育领域,致力于为中国IT产业培养技能型紧缺实用人才,2002年至2005年,连续4年占据中国IT职业教育领域第一品牌和第一市场占有率,累计培养IT人才20万人次。
  北大青鸟APTECH(南京泰思特)BTEST授权培训中心诚招热爱教育事业,有志投身职业教育,愿成为中国IT行业发展引导者的IT精英。
  几百家国内外知名IT企业和北大青鸟BTEST(南京泰思特)授权培训中心建立牢固合作伙伴关系。BTEST课程是北大青鸟在面访了100多家国内外软件企业软件测试岗位、分析了20多家国内外职业教育机构的课程体系、对国内主要人才招聘媒体最近1年招聘数据深入分析的基础上,由中国、印度、美国三国专家共同开发完成。加盟北大青鸟成为IT培训讲师,您首先可以得到国际一流的IT培训机构全方位的专业化训练,又可以有机会站在讲台上为后学者“传道、授业、解惑”,成为倍受IT青年追捧的业界精英,其中的成就感远非其他行业能够比拟。
  与此同时,南京泰思特的业务在IT培训和软件测试外包两个领域不断开拓,快速发展,将为踌躇满志的您提供天高任鸟飞、海阔凭鱼越的发展机会!
  如果您厌卷了终日面对电脑的单调日子,渴望在新的领域偿试一下,请选择加盟我们的大家庭,我们承诺为您提供:有吸引力的薪酬计划+完善的福利制度+有成就感的职业平台+实现共同价值的企业文化。


一、高级软件测试/开发培训讲师

(一)基本要求
1、计算机及相关专业本科以上学历,三年以上IT行业工作经验,有计算机培训授课工作经验者优先。
2、表达能力好,逻辑思维能力强,富于爱心和责任心。
(二)以下A、B两类技术熟悉一类即可。
A类
1、精通软件测试流程、测试技术、测试方法及软件质量评价方法。
2、熟悉计算机原理及PC机软硬件知识,熟悉网络基础知识及TCP/IP协议,熟悉WINDOWS操作系统管理。
3、掌握任何一种编程语言或脚本语言。
4、了解软件工程和软件质量管理体系。
B类
1、掌握C、C++、JAVA、C#中任何一种编程语言。
2、熟悉WINDOWS或UNIX/LINUX操作系统原理。
3、掌握SQL语言,了解中大型数据库系统的管理和配置。
4、了解J2EE或.net架构,了解一种中间件产品的管理和配置。
5、了解白盒测试技术或单元测试技术.
(三)薪金:年薪8-12万。

有意向者请标明应征职位并将简历投至zp@js-btesting.com,或给本人留言,我们会在一周内与您联系。

posted @ 2008-01-14 11:38 追求卓越 阅读(332) | 评论 (7)编辑

2008年1月8日

    2007年过去了,效仿园里的兄弟们也做一下总结.实际上所在公司也是要写这样的总结和计划的.相对于公司要求的总结和计划,这里写的是全方位的.特此留念吧.
    
    2007年最大的事情就是转职--由程序员转职为......老师......准确地说是培训机构的讲师.从开发的一线退下来了.源于06年末的一次跳槽,现在在培训机构做讲师.工作已经一年,之前比较忐忑不安,不知道能否胜任这份工作.到现在,应该说是已经平安地转换了角色,转职成功.
    
    转职带来的好处是职业生涯的延长,现在起码不用考虑30岁之后做什么了.不好的地方是再回去做程序的话,就比较困难了.不过也不打算再作回去了.以现在国内的管理水平,程序员还是水深火热的,苦海无涯,回头是岸....
    
    转职带来的还有很多知识的完善,授课,交流水平的提高,这是我之前所缺乏的.现在可以对着人侃侃而谈,不会紧张了,个人觉得十分欣慰.
    
    生活上有喜有忧,母亲病故,新生命也即将诞生,感慨万千阿.

    08年工作上的计划就是对自己的完善和提高.争取在公司中确立更重要的位置.呵呵.
    
    自己的一些计划,想让自己不要扔下开发,同时对测试,管理能够有更加深入的研究,准备把之前3个没有做完的小软件补充完整,做好他们,以一种企业应用的要求来做.这样对工作也是一种促进.
    
    生活上面对我的小孩,我会担负起父亲的责任,让他(她)--很遗憾,还不知道性别,虽然还有一个月就出来了--快乐的成长.同时更好的照顾家庭.不让工作挤占太多的家庭上的时间.

    尽量不写成流水账,还是这个样子,惭愧惭愧,呵呵.

posted @ 2008-01-08 15:58 追求卓越 阅读(389) | 评论 (6)编辑

2007年12月17日

这是一次意外,本来我有着优秀的笔记本使用习惯,在使用的时候,以笔记本为中心,以胳膊为半径的圆之内,不能有任何液体存在.但是上周六,当我喝了一口咖啡,把咖啡杯放到危险区域之外后,突然鼻子一痒,打了个喷嚏,后果可想而知(觉得恶心的,请见谅)...

当时心里一凉,马上用纸把水擦干,由于不是很多,所以没有关机,但是还是和预期的一样,键盘的一些键开始失灵,之前已经看到不少先例了,结果就是换键盘.

打电话给神舟客服(我的笔记本是神舟的),告知周末库房没人,没货换,顺便说,换键盘要300人民币.由于下午要做讲座,所以求助于珠江路,去了之后还是没货,于是郁闷的回到公司,再开机,勉强能用,于是做讲座...

这又是一次意外:做完讲座,再看,键盘已经好了.都按了一遍,真得好了!省钱了!
和同事谈论此事,最终的结论:干了.

运气好的时候,这样的意外都是喜事结局,嘿嘿.

posted @ 2007-12-17 17:11 追求卓越 阅读(157) | 评论 (3)编辑

2007年10月29日

     摘要: 现代企业化的开发过程中,项目管理已经不是是否需要的问题,而是怎么开展的问题。这就面临着一个向左走和向右走的问题:是偏重于规范化,还是偏重于国情化?本文倾向于规范化。  阅读全文

posted @ 2007-10-29 11:16 追求卓越 阅读(1219) | 评论 (7)编辑

2007年10月11日

     摘要: Vista中的一个IE7补丁会导致绝大部分网页无法访问!(KB939653)  阅读全文

posted @ 2007-10-11 08:38 追求卓越 阅读(1375) | 评论 (15)编辑

2007年5月10日

我使用的是VSS6.0d,在域控制器上安装了服务器端之后,想使用域用户进行登录操作,而不是再在VSS中添加用户,
请问如何实现,谢谢!

posted @ 2007-05-10 13:00 追求卓越 阅读(216) | 评论 (3)编辑

2007年1月17日

     摘要: 一本垃圾的技术书籍,最大的帮助就是让你浪费了时间而且还把知识学得一团浆糊。  阅读全文

posted @ 2007-01-17 09:47 追求卓越 阅读(727) | 评论 (6)编辑

2006年12月7日

     摘要: 本文介绍使用Install Shield对应用程序打包的初级应用,包括打包操作中基本的文件包含,组件分析,多语言版本的解决方法,驱动的安装方法等应用。  阅读全文

posted @ 2006-12-07 15:22 追求卓越 阅读(2060) | 评论 (6)编辑

2006年11月23日

Just test.

posted @ 2006-11-23 09:41 追求卓越 阅读(45) | 评论 (0)编辑

2006年9月1日

详情请见:http://www.msdnwebcast.com.cn/

听到有博客园的名字了,呵呵。同喜!

posted @ 2006-09-01 14:27 追求卓越 阅读(115) | 评论 (0)编辑

2006年8月29日

申请个电脑还要大头头签字,直接把离职的同事的电脑转给我不就好了?把负责人改成我不就好了?搞得那么形式干吗?

离职的同事提前一个月提出辞职的,再说是上研究生,也走完了离职流程,不但没有这个月的工钱,而且听说还要赔偿公司钱,真是恐怖,公司按照哪条法律要赔偿的?

上半年绩效考核,上半年辛辛苦苦弄一个上位机,其中的故事不说也罢,到头来,头头评语:欠缺工作主动性和团结协作,评价结果是称职。好,好得很。怪不得又有两个同事走了呢。

posted @ 2006-08-29 18:06 追求卓越 阅读(262) | 评论 (2)编辑

2006年8月28日

婚礼不办了,婚宴还是要请的,我就是愿意让朋友们来一起吃饭交流一下,但是又不喜欢演戏一样的婚礼。而且还不喜欢规规矩矩的圆桌吃饭,所以想弄点特别的,问了很多家,大致定在湖滨金陵饭店了,具体还要仔细计算一下。

该死的电信!
周末去办宽带的续费,被告知:没有包年,只有包时和包月。
包月的费用居然150每月,我记得这可是3年前的价格,
过去两年的降价白降了,又涨回去了。
真的是没天理了!

posted @ 2006-08-28 08:56 追求卓越 阅读(256) | 评论 (5)编辑

2006年8月25日

天有不测风云,不过老天也许想不到,天上的日子也不好过,冥王星被老三身上的寄生虫们投票,给踢出了家门,郁闷阿,本来就一颗冰冷的心,这下彻底凉透了。。

程序改来改去,源自需求改来改去。
现在佩服微软,怎么调得众口的。。。。

男篮红了一把,立马主教练就上天了。
真有点担心如果输了的话,是不是就地换人了,呵呵
不过还是为男篮高兴,毕竟他们没有像男足那样,
抽出亚洲一次,就NB得不得了了。

首届Vista VS ChessGenius 国际象棋比赛落下帷幕。
双方对弈78手最后均剩一王而和。ChessGenius为黑棋,稍优。

双方介绍:
Vista:我的操作系统里面的Chess游戏。
ChessGenius:智能手机里面的Chess游戏。
我:中间人,通过我,让这两个游戏对弈。

垫场赛中,双方难度均为1,结果ChessGenius获胜。
正赛中,双方难度均为最高9,结果ChessGenius在领先4兵的巨大优势下,反而弈和,令人惊讶不已。

据小道消息:本场比赛的盘口在正赛开始之前,有大量资金压双方弈和,让人浮想联翩。

posted @ 2006-08-25 17:02 追求卓越 阅读(110) | 评论 (0)编辑

2006年7月19日

完整事实 聊天记录
http://distancesoft.com/msnlog.txt

相关链接。
VC/MFC版接私活受骗,说好6000,最后却说500,清华紫光该如何面对?

程序员接活儿被骗(紫光谭经理事件),甲方接受CSDN电话采访——CSDN外包实践(44)

程序员受骗实录全公开,CSDN采访(乙方)并点评——CSDN外包实践(45)

大家正在接活和将要接活的,千万要警惕啊!
维护自己的权利!坚决不向垃圾低头!

posted @ 2006-07-19 14:53 追求卓越 阅读(419) | 评论 (4)编辑

2006年7月15日

世界杯结束了,余音不绝。

但是有个事情不吐不快,齐达内头撞马特拉奇,成了比夺冠还要受关注的事情。

网上几乎众口一词为齐达内鸣不平,甚至说要剥夺意大利的冠军。

可笑之极!

难道就因为齐达内要退役了,他的暴力行为就是无辜的了?
球场上的骂人哪场比赛没有?为什么发生在意大利,发生在马特拉奇身上就被这么放大了?
为什么托蒂在欧洲杯上的口水禁赛,没人去问他的对手当时骂了他什么?
齐达内在球场上脾气火爆早有先例,98年故意踩沙特队员导致禁赛,还有人记得吗?

很多人还都沉睡在过去对意大利的理解上吧,不论看了还是没看比赛的,都说意大利踢得丑陋。
可观的说,意大利本届世界杯的表现绝对不是一味的防守反击,绝对配得上冠军。
对意大利的恶意诋毁,恐怕多半是因为自己喜欢的球队出局而对冠军的挑剔吧。

说意大利假摔,表演的,请去看看葡萄牙的C罗吧,他的表演天分已经超过了他的球技。。
他的确是个天才球员,有着巨星的潜质,但是现在似乎太功利了,没有把心放在球技上。

说意大利暴力,野蛮的,请去看看荷兰和葡萄牙的红黄大战吧。。。全世界都在谴责海庭加,
他把全体职业球员遵循的不成文规定抛在脑后,结果让双方球员失控。
当然意大利的德罗西的肘击也是一个严重的事件,在我看来是世界杯的一大污点。。

说意大利踢法丑陋,场面难看还能赢球的,去看看五星巴西的表现吧。
巴西拥有梦幻的中前场,如日中天的小罗,但是这个夏天不属于巴西。
集体的梦游,小组赛还没有惊醒,到了和一流强队的对抗,自然败下阵来。

可是这一切全都被齐达内-马特拉奇事件遮住了。
我不明白为什么球场上司空见惯的事情发生在这两个人,这两个队上就可以几乎颠倒黑白了。
马特拉奇肯定是侮辱了齐达内,但是罪过能有多大?
相比于齐达内的伤人动作,哪个严重呢?
马特拉奇一个人的事情,整个意大利队都被人骂,这又是为了什么?
齐达内即将退役,他难道不知道头顶对方是多么严重的伤人犯规吗?

难道就因为是齐达内,就因为对方是意大利队员,黑白就可以颠倒了吗?!
类似的,贝克汉姆被铲伤,对方队员充其量只是个凶狠的铲断也被说成是毒蛇,恶人。。。

本来这届世界杯非常精彩,但是一些小东西让人如鲠在喉,比如一些和足球一点关系都没有的东西都和足球扯上关系了,最恶心的是那个劲霸男装,硬和足球拉关系;超女也开专栏评球,MD,平时都到哪里去了?数不清的人和事情为了增加知名度,都来利用足球,破坏了世界杯的完美。他们甚至不如彭久洋,彭虽然走美女路线,但是一直看球评球,总比利用世界杯的人要好很多!

本来想写个对世界杯的完整回忆的,没想到都是牢骚,哎。失败。。
不好意思,位置错了。呵呵。

posted @ 2006-07-15 12:49 追求卓越 阅读(125) | 评论 (8)编辑

2006年5月25日

表面上看,和Beta1没什么不同,也许只是更加稳定一些吧。
昨晚上下载完了,怀着Beta1带来的激动心情安装,有那么一点点失望。
安装完了之后,有一点不爽,就是不能激活,说是找不到网络连接。遗憾
不能激活只能使用50次
今天网上一看,有介绍说用Beta1的key就可以不提示激活,果然好用,呵呵。
继续体验吧。呵呵
Visio倒是有了一些变化,但是还没有像Word,Excel那样的工具栏。
Project Pro基本上也是老样子。Project Server没有使用,因为现在有Team System了,呵呵

posted @ 2006-05-25 10:31 追求卓越 阅读(733) | 评论 (6)编辑

2006年5月23日

1。从一月到七月,南极总是那么的白天,传说中的极夜哪里去了?

2。故事大概是说主人公和狗们深厚的感情吧。但是主人公并没有在理所应当的风暴中去救他的狗,而是风暴过去了,而且已经是6个月过去了,只能说是去看看还有没有活的,有什么感情可言?据说好多人在电影院看的掉泪,我却没有一点感觉,狗对得起人,人却对不起狗。要不是狗们生命力顽强,早就死光了。而且为了让狗们能够挣脱出绳索,继续活下去,居然弄了一幕狗去追旗子的戏,让人感觉十分搞笑。虽然狗们会有不让营地的东西丢失的责任感,但是感觉实在牵强。

posted @ 2006-05-23 17:49 追求卓越 阅读(228) | 评论 (0)编辑

收听MS的WebCast,每月2名幸运听众,上个月轮到我了,就收到了这么个礼物。
由于没有相机,暂时没有照片发上来。简单说一下样子吧。
通体暗黄色,左胸有Microsoft字样,后背是Visual Studio 2005和SQL Server 2005
然后左臂和右臂分别是Visual Studio 2005和SQL Server 2005字样。
M号居然对我依然很宽大。。呵呵
唯一不满意的是没有一个写衣料的地方,但是应该是棉的。
以后穿上给MS做广告了。

posted @ 2006-05-23 15:26 追求卓越 阅读(140) | 评论 (0)编辑

2006年4月29日

在画之前还用了另一个软件,专门家居设计的,专业是专业,但是太不好用了。还是VISIO用的简单方便。
给大家看看我的新家。高兴!
增加详细信息:
位于江宁湖滨世纪花园,02年的房子,我买的2手的
总共6层,这是第5层。145平米。花了好多钱。。好多零。。。

posted @ 2006-04-29 15:08 追求卓越 阅读(1176) | 评论 (26)编辑

2006年4月12日

今天为了给朋友传文件,使用了朋友的sohu的VIP信箱,用那个网络U盘。
选择文件,上传,可笑的事情发生了。大家有见过没有用字节数,而是用上传时间作为进度的吗?
原来用户是可以被当作傻瓜的。。。

补充说明:黄色的进度条总共10秒,周而复始的填充。真正有效的只有那个总共的耗时。

  

posted @ 2006-04-12 17:02 追求卓越 阅读(270) | 评论 (6)编辑

2006年4月11日

源地址:http://pantian.cnblogs.com/archive/2006/04/11/371793.html

我是个比较传统的程序员,开源接触的不是很多,所以没有什么系统的认识。
个人认为开源和软件知识产权是不可调和的矛盾,其他领域的知识产权是神圣不可侵犯的,立法保护,也是非常光荣的事情。但是在软件这一块,完全不是这么一回事了,谁要是对自己的代码不共享,谁要是喊着知识产权,就会受到BS,仿佛软件天生就是该大家共享的。我觉得这个现象是不合理的。软件行业也有资本的运作,源代码作为软件行业的重要部分,也是一个公司的资本,即是有价值的,但是却要被喊着开源,若是开源,无形中一个公司的资本就大幅削减,对公司的规模和发展是一个严重的削弱。若是不开源,则会被数不清的开源程序员所BS,其中大者如MS,就是众矢之的。每天都有各种各样的分析,论证MS应该开源。为什么软件公司如此的难做?为什么软件就一定要开源?在别的行业备受尊重的知识产权在软件业就没那么受重视,即使软件产品更加体现智慧知识的结晶?看到pansky的见解,和我以前考虑的略同,天下没有免费的午餐,也没有真正的大善人。开源的共产主义虽然美好,但是软件既然作为一个产业,就必定不会全部走向开源。这是我得看法。

posted @ 2006-04-11 11:45 追求卓越 阅读(148) | 评论 (0)编辑

2006年4月10日

仅通过崩溃地址找出源代码的出错行

作为程序员,我们平时最担心见到的事情是什么?是内存泄漏?是界面不好看?……错啦!我相信我的看法是不会有人反对的——那就是,程序发生了崩溃!

“该程序执行了非法操作,即将关闭。请与你的软件供应商联系。”,呵呵,这句 M$ 的“名言”,恐怕就是程序员最担心见到的东西了。有的时候,自己的程序在自己的机器上运行得好好的,但是到了别人的机器上就崩溃了;有时自己在编写和测试的过程中就莫名其妙地遇到了非法操作,但是却无法确定到底是源代码中的哪行引起的……是不是很痛苦呢?不要紧,本文可以帮助你走出这种困境,甚至你从此之后可以自豪地要求用户把崩溃地址告诉你,然后你就可以精确地定位到源代码中出错的那行了。(很神奇吧?呵呵。)

首先我必须强调的是,本方法可以在目前市面上任意一款编译器上面使用。但是我只熟悉 M$ 的 VC 和 MASM ,因此后面的部分只介绍如何在这两个编译器中实现,请读者自行融会贯通,掌握在别的编译器上使用的方法。

Well,废话说完了,让我们开始! :)

首先必须生成程序的 MAP 文件。什么是 MAP 文件?简单地讲, MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。而且,这是唯一能找出程序崩溃的地方的救星。

好吧,既然 MAP 文件如此神奇,那么我们应该如何生成它呢?在 VC 中,我们可以按下 Alt+F7 ,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入:/Zd ,然后要选择 Link 选项卡,在最下面的 Project Options 里面输入: /mapinfo:lines 和 /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件。

在 MASM 中,我们要设置编译和连接参数,我通常是这样做的:

rc %1.rc
ml /c /coff /Zd %1.asm
link /subsystem:windows /mapinfo:exports /mapinfo:lines /map:%1.map %1.obj %1.res

把它保存成 makem.bat ,就可以在命令行输入 makem filename 来编译生成 EXE 可执行文件和 MAP 文件了。

在此我先解释一下加入的参数的含义:

/Zd              表示在编译的时候生成行信息
/map[:filename]  表示生成 MAP 文件的路径和文件名
/mapinfo:lines   表示生成 MAP 文件时,加入行信息
/mapinfo:exports 表示生成 MAP 文件时,加入 exported functions (如果生成的是 DLL 文件,这个选项就要加上)

OK,通过上面的步骤,我们已经得到了 MAP 文件,那么我们该如何利用它呢?

让我们从简单的实例入手,请打开你的 VC ,新建这样一个文件:

01  //****************************************************************
02  //程序名称:演示如何通过崩溃地址找出源代码的出错行
03  //作者:罗聪
04  //日期:2003-2-7
05  //出处:http://www.luocong.com(老罗的缤纷天地)
06  //本程序会产生“除0错误”,以至于会弹出“非法操作”对话框。
07  //“除0错误”只会在 Debug 版本下产生,本程序为了演示而尽量简化。
08  //注意事项:如欲转载,请保持本程序的完整,并注明:
09  //转载自“老罗的缤纷天地”(http://www.luocong.com)
10  //****************************************************************
11  
12  void Crash(void)
13  {
14      int i = 1;
15      int j = 0;
16      i /= j;
17  }
18  
19  void main(void)
20  {
21      Crash();
22  }

很显然本程序有“除0错误”,在 Debug 方式下编译的话,运行时肯定会产生“非法操作”。好,让我们运行它,果然,“非法操作”对话框出现了,这时我们点击“详细信息”按钮,记录下产生崩溃的地址——在我的机器上是 0x0040104a 。

再看看它的 MAP 文件:(由于文件内容太长,中间没用的部分我进行了省略)

CrashDemo

Timestamp is 3e430a76 (Fri Feb 07 09:23:02 2003)

Preferred load address is 00400000

Start         Length     Name                   Class
0001:00000000 0000de04H .text                   CODE
0001:0000de04 0001000cH .textbss                CODE
0002:00000000 00001346H .rdata                  DATA
0002:00001346 00000000H .edata                  DATA
0003:00000000 00000104H .CRT$XCA                DATA
0003:00000104 00000104H .CRT$XCZ                DATA
0003:00000208 00000104H .CRT$XIA                DATA
0003:0000030c 00000109H .CRT$XIC                DATA
0003:00000418 00000104H .CRT$XIZ                DATA
0003:0000051c 00000104H .CRT$XPA                DATA
0003:00000620 00000104H .CRT$XPX                DATA
0003:00000724 00000104H .CRT$XPZ                DATA
0003:00000828 00000104H .CRT$XTA                DATA
0003:0000092c 00000104H .CRT$XTZ                DATA
0003:00000a30 00000b93H .data                   DATA
0003:000015c4 00001974H .bss                    DATA
0004:00000000 00000014H .idata$2                DATA
0004:00000014 00000014H .idata$3                DATA
0004:00000028 00000110H .idata$4                DATA
0004:00000138 00000110H .idata$5                DATA
0004:00000248 000004afH .idata$6                DATA

  Address         Publics by Value              Rva+Base     Lib:Object

0001:00000020       ?Crash@@YAXXZ              00401020 f   CrashDemo.obj
0001:00000070       _main                      00401070 f   CrashDemo.obj
0004:00000000       __IMPORT_DESCRIPTOR_KERNEL32 00424000     kernel32:KERNEL32.dll
0004:00000014       __NULL_IMPORT_DESCRIPTOR   00424014     kernel32:KERNEL32.dll
0004:00000138       __imp__GetCommandLineA@0   00424138     kernel32:KERNEL32.dll
0004:0000013c       __imp__GetVersion@0        0042413c     kernel32:KERNEL32.dll
0004:00000140       __imp__ExitProcess@4       00424140     kernel32:KERNEL32.dll
0004:00000144       __imp__DebugBreak@0        00424144     kernel32:KERNEL32.dll
0004:00000148       __imp__GetStdHandle@4      00424148     kernel32:KERNEL32.dll
0004:0000014c       __imp__WriteFile@20        0042414c     kernel32:KERNEL32.dll
0004:00000150       __imp__InterlockedDecrement@4 00424150     kernel32:KERNEL32.dll
0004:00000154       __imp__OutputDebugStringA@4 00424154     kernel32:KERNEL32.dll
0004:00000158       __imp__GetProcAddress@8    00424158     kernel32:KERNEL32.dll
0004:0000015c       __imp__LoadLibraryA@4      0042415c     kernel32:KERNEL32.dll
0004:00000160       __imp__InterlockedIncrement@4 00424160     kernel32:KERNEL32.dll
0004:00000164       __imp__GetModuleFileNameA@12 00424164     kernel32:KERNEL32.dll
0004:00000168       __imp__TerminateProcess@8  00424168     kernel32:KERNEL32.dll
0004:0000016c       __imp__GetCurrentProcess@0 0042416c     kernel32:KERNEL32.dll
0004:00000170       __imp__UnhandledExceptionFilter@4 00424170     kernel32:KERNEL32.dll
0004:00000174       __imp__FreeEnvironmentStringsA@4 00424174     kernel32:KERNEL32.dll
0004:00000178       __imp__FreeEnvironmentStringsW@4 00424178     kernel32:KERNEL32.dll
0004:0000017c       __imp__WideCharToMultiByte@32 0042417c     kernel32:KERNEL32.dll
0004:00000180       __imp__GetEnvironmentStrings@0 00424180     kernel32:KERNEL32.dll
0004:00000184       __imp__GetEnvironmentStringsW@0 00424184     kernel32:KERNEL32.dll
0004:00000188       __imp__SetHandleCount@4    00424188     kernel32:KERNEL32.dll
0004:0000018c       __imp__GetFileType@4       0042418c     kernel32:KERNEL32.dll
0004:00000190       __imp__GetStartupInfoA@4   00424190     kernel32:KERNEL32.dll
0004:00000194       __imp__HeapDestroy@4       00424194     kernel32:KERNEL32.dll
0004:00000198       __imp__HeapCreate@12       00424198     kernel32:KERNEL32.dll
0004:0000019c       __imp__HeapFree@12         0042419c     kernel32:KERNEL32.dll
0004:000001a0       __imp__VirtualFree@12      004241a0     kernel32:KERNEL32.dll
0004:000001a4       __imp__RtlUnwind@16        004241a4     kernel32:KERNEL32.dll
0004:000001a8       __imp__GetLastError@0      004241a8     kernel32:KERNEL32.dll
0004:000001ac       __imp__SetConsoleCtrlHandler@8 004241ac     kernel32:KERNEL32.dll
0004:000001b0       __imp__IsBadWritePtr@8     004241b0     kernel32:KERNEL32.dll
0004:000001b4       __imp__IsBadReadPtr@8      004241b4     kernel32:KERNEL32.dll
0004:000001b8       __imp__HeapValidate@12     004241b8     kernel32:KERNEL32.dll
0004:000001bc       __imp__GetCPInfo@8         004241bc     kernel32:KERNEL32.dll
0004:000001c0       __imp__GetACP@0            004241c0     kernel32:KERNEL32.dll
0004:000001c4       __imp__GetOEMCP@0          004241c4     kernel32:KERNEL32.dll
0004:000001c8       __imp__HeapAlloc@12        004241c8     kernel32:KERNEL32.dll
0004:000001cc       __imp__VirtualAlloc@16     004241cc     kernel32:KERNEL32.dll
0004:000001d0       __imp__HeapReAlloc@16      004241d0     kernel32:KERNEL32.dll
0004:000001d4       __imp__MultiByteToWideChar@24 004241d4     kernel32:KERNEL32.dll
0004:000001d8       __imp__LCMapStringA@24     004241d8     kernel32:KERNEL32.dll
0004:000001dc       __imp__LCMapStringW@24     004241dc     kernel32:KERNEL32.dll
0004:000001e0       __imp__GetStringTypeA@20   004241e0     kernel32:KERNEL32.dll
0004:000001e4       __imp__GetStringTypeW@16   004241e4     kernel32:KERNEL32.dll
0004:000001e8       __imp__SetFilePointer@16   004241e8     kernel32:KERNEL32.dll
0004:000001ec       __imp__SetStdHandle@8      004241ec     kernel32:KERNEL32.dll
0004:000001f0       __imp__FlushFileBuffers@4  004241f0     kernel32:KERNEL32.dll
0004:000001f4       __imp__CloseHandle@4       004241f4     kernel32:KERNEL32.dll
0004:000001f8       \177KERNEL32_NULL_THUNK_DATA 004241f8     kernel32:KERNEL32.dll

entry point at        0001:000000f0


Line numbers for .\Debug\CrashDemo.obj(d:\msdev\myprojects\crashdemo\crashdemo.cpp) segment .text

    13 0001:00000020    14 0001:00000038    15 0001:0000003f    16 0001:00000046
    17 0001:00000050    20 0001:00000070    21 0001:00000088    22 0001:0000008d

如果仔细浏览 Rva+Base 这栏,你会发现第一个比崩溃地址 0x0040104a 大的函数地址是 0x00401070 ,所以在 0x00401070 这个地址之前的那个入口就是产生崩溃的函数,也就是这行:

0001:00000020       ?Crash@@YAXXZ              00401020 f   CrashDemo.obj

因此,发生崩溃的函数就是 ?Crash@@YAXXZ ,所有以问号开头的函数名称都是 C++ 修饰的名称。在我们的源程序中,也就是 Crash() 这个子函数。

OK,现在我们轻而易举地便知道了发生崩溃的函数名称,你是不是很兴奋呢?呵呵,先别忙,接下来,更厉害的招数要出场了。

请注意 MAP 文件的最后部分——代码行信息(Line numbers information),它是以这样的形式显示的:

13 0001:00000020

第一个数字代表在源代码中的代码行号,第二个数是该代码行在所属的代码段中的偏移量。

如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:

崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000

为什么要这样做呢?细心的朋友可能会留意到 Rva+Base 这栏了,我们得到的崩溃地址都是由 偏移地址(Rva)+ 基地址(Base) 得来的,所以在计算行号的时候要把基地址减去,一般情况下,基地址的值是 0x00400000 。另外,由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的,所以也必须减去 0x1000 。

好了,明白了这点,我们就可以来进行小学减法计算了:

崩溃行偏移 = 0x0040104a - 0x00400000 - 0x1000 = 0x4a

如果浏览 MAP 文件的代码行信息,会看到不超过计算结果,但却最接近的数是 CrashDemo.cpp 文件中的:

16 0001:00000046

也就是在源代码中的第 16 行,让我们来看看源代码:

16      i /= j;

哈!!!果然就是第 16 行啊!

兴奋吗?我也一样! :)

方法已经介绍完了,从今以后,我们就可以精确地定位到源代码中的崩溃行,而且只要编译器可以生成 MAP 文件(包括 VC、MASM、VB、BCB、Delphi……),本方法都是适用的。我们时常抱怨 M$ 的产品如何如何差,但其实 M$ 还是有意无意间提供了很多有价值的信息给我们的,只是我们往往不懂得怎么利用而已……相信这样一来,你就可以更为从容地面对“非法操作”提示了。你甚至可以要求用户提供崩溃的地址,然后就可以坐在家中舒舒服服地找到出错的那行,并进行修正。

是不是很爽呢? :)

老罗
2003-2-7

posted @ 2006-04-10 18:27 追求卓越 阅读(295) | 评论 (1)编辑

2006年3月27日

    公司的上位机程序的安装包程序制作接近完成。但是令人头痛的兼容性问题出现了。在NT平台下开发的程序无法在98/Me下运行。原因很简单:系统的一些dll太老旧了。试验过用XP下的dll替换98/Me系统的dll,结果可想而知,不能用。一直在忙着替换,但是冷静下来一想:这是不可能完成的任务。如果这样也可以的话,那NT还叫什么New Technology?!这样来看陷入一个无法解决的圈子,NT下开发的程序无法在98/Me的平台下运行,除非重新开发,但是这似乎是个不可能的提议。没有时间重新检查开发一遍了。
    不过也有好的一面:InstallShield现在弄得熟练了一些。不得不说这是个不错的工具。
    公司要去千岛湖旅游。最后的一个好消息,呵呵。

posted @ 2006-03-27 18:00 追求卓越 阅读(93) | 评论 (2)编辑

2006年3月14日

IE7Beta1用了很久,感觉不错,简洁明了,就是资源占用多一些。
前些日子Beta2出来了,又下载来装,提示:有旧的Beta1存在,需要卸载掉才能安装。
按照Beta1的卸载方法:在添加/删除程序里面,选择显示Update,出现了Beta1。
但是点了卸载却没动静,这下无计可施了。重新安装Beta1也不能安装。卡在了这里。
我想了一下原因,曾经有一次看到系统盘里面很多Uninstall的文件夹,自认为不会再卸载他们,
于是就删除了这些文件夹以获取空间。结果现在找不到卸载了。。。。

请教高人如何搞定,谢谢!

posted @ 2006-03-14 09:33 追求卓越 阅读(166) | 评论 (2)编辑

2006年3月13日

     摘要: 中文2K下,SetupDiGetDeviceRegistryProperty函数在获得SPDRP_DEVICEDESC时,如果名称为中文,buffersize不正确,导致获取信息不完整。
  阅读全文

posted @ 2006-03-13 22:12 追求卓越 阅读(247) | 评论 (0)编辑

每次进入个人blog,看到排名,但是记不得上次是多少,能否增加一个箭头表示一下。这样对我这样比较懒惰的同志有个督促的,毕竟不愿意看到向下的箭头,呵呵。dudu百忙之中,可以看看是否能加个这个东西。多谢!

posted @ 2006-03-13 17:06 追求卓越 阅读(219) | 评论 (4)编辑

2006年2月21日

问题如下:貌似正常的连接部分代码,就是无法建立连接。连接API为
DWORD RasDial(
  LPRASDIALEXTENSIONS lpRasDialExtensions,
  LPCTSTR lpszPhonebook,
  LPRASDIALPARAMS lpRasDialParams,
  DWORD dwNotifierType,
  LPVOID lpvNotifier,
  LPHRASCONN lphRasConn
);

解决:lpRasDialParams参数的dwSize设置为结构体大小
            lphRasConn 参数设置为NULL

结论:看说明文档一定要仔细,这个函数的介绍在MSDN里面很详细,相关参数的设置也有说明,但是被忽视了,以后要引以为戒。

posted @ 2006-02-21 16:20 追求卓越 阅读(84) | 评论 (0)编辑

2006年1月6日

先简单的看看过去的一个月:看了好多文档,写了个拨号连接的程序。叹服MSDN的强大与详尽。还作了一些小问题的研究。就不说了。
新的一年开始了,记事本准备好了,希望能把它写的满一些。台历也准备好了,可以一抬头就能看到一个月的规划。自己准备好了吗?想想看。元旦在家里睡了3天,充足的睡眠,有了足够的精神,算是也准备好了。呵呵。
这里再对.NET2.0表示一下敬意。MS把自动更新功能做好了,如果你的程序是C#或者是VB.NET的话,那么恭喜你,你只需要设置一下工程的属性,就可以立即拥有自动更新的功能了。VC++的情况要复杂一些,不过也提供了专门的工具,按照步骤来,也可以让你的程序能够自动更新。看到这里,我不禁想,MSDN里面到底还有多少我们见所未见,闻所未闻的东西啊。。。

posted @ 2006-01-06 01:06 追求卓越 阅读(210) | 评论 (0)编辑

2005年9月2日

    昨天晚上难得空闲,发奋图强,把Remember的功能大部分完成了,比较列表的操作大致按照思路作起来了。还需要做的是对文件尾部的判断,到了文件尾部,比较列表要相应的做一些处理。比如结束一个一边到了文件结尾的分支。
    软件的结构是骨骼,功能的完善是她的躯体,容错处理是她的智慧。现在只完成了她的2/3。
    公司的项目终于有了一个好一些的版本,虽然明天还要加班,但是今天却好像可以正点下班了。难得哦。还不知道是否是真的呢,正点下班已经是一个美好的梦想了。
    由于公司门前街道扩充,公司要暂时搬迁,具体时间未定,希望能早一点确定下来。现在这里经常停水什么的,门前工地乱七八糟,下雨的天气就是一个泥潭。。。哎。
    就这么多了。

posted @ 2005-09-02 17:34 追求卓越 阅读(220) | 评论 (2)编辑