<P> 本例中出现错误的软件是中国移动飞信2008版客户端,具体现象是每次双击图标启动该程序时总会收到一个错误信息对话框——标题为“FetionFX.exe - Entry Point Not Found”,内容为“The procedure entry point _except_handler4_common could not be located in the dynamic link library msvcrt.dll.”。如下图所示:</P>
<P> 以前在台式机中文版Microsoft Windows XP Professional with Service Pace 2上使用这个客户端时并没有出现该问题,但是今年9月份我将笔记本计算机的操作系统安装为Microsoft Windows XP Professional with Service Pace 3的英文版,然后于10月初安装飞信客户端之后就一直存有这个问题,直到今天我才有一块集中的空余时间来分析解决。之前我搜索过百度,但是答案均是“系统缺少msvcrt.dll,下载一个就好了”或者是“msvcrt.dll版本不正确,下载一个替换即可”,为了图简便,我也试过,但是根本不奏效。可是我发现没有解决也可以正常使用飞信,只是每次要弹出这个错误消息,所以也没急着管。哈哈~幸好今天解决掉了,心得是解决软件故障不能浮于表面,欲发掘内在问题和根本原因,还得自己架设环境手动分析,因为软件太多了,错误的种类也太多了,一切还是得具体情况具体分析阿~~下面我们一起来看看整个过程吧:(全部的分析调试过程不止下面的这些,但是经过解决这个问题,以下整理出来的思路应该是最简短并且能够找到问题原因的)</P>
<P> 首先,我们让该问题重现,即双击飞信客户端的桌面图标,让其弹出该错误对话框。错误提示出现了,我们先不急着点击“OK(确定)”按钮,而是启动一个调试程序。(本例中使用著名的Microsoft Windbg工具进行调试分析)然后在“File(文件)”菜单中选择“Attach to a Process...(附加到一个进程)”,选择当前的飞信客户端的进程“FetionFX.exe”。这里之所以要选择Attach to a Process就是因为我们要将调试器跟踪到当前这个产生错误的进程,然后从内存中实时察看相关的线程堆栈甚至API函数的调用。Windbg中还支持其他的几种类型的调试,须根据具体情形按需选择。附加到该进程之后的结果如下图所示:</P>
<P> 接下来,我们查看位于飞信文件夹下的dwmapi.dll。察看版本信息,得到“6.0.6000.16386 (vista_rtm.061101-2205)”,问题就在这里!看到了吗?这个位于飞信安装目录下的文件怎么会来自Vista正式发布版??怎么会用到XP的程序执行之中???要知道,这个文件之所以能够使用全部功能是因为在Vista环境之下,很多新的DLL文件中带有新的函数,正好可以被它调用。那么我们猜想,是不是Vista版本下的MSVCRT.DLL就存在一个新版本——即第4版的_exception_handler4呢?我们从Microsoft Windows Vista RTM中提取出位于%systemroot%\system32下面的MSVCRT.DLL,其版本为“7.0.6001.18000 (longhorn_rtm.080118-1840)”,然后再次使用Dependency Walker打开,发现其中果然存在该新的函数!即“_except_handler4_common”。如下图所示:</P>