﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-调试</title><link>http://www.cppblog.com/woaidongmao/category/16864.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Tue, 10 May 2011 05:33:16 GMT</lastBuildDate><pubDate>Tue, 10 May 2011 05:33:16 GMT</pubDate><ttl>60</ttl><item><title>VC6 Release下，产生 MiniDump的编译设置</title><link>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146100.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 10 May 2011 05:05:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146100.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/146100.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/146100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/146100.html</trackback:ping><description><![CDATA[<p>1、Generate debug必须选上，否则没有调试信息</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6_B498/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6_B498/image_thumb.png" width="681" height="457"></a> </p> <p>&nbsp;</p> <p>2、把优化disable，否则容易产生代码地址偏移；</p> <p>3、用program database产生PDB文件；</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6_B498/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6_B498/image_thumb_1.png" width="681" height="457"></a> </p> <p>&nbsp;</p> <p>4、将dll, exe, pdb，加上版本号，防止下次开发编译时把老的PDB冲掉。</p> <p>5、发布的版本，输出到一个固定目录，防止人为删除Debug， Relase导致丢失</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6_B498/image_6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6_B498/image_thumb_2.png" width="681" height="457"></a> </p> <p>6、对于已经稳定的版本dll, exe，编译时，可将优化开启。（虽然偶然有代码地址偏移，但是还可以接受）</p> <p>7、生成MiniDump时，用MiniDumpWithDataSegs方式，这样，全局变量的值也可查看</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/146100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-05-10 13:05 <a href="http://www.cppblog.com/woaidongmao/archive/2011/05/10/146100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调试Release发布版程序的Crash错误</title><link>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146092.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 10 May 2011 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146092.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/146092.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/146092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/146092.html</trackback:ping><description><![CDATA[<pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">SetUnhandledExceptionFilter + StackWalker<?xml:namespace prefix = o /><o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">这个方案需要自己动手往工程里添加代码了。要实现上面的想法，需要做两件事情：<span lang="EN-US">1</span>、需要在<span lang="EN-US">crash</span>时有机会对程序堆栈进行处理；<span lang="EN-US">2</span>、对堆栈信息进行收集。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>1</span><span style="line-height: 150%; color: black; font-size: 14pt">、<span lang="EN-US">SetUnhandleExceptionFilter</span>函数<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Windows</span><span style="line-height: 150%; color: black; font-size: 14pt">平台下的<span lang="EN-US">C++</span>程序异常通常可分为两种：结构化异常（<span lang="EN-US">Structured Exception</span>，可以理解为与操作系统相关的异常）和<span lang="EN-US">C++</span>异常。对于结构化异常处理（<span lang="EN-US">SEH</span>），可以找到很多资料，在此不细说。对于<span lang="EN-US">crash</span>错误，一般由未被正常捕获的异常引起，<span lang="EN-US">Windows</span>操作系统提供了一个<span lang="EN-US">API</span>函数可以在程序<span lang="EN-US">crash</span>之前有机会处理这些异常，就是<span lang="EN-US">SetUnhandleExceptionFilter</span>函数。（<span lang="EN-US">C++</span>也有一个类似函数<span lang="EN-US">set_terminate</span>可以处理未被捕获的<span lang="EN-US">C++</span>异常。）<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>SetUnhandleExceptionFilter</span><span style="line-height: 150%; color: black; font-size: 14pt">函数声明如下：<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">其中<span lang="EN-US"> LPTOP_LEVEL_EXCEPTION_FILTER </span>定义如下：<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: navy; font-size: 14pt" lang="EN-US">typedef</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> </span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">LONG</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in struct </span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">_EXCEPTION_POINTERS</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> *ExceptionInfo<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: navy; font-size: 14pt" lang="EN-US">typedef</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">简单来说，<span lang="EN-US">SetUnhandleExceptionFilter</span>允许我们设置一个自己的函数作为全局<span lang="EN-US">SEH</span>过滤函数，当程序<span lang="EN-US">crash</span>前会调用我们的函数进行处理。我们可以利用的是 </span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">_EXCEPTION_POINTERS</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> </span><span style="line-height: 150%; color: black; font-size: 14pt">结构类型的变量<span lang="EN-US">ExceptionInfo</span>，它包含了对异常的描述以及发生异常的线程状态，过滤函数可以通过返回不同的值来让系统继续运行或退出应用程序。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">关于<span lang="EN-US"> SetUnhandleExceptionFilter </span>函数的具体用法和示例请参考<span lang="EN-US">MSDN</span>。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> <o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>2</span><span style="line-height: 150%; color: black; font-size: 14pt">、<span lang="EN-US">StackWalker<o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">现在我们已经有机会可以在<span lang="EN-US">crash</span>之前对程序状态信息进行处理了，只需要生成并保存堆栈信息就大功告成了。<span lang="EN-US">Windows</span>的<span lang="EN-US">dbghelp.dll</span>库提供了一个函数可以得到当前堆栈信息：<span lang="EN-US">StackWalk64</span>（在<span lang="EN-US">Win2K</span>以前版本中为<span lang="EN-US">StackWalk</span>）。该函数声明如下：<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">BOOL</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> WINAPI StackWalk64(<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">DWORD</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> MachineType,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">HANDLE</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> hProcess,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">HANDLE</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> hThread,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in_out<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LPSTACKFRAME64 StackFrame,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in_out<span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">PVOID</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> ContextRecord,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in <span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">该函数的具体用法可以参考<span lang="EN-US">MSDN</span>。在这里推荐一个牛人写好的<span lang="EN-US">StackWalker</span>，可以直接拿来用，开源的。<span lang="EN-US">StackWalker</span>提供了一个基类，给出了几个简单的接口，可以方便地生成堆栈信息，并且支持一系列<span lang="EN-US">VC</span>版本，非常好用。我们可以自己写一个子类，并重载虚函数<span lang="EN-US">OnOutput</span>，就可以将堆栈信息输出为特定格式了。<span lang="EN-US">StackWalker</span>的地址为：<span lang="EN-US">http:</span></span><span style="line-height: 150%; color: green; font-size: 14pt" lang="EN-US">//www.codeproject.com/KB/threads/StackWalker.aspx</span><span style="line-height: 150%; color: green; font-size: 14pt">。</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">不过对于<span lang="EN-US">Release</span>版本来说，<span lang="EN-US">StackWalk64</span>函数获得的堆栈信息有可能不完整。如果异常是由<span lang="EN-US">MFC</span>的模块抛出，那么获得的堆栈可能缺少前面调用模块信息。另外，<span lang="EN-US">StackWalk64</span>需要最新的<span lang="EN-US">dbghelp.dll</span>文件支持才能工作；要正确输出<span lang="EN-US">crash</span>的函数名和行号，需要要<span lang="EN-US">pdb</span>文件支持。以上不足有可能影响输出信息的完整性和效果，而对于发布在外的程序，要带上<span lang="EN-US">pdb</span>文件几乎不可能，因此这个方案还是有缺憾的，比较适用于本地的<span lang="EN-US">release</span>版本调试。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt">当我们把自己的<span lang="EN-US">release</span>版本程序发布出去以后，一般都是在用户的机器上运行。这种情况下，对于第四种方案，因为需要<span lang="EN-US">pdb</span>文件才能够正确生成堆栈调用的函数行号及代码行号，因此方案四只适用于本地<span lang="EN-US">release</span>版的调试，否则只能生成不完整的堆栈信息。对于前三种方案，其实只需要用户告知崩溃地址，然后在本地查找<span lang="EN-US">crash</span>地址就可以了，但是定位<span lang="EN-US">crash</span>的过程非常不方便，如果<span lang="EN-US">crash</span>的情况比较多，前三种方案都不合适。而且，前三种方案均不能生成堆栈调用信息，对于<span lang="EN-US">debug</span>的作用有限。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">下面我们就来看一个更加完善的解决方案。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> <o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">方案五：<span lang="EN-US">SetUnhandledExceptionFilter + Minidump<o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>SetUnhandleExceptionFilter</span><span style="line-height: 150%; color: black; font-size: 14pt">函数我们已经介绍过了，本方案的思路还是要利用我们自己的异常处理函数，来生成<span lang="EN-US">minidump</span>文件。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>1</span><span style="line-height: 150%; color: black; font-size: 14pt">、<span lang="EN-US">Minidump</span>概念<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>minidump</span><span style="line-height: 150%; color: black; font-size: 14pt">（小存储器转储）可以理解为一个<span lang="EN-US">dump</span>文件，里面记录了能够帮助调试<span lang="EN-US">crash</span>的最小有用信息。实际上，如果你在 系统属性<span lang="EN-US"> -&gt; </span>高级<span lang="EN-US"> -&gt; </span>启动和故障恢复<span lang="EN-US"> -&gt; </span>设置<span lang="EN-US"> -&gt; </span>写入调试信息 中选择<span lang="EN-US">“</span>小内存转储<span lang="EN-US">(64 KB)”</span>的话，当系统意外停止时都会在<span lang="EN-US">C:\Windows\Minidump\</span>路径下生成一个<span lang="EN-US">.dmp</span>后缀的文件，这个文件就是<span lang="EN-US">minidump</span>文件，只不过这个是内核态的<span lang="EN-US">minidump</span>。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">我们要生成的是用户态的<span lang="EN-US">minidump</span>，文件中包含了程序运行的模块信息、线程信息、堆栈调用信息等。而且为了符合其<span lang="EN-US">mini</span>的特性，<span lang="EN-US">dump</span>文件是压缩过的。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>2</span><span style="line-height: 150%; color: black; font-size: 14pt">、生成<span lang="EN-US">minidump</span>文件<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">生成<span lang="EN-US">minidump</span>文件的<span lang="EN-US">API</span>函数是<span lang="EN-US">MiniDumpWriteDump</span>，该函数需要<span lang="EN-US">dbghelp.lib</span>支持，其原型如下<span lang="EN-US">:<o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">BOOL</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> WINAPI MiniDumpWriteDump(<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">HANDLE</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> hProcess,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">DWORD</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> ProcessId,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">HANDLE</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> hFile,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MINIDUMP_TYPE DumpType,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>__in<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PMINIDUMP_CALLBACK_INFORMATION CallbackParam<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">在我们的异常处理函数中加入以下代码：<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: blue; font-size: 14pt" lang="EN-US">HANDLE</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"> hFile = ::CreateFile( _T(</span><span style="line-height: 150%; color: purple; font-size: 14pt" lang="EN-US">"E:\\dumpfile.dmp"</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: navy; font-size: 14pt" lang="EN-US">if</span><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">( hFile != INVALID_HANDLE_VALUE)<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>MINIDUMP_EXCEPTION_INFORMATION einfo;<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>einfo.ThreadId = ::GetCurrentThreadId();<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>einfo.ExceptionPointers = pExInfo;<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>einfo.ClientPointers = FALSE;<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, &amp;einfo, NULL, NULL);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>::CloseHandle(hFile);<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">其中，<span lang="EN-US">pExInfo</span>变量为异常处理函数<span lang="EN-US">PEXCEPTION_POINTERS</span>类型的参数。具体请参考<span lang="EN-US">MSDN</span>。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>3</span><span style="line-height: 150%; color: black; font-size: 14pt">、调试<span lang="EN-US">minidump<o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">调试<span lang="EN-US">dump</span>文件首先需要<span lang="EN-US">pdb</span>文件，因此我们<span lang="EN-US">build</span>程序时需要设置<span lang="EN-US"> Debug Infomation Format </span>为<span lang="EN-US"> “Program Database</span>（<span lang="EN-US">/Zi</span>）<span lang="EN-US">”</span>。其次，我们还要确保所用的<span lang="EN-US">dump</span>文件与源代码、<span lang="EN-US">exe</span>、<span lang="EN-US">pdb</span>文件版本是一致的，这要求我们必须维护好程序版本信息。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">调试<span lang="EN-US">minidump</span>最方便的环境就是<span lang="EN-US">VS</span>了，我们只要将<span lang="EN-US">.dmp</span>、<span lang="EN-US">.exe</span>、<span lang="EN-US">.pdb</span>文件放在一个路径下，保证源代码文件的路径与编译时的路径一致就可以了，剩下的就是<span lang="EN-US">VS</span>帮我们完成。双击<span lang="EN-US">.dmp</span>文件或者在文件打开工程中选择<span lang="EN-US">“dump files”</span>，加载<span lang="EN-US">dump</span>文件，然后按<span lang="EN-US">F5</span>运行就能直接恢复<span lang="EN-US">crash</span>时的现场了，你可以定位<span lang="EN-US">crash</span>的代码，可以查看调用堆栈，可以查看线程和模块信息<span lang="EN-US">...</span>一切都跟你设置断点调试一样，太强大了！看个截图吧。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">需要注意的是，对于<span lang="EN-US">release</span>版的程序来说，很多代码是经过编译器优化过的，因此定位的时候可能会有所偏差，大家可以考虑设置选项去掉代码优化。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p>&nbsp;</o:p></span></pre><pre style="line-height: 150%"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="line-height: 150%; color: black; font-size: 14pt">其他可以调试<span lang="EN-US">minidump</span>的工具还有<span lang="EN-US">WinDbg</span>等，大家可以查阅相关资料。<span lang="EN-US"><o:p></o:p></span></span></pre>
<p style="line-height: 150%" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; font-size: 14pt; mso-bidi-font-family: arial" lang="EN-US"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/146092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-05-10 11:58 <a href="http://www.cppblog.com/woaidongmao/archive/2011/05/10/146092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MiniDumpWriteDump API 来生成程序的Dump</title><link>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146086.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 10 May 2011 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146086.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/146086.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/146086.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/146086.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><b><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">MiniDumpWriteDump</span></b><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">是<span lang="EN-US">MS DbgHelp.dll </span>中一个<span lang="EN-US">API, </span>用于导出当前运行的程序的<span lang="EN-US">Dump. </span>这个<span lang="EN-US">dll</span>程序系统中就有<span lang="EN-US">, </span>但是很多软件<span lang="EN-US">, </span>都在自己的安装目录下保存了这个<span lang="EN-US">.dll</span>的最新的版本<span lang="EN-US">.<?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">为了测试这个<span lang="EN-US">API, </span>参考网上一些资料<span lang="EN-US">, </span>写了一个简单的<span lang="EN-US">C++ </span>程序<span lang="EN-US">. </span>目的是当有异常发生的时候<span lang="EN-US">, </span>自动生成<span lang="EN-US">Dump</span>文件供之后的分析<span lang="EN-US">. </span>有了<span lang="EN-US">Dump</span>文件<span lang="EN-US">, </span>我们就可以使用<span lang="EN-US">WinDBG</span>等调试器来分析异常发生时的情况<span lang="EN-US">. </span>其实这个功能很多软件都有<span lang="EN-US">, </span>比如<span lang="EN-US">QQ, </span>魔兽世界<span lang="EN-US">, </span>等等<span lang="EN-US">. </span>它们在出现了异常的时候会弹出一个对话框<span lang="EN-US">, </span>让用户输入异常发生时的情况<span lang="EN-US">, </span>然后把异常的<span lang="EN-US">dump</span>文件用<span lang="EN-US">email</span>发回<span lang="EN-US">, </span>供开发者们分析修改<span lang="EN-US">bug.<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">不过有一点<span lang="EN-US">, </span>这里需要程序的调试符号文件<span lang="EN-US">(pdb</span>文件<span lang="EN-US">). </span>对于<span lang="EN-US">Debug</span>版来说<span lang="EN-US">, </span>是生成的<span lang="EN-US">, </span>但是<span lang="EN-US">Release</span>版来说默认是不生成的<span lang="EN-US">. </span>可以设置<span lang="EN-US">VC</span>的编译器<span lang="EN-US">, </span>让它在<span lang="EN-US">Release</span>版的时候也生成调试信息<span lang="EN-US">. </span>这带来一个新的问题<span lang="EN-US">, </span>因为<span lang="EN-US">.pdb</span>里面是保存了源文件的信息的<span lang="EN-US">, </span>为了避免泄密<span lang="EN-US">, </span>可以采用<span lang="EN-US">VS</span>中的<span lang="EN-US">CVPack</span>工具<span lang="EN-US">, </span>从中去除敏感的信息<span lang="EN-US">.<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">程序需要使用<b><span lang="EN-US">Dbghelp.h</span></b><span lang="EN-US"> </span>和 <b><span lang="EN-US">Dbghelp.lib</span></b><span lang="EN-US"> . </span>它们可以从<span lang="EN-US">MSDN</span>找到<span lang="EN-US">.<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">最主要的函数<span lang="EN-US">, </span>生成<span lang="EN-US">Dump</span></span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)<br>{<br>if (excpInfo == NULL)</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"> //</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如果没有传入异常<span lang="EN-US">, </span>比如是在程序里面调用的<span lang="EN-US">, </span>生成一个异常</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>{<br>// Generate exception to get proper context in dump<br>__try <br>{<br>OutputDebugString(_T("raising exception\r\n"));<br>RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);<br>} <br>__except(DumpMiniDump(hFile, GetExceptionInformation()),<br>EXCEPTION_CONTINUE_EXECUTION) <br>{<br>}<br>} <br>else<br>{<br>OutputDebugString(_T("writing minidump\r\n"));<br>MINIDUMP_EXCEPTION_INFORMATION eInfo;<br>eInfo.ThreadId = GetCurrentThreadId(); </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">把需要的信息添进去</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>eInfo.ExceptionPointers = excpInfo;<br>eInfo.ClientPointers = FALSE;</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">&nbsp;&nbsp;&nbsp; // </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">调用<span lang="EN-US">, </span>生成<span lang="EN-US">Dump. 98</span>不支持<span lang="EN-US"><br>// Dump</span>的类型是小型的<span lang="EN-US">, </span>节省空间<span lang="EN-US">. </span>可以参考<span lang="EN-US">MSDN</span>生成更详细的<span lang="EN-US">Dump</span></span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">.<br>MiniDumpWriteDump(<br>GetCurrentProcess(),<br>GetCurrentProcessId(),<br>hFile,<br>MiniDumpNormal,<br>excpInfo ? &amp;eInfo : NULL,<br>NULL,<br>NULL);<br>}<br>}</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">下面的是程序部分<span lang="EN-US">:<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">int _tmain(int argc, _TCHAR* argv[])<br>{<br></span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">// </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">创建一个<span lang="EN-US">Dump</span>文件</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>HANDLE hFile = CreateFile( _T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE, <br>0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); <br>int code;<br>__try <br>{&nbsp;&nbsp; <br></span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">// </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">把自己实现的<span lang="EN-US">main</span>函数包装一下<span lang="EN-US">, </span>放在<span lang="EN-US">try .. except </span>块中<span lang="EN-US">. </span>这样出现了异常可以自动生成<span lang="EN-US">dump</span></span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>main_wrapper(argc, argv); <br>}<br>__except( code=GetExceptionCode(), DumpMiniDump(hFile, GetExceptionInformation() ),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXCEPTION_EXECUTE_HANDLER ) </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">出现了异常<span lang="EN-US">, </span>记录异常的<span lang="EN-US">code, </span>生成<span lang="EN-US">dump!!</span></span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>{<br>printf("%x\n", code);<br>wchar_t msg[512];<br>wsprintf(msg, L"Exception happened. Exception code is %x", code);<br>MessageBox(NULL, msg, L"Exception", MB_OK); </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">显示消息给用户</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>}<br>CloseHandle( hFile ); </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">关闭<span lang="EN-US">Dump</span>文件</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>getchar();<br>return 0; <br>}</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">最下面是两个测试的函数<span lang="EN-US">, main_wrapper</span>函数将调用<span lang="EN-US">test1, test1</span>将会生成一个异常<span lang="EN-US">(</span>非法内存写<span lang="EN-US">)<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">void test1() {<br>int *p;<br>p = (int*)0x100; <br>*p = 0; </span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">//</span><span style="line-height: 150%; font-family: 宋体; color: #38761d; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">写<span lang="EN-US">0x100</span>地址<span lang="EN-US">, </span>这个是非法的</span><span style="line-height: 150%; font-family: 宋体; color: blue; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><br>}<br><br>void main_wrapper(int argc, _TCHAR* argv[]) {<br>test1();<br>}</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">运行<span lang="EN-US">, </span>异常被捕获了<span lang="EN-US">:<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/MiniDumpWriteDumpAPIDump_9BF6/clip_image001_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" class="blogimg" title="clip_image001" border="0" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/MiniDumpWriteDumpAPIDump_9BF6/clip_image001_thumb.jpg" width="401" height="203" v:shapes="_x0000_i1025" small="0"></a><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">同时<span lang="EN-US">, dump</span>文件也生成了<span lang="EN-US">:<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/MiniDumpWriteDumpAPIDump_9BF6/clip_image002_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" class="blogimg" title="clip_image002" border="0" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/MiniDumpWriteDumpAPIDump_9BF6/clip_image002_thumb.jpg" width="523" height="116" v:shapes="_x0000_i1026" small="0"></a><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">用<span lang="EN-US">WinDBG</span>打开<span lang="EN-US">Dump</span>文件<span lang="EN-US">, </span>可以清楚的看出异常出现的情况<span lang="EN-US">:<br><br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/MiniDumpWriteDumpAPIDump_9BF6/clip_image003_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" class="blogimg" title="clip_image003" border="0" alt="clip_image003" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/MiniDumpWriteDumpAPIDump_9BF6/clip_image003_thumb.jpg" width="1140" height="853" v:shapes="_x0000_i1027" small="0"></a><br><br><br></span>从中可以比较清楚的看到异常发生的情况<span lang="EN-US">(Exception code), </span>异常出现的地址<span lang="EN-US">(test1</span>函数<span lang="EN-US">, </span>偏移<span lang="EN-US">0x28). </span>因为这次测试的是<span lang="EN-US">Debug</span>版<span lang="EN-US">, </span>有保存了源代码的<span lang="EN-US">.pdb</span>文件<span lang="EN-US">, </span>所以<span lang="EN-US">WinDbg</span>把源代码也列出来了<span lang="EN-US">. </span>这样可以非常容易的发现问题<span lang="EN-US">.<o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">============================================<o:p></o:p></span></p> <p style="line-height: 150%" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">参考<span lang="EN-US">:<br>DbgHelp</span>中的<span lang="EN-US">DumpAPI</span>例子<span lang="EN-US">: http://www.debuginfo.com/examples/src/effminidumps/MiniDump.cpp <br>CrashReport: </span>程序出现异常的时候显示发送错误的对话框<span lang="EN-US">, </span>并把<span lang="EN-US">Dump</span>文件发送到指定的地址<span lang="EN-US">. http://code.google.com/p/crashrpt/<br>XCrashReport: </span>与上面的类似的一个开源项目<span lang="EN-US">. http://www.codeproject.com/KB/debug/XCrashReportPt1.aspx</span></span><span style="line-height: 150%; font-family: arial; font-size: 9pt; mso-bidi-font-size: 10.0pt" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/146086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-05-10 11:08 <a href="http://www.cppblog.com/woaidongmao/archive/2011/05/10/146086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>符号文件&amp;mdash;&amp;mdash;Windows 应用程序调试必备</title><link>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146084.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 10 May 2011 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146084.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/146084.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/146084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/146084.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">一、何谓符号文件？</span></b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">　　符号文件（<span lang="EN-US">Symbol Files</span>）是一个数据信息文件，它包含了应用程序二进制文件（比如：<span lang="EN-US">EXE</span>、<span lang="EN-US">DLL</span>等）调试信息，专门用来作调试之用，最终生成的可执行文件在运行时并不需要这个符号文件，但你的程序中所有的变量信息都记录在这个文件中。所以调试应用程序时，这个文件是非常重要的。用<span lang="EN-US"> Visual C++ </span>和<span lang="EN-US"> WinDbg </span>调试程序时都要用到这个文件。<span lang="EN-US"><br></span>　　在<span lang="EN-US"> Windows </span>系统中，符号文件以<span lang="EN-US"> .pdb </span>为扩展名，比如：每个 <span lang="EN-US">Windows </span>操作系统下有一个<span lang="EN-US"> GDI32.dll </span>文件，编译器在编译该<span lang="EN-US"> DLL </span>的时候会产生一个<span lang="EN-US"> GDI32.pdb </span>文件，一旦你拥有了这个<span lang="EN-US"> PDB </span>文件，那么便可以用它来调试并跟踪到<span lang="EN-US"> GDI32.dll </span>内部。该文件和二进制文件的编译版本密切相关，比如修改了<span lang="EN-US"> DLL </span>的输出函数，再编译该<span lang="EN-US"> DLL</span>，那么原先的<span lang="EN-US"> PDB </span>文件就过时了，不能再用老的<span lang="EN-US"> PDB </span>文件来做调试工作<span lang="EN-US">,</span>而必须使用最新的<span lang="EN-US"> PDB </span>文件版本。<span lang="EN-US"><br></span>　　<span lang="EN-US">Visual C++ </span>编译代码后会在<span lang="EN-US"> Debug </span>或者<span lang="EN-US"> Release </span>目录下生成一个<span lang="EN-US"> PDB </span>文件。一般情况下，符号文件包括以下的数据信息：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l4 level1 lfo1" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">全局变量（<span lang="EN-US">Global variables</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l4 level1 lfo1" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">局部变量（<span lang="EN-US">Local variables</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l4 level1 lfo1" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">函数名和它们的入口地址（<span lang="EN-US">Function names and the addresses of their entry points</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l4 level1 lfo1" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US">FPO </span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">数据（<span lang="EN-US">Frame Pointer Omission)</span>：<span lang="EN-US">Frame Pointer </span>是一种用来在调用堆栈（<span lang="EN-US">Call stack</span>）中找到下一个将要被调用的函数的数据结构源代码的行序号（<span lang="EN-US">Source-line numbers</span>）； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">二、如何得到和安装符号文件<span lang="EN-US">?</span></span></b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <ol type="1"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l5 level1 lfo2" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">先确定你的操作系统（<span lang="EN-US">OS</span>）版本； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l5 level1 lfo2" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">到微软网站下载相应的符号文件； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l5 level1 lfo2" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">安装符号文件，对于符号文件的安装位置没有特贝要求，可以安装在任何目录中； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l5 level1 lfo2" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">设置环境变量，使得调试工具（比如：<span lang="EN-US">Visual C++</span>、<span lang="EN-US">WinDbg</span>、<span lang="EN-US">Ntsd</span>、<span lang="EN-US">DrWatson </span>等）能找到符号文件； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">安装符号文件的注意事项：<span lang="EN-US"><br><br></span>　　如果是手动安装符号文件，有一点很重要，那就是宿主机（<span lang="EN-US">Hostt Computer</span>）上的符号文件必须与目标机器（<span lang="EN-US">Target Computer</span>）上的<span lang="EN-US"> Windows </span>版本相匹配。<span lang="EN-US"><br></span>　　这里所谓的宿主机指的是运行调试会话的机器，在典型的双系统调试会话环境中，宿主机可以是连接到目标机器的任何机器。目标机器指的是发生软件组件、系统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器，它是调试会话关注的焦点。目标机器可以近在咫尺，也可以位于完全不同的地方。有时我们也将目标机器称之为<span lang="EN-US">——</span>被调试者（<span lang="EN-US">debuggee</span>），那么与之对应，宿主机则可以称为调试者（<span lang="EN-US">debugger</span>）。<span lang="EN-US"><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">三、在<span lang="EN-US"> Visual C++ </span>使用符号文件的方法</span></b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ 6.0 </span>中的使用方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l2 level1 lfo3" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ 6.0 </span>的<span lang="EN-US"> Workspace </span>文件（<span lang="EN-US">*.dsw</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l2 level1 lfo3" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">进入<span lang="EN-US"> Tools </span>菜单，选择<span lang="EN-US"> Options </span>菜单项<span lang="EN-US"> (Tools-&gt;Options)</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l2 level1 lfo3" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US"> Directoties </span>标签； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l2 level1 lfo3" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> “Show directories for”</span>下拉列表中选择<span lang="EN-US"> “Executable files”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l2 level1 lfo3" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">将符号文件的路径添加到<span lang="EN-US"> “Directories” </span>路径列表中； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l2 level1 lfo3" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">&nbsp; OK </span>完成； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ .NET 2003 </span>中的使用方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l3 level1 lfo4" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ .NET </span>的项目文件（<span lang="EN-US">*.vcproj</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l3 level1 lfo4" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在解决方案管理器中选中要使用符号文件的项目； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l3 level1 lfo4" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击右键进入项目属性对话框； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l3 level1 lfo4" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>中的<span lang="EN-US">“</span>调试<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l3 level1 lfo4" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在与<span lang="EN-US">“</span>调试<span lang="EN-US">”</span>对应的<span lang="EN-US">“</span>操作<span lang="EN-US">”</span>选项中有一个<span lang="EN-US">“</span>符号路径<span lang="EN-US">”</span>，在此添加符号文件的路径即可； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l3 level1 lfo4" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">&nbsp; “</span>确定<span lang="EN-US">” </span>完成； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">四、如何产生<span lang="EN-US"> Release </span>版本二进制文件对应的<span lang="EN-US"> PDB </span>文件<span lang="EN-US">?</span></span></b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ 6.0 </span>中的方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ 6.0 </span>的<span lang="EN-US"> Workspace </span>文件（<span lang="EN-US">*.dsw</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">进入<span lang="EN-US"> Project </span>菜单，选择<span lang="EN-US"> Settings </span>菜单项<span lang="EN-US"> (Project-&gt;Settings)</span>，打开项目设置对话框； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> “Settings for”</span>列表中选择项目的<span lang="EN-US"> Release </span>配置； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">“C/C++”</span>标签； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Category”</span>下拉列表框中选择<span lang="EN-US">“General”</span>选项； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Debug info”</span>下拉列表框中选择调试信息格式（具体选项参见图一），在此不必禁用任何优化选项； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">“Link”</span>标签； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Category”</span>下拉列表框中选择<span lang="EN-US">“Debug”</span>选项； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选中<span lang="EN-US">“Debug info”</span>复选框，然后选择需要的链接调试类型（具体选项参见图一）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">不要选择<span lang="EN-US">“Separate types”</span>复选框； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Project options”</span>编辑框的最后添加如下指令：<span lang="EN-US">/opt:ref,icf</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l1 level1 lfo5" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">重新生成（<span lang="EN-US">Rebuild</span>）项目； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ .NET 2003 </span>中的方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ .NET </span>的项目文件（<span lang="EN-US">*.vcproj</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">进入<span lang="EN-US"> Project </span>菜单，选择<span lang="EN-US"> Settings </span>菜单项<span lang="EN-US"> (Project-&gt;Settings)</span>，打开项目设置对话框； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> “</span>配置<span lang="EN-US">”</span>下拉列表中选择项目的<span lang="EN-US"> “</span>（活动）<span lang="EN-US">Release” </span>配置； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>树型节点中的<span lang="EN-US">“C/C++” ==</span>〉<span lang="EN-US">“</span>常规<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">设置右边的<span lang="EN-US">“</span>调试信息格式<span lang="EN-US">”</span>选项（具体选项参见图一）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>树型节点中的<span lang="EN-US">“</span>链接器<span lang="EN-US">”==</span>〉<span lang="EN-US">“</span>调试<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">设置右边的<span lang="EN-US">“</span>生成程序数据库文件<span lang="EN-US">”</span>（具体选项参见图一）； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>树型节点中的<span lang="EN-US">“</span>链接器<span lang="EN-US">”==</span>〉<span lang="EN-US">“</span>命令行<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“</span>附加选项<span lang="EN-US">(D)”</span>编辑框中添加如下指令：<span lang="EN-US">/opt:ref,icf</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">按<span lang="EN-US">“</span>确定<span lang="EN-US">”</span>退出； <span lang="EN-US"><o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l0 level1 lfo6" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">重新生成（<span lang="EN-US">Rebuild</span>）项目； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Windows_9B7F/clip_image001_2.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Windows_9B7F/clip_image001_thumb.gif" width="541" height="112" v:shapes="_x0000_i1025"></a><br><br></span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">图一<span lang="EN-US"><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">五、关于<span lang="EN-US"> Free Build</span>（也称<span lang="EN-US"> Retail Build</span>）和<span lang="EN-US"> Checked Build</span>（也称<span lang="EN-US"> Debug Build</span>）</span></b><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">每个基于<span lang="EN-US"> NT </span>操作系统有两种不同的程序生成模式，即：<span lang="EN-US"><o:p></o:p></span></span></p> <ul type="disc"> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l6 level1 lfo7" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US">Free Build (</span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">或<span lang="EN-US"> Retail Build) <o:p></o:p></span></span></li> <li style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; tab-stops: list 36.0pt; mso-list: l6 level1 lfo7" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US">Checked Build (</span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">或<span lang="EN-US"> Debug Build) <o:p></o:p></span></span></li></ul> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">　　<span lang="EN-US">Free Build </span>生成的是最终用户版本，针对生成的二进制文件进行了彻底的优化，禁用了调试断言，并剥离了调试信息。这样一来使可执行程序文件更小，加载更快，使用的内存也更小。<span lang="EN-US"><br></span>　　<span lang="EN-US">Checked Build </span>生成的是测试和调试版本。它包含额外的<span lang="EN-US"> Free Build </span>所没有的错误检查，参数验证和调试信息，<span lang="EN-US">Checked Build </span>有助于隔离和跟踪可能导致不可预见的行为的问题，比如内存溢出，不正确的设备配置。虽然<span lang="EN-US"> Checked Build </span>提供了额外的保护，但与<span lang="EN-US"> Free Build </span>比较，它需要更多的内存开销和磁盘空间。由于可执行程序包含符号调试信息；调试时要执行附加的代码、参数检查和输出调试诊断信息，从而导致性能下降。<span lang="EN-US"><br><br></span><b>六、系统符号文件的更新方法</b><span lang="EN-US"><br><br></span>　　系统符号文件指<span lang="EN-US"> Windows </span>操作系统依赖的那几个重要的<span lang="EN-US"> DLL/SYS </span>和可执行文件对应的符号文件，常见的比如：<span lang="EN-US">gdi32.dll</span>、<span lang="EN-US">Kernel32.dll</span>、<span lang="EN-US">Kerberos.dll</span>、<span lang="EN-US">psapi.dll</span>、<span lang="EN-US">user32.dll</span>等，使用<span lang="EN-US"> WinDbg </span>调试时，你就会发现系统符号文件<span lang="EN-US">(PDB)</span>有多重要，这些文件都与本地的<span lang="EN-US"> OS </span>密切相关，比如，<span lang="EN-US">Windows 2000 </span>打了<span lang="EN-US">SP</span>补丁的话，那么必须更新系统符号文件才能进行相关调试，原来的符号文件与打补丁后的系统就会不匹配，怎么办呢<span lang="EN-US">? </span>可以通过网络来更新！象下面这样在<span lang="EN-US"> WinDbg </span>的<span lang="EN-US"> Symbols Path </span>里面输入路径：<span lang="EN-US"><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">SRV*<b><i>D:\Symbols\websymbols*</i></b>http://msdl.microsoft.com/download/symbols<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">（斜体部分是你在本地保存符号文件的路径）<span lang="EN-US"><br><br></span>　　如果你不是通过代理上网，那么在你用 <span lang="EN-US">WinDbg </span>打开一个被调试程序后，输入<span lang="EN-US"> symchk </span>回车，<span lang="EN-US">WinDbg </span>就会自动的连到微软的网站根据你的机器的情况更新的<span lang="EN-US"> PDB </span>文件，并将它保存在上面斜体部分指定的本地路径里，这样你就可以确保你的符号文件版本和你机器上的文件版本一致。<span lang="EN-US"><br><br></span>如果你是通过代理上网那么你需要配置<span lang="EN-US"> IE </span>的连接设置。具体方法恕不赘言<span lang="EN-US"><o:p></o:p></span></span></p> <p style="line-height: 150%" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial" lang="EN-US"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/146084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-05-10 11:02 <a href="http://www.cppblog.com/woaidongmao/archive/2011/05/10/146084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>功能强大的vc6调试器</title><link>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146082.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 10 May 2011 03:01:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146082.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/146082.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/05/10/146082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/146082.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/146082.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">要成为一位优秀的软件工程师，调试能力必不可缺。本文将较详细介绍<span lang="EN-US">VC6</span>调试器的主要用法。<span lang="EN-US"> <br>&nbsp; windows</span>平台的调试器主要分为两大类：<span lang="EN-US"> <br>&nbsp; 1 </span>用户模式<span lang="EN-US">(user-mode)</span>调试器：它们都基于<span lang="EN-US">win32 Debugging API</span>，有使用方便的界面，主要用于调试用户模式下的应用程序。这类调试器包括<span lang="EN-US">Visual C++</span>调试器、<span lang="EN-US">WinDBG</span>、<span lang="EN-US">BoundChecker</span>、<span lang="EN-US">Borland C++ Builder</span>调试器、<span lang="EN-US">NTSD</span>等。<span lang="EN-US"> <br>&nbsp; 2 </span>内核模式<span lang="EN-US">(kernel-mode)</span>调试器：内核调试器位于<span lang="EN-US">CPU</span>和操作系统之间，一旦启动，操作系统也会中止运行，主要用于调试驱动程序或用户模式调试器不易调试的程序。这类调试器包括<span lang="EN-US">WDEB386</span>、<span lang="EN-US">WinDBG</span>和<span lang="EN-US">softice</span>等。其中<span lang="EN-US">WinDBG</span>和<span lang="EN-US">softice</span>也可以调试用户模式代码。<span lang="EN-US"> <br>&nbsp; </span>国外一位调试高手曾说，他<span lang="EN-US">70</span>％调试时间是在用<span lang="EN-US">VC++</span>，其余时间是使用<span lang="EN-US">WinDBG</span>和<span lang="EN-US">softice</span>。毕竟，调试用户模式代码，<span lang="EN-US">VC6</span>调试器的效率是非常高的。因此，我将首先在本篇介绍<span lang="EN-US">VC6</span>调试器的主要用法，其他调试器的用法及一些调试技能在后续文章中阐述。<span lang="EN-US"> <br><br></span><b>一 位置断点（<span lang="EN-US">Location Breakpoint</span>）</b><span lang="EN-US"> <br>&nbsp; </span>大家最常用的断点是普通的位置断点，在源程序的某一行按<span lang="EN-US">F9</span>就设置了一个位置断点。但对于很多问题，这种朴素的断点作用有限。譬如下面这段代码： <span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">void CForDebugDlg::OnOK() <span style="mso-tab-count: 1"></span><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">{<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for (int i = 0; i &lt; 1000; i++)<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>//A<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int k = i * 10 - 2;<span style="mso-tab-count: 1"> </span>//B<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SendTo(k);<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//C<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int tmp = DoSome(i);<span style="mso-tab-count: 1"> </span>//D<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int j = i / tmp;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>//E<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">}<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US">&nbsp; </span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">执行此函数，程序崩溃于<span lang="EN-US">E</span>行，发现此时<span lang="EN-US">tmp</span>为<span lang="EN-US">0</span>，假设<span lang="EN-US">tmp</span>本不应该为<span lang="EN-US">0</span>，怎么这个时候为<span lang="EN-US">0</span>呢？所以最好能够跟踪此次循环时<span lang="EN-US">DoSome</span>函数是如何运行的，但由于是在循环体内，如果在<span lang="EN-US">E</span>行设置断点，可能需要按<span lang="EN-US">F5</span>（<span lang="EN-US">GO</span>）许多次。这样手要不停的按，很痛苦。使用<span lang="EN-US">VC6</span>断点修饰条件就可以轻易解决此问题。步骤如下。<span lang="EN-US"> <br>&nbsp; 1 Ctrl+B</span>打开断点设置框，如下图：<span lang="EN-US"> <br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/vc6_9B2B/clip_image001_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/vc6_9B2B/clip_image001_thumb.jpg" width="573" height="376" v:shapes="_x0000_i1025"></a><br><b><span style="color: blue">Figure 1</span></b></span><span style="color: blue">设置高级位置断点</span><span lang="EN-US"> <br>&nbsp; 2 </span>然后选择<span lang="EN-US">D</span>行所在的断点，然后点击<span lang="EN-US">condition</span>按钮，在弹出对话框的最下面一个编辑框中输入一个很大数目，具体视应用而定，这里<span lang="EN-US">1000</span>就够了。<span lang="EN-US"> <br>&nbsp; 3 </span>按<span lang="EN-US">F5</span>重新运行程序，程序中断。<span lang="EN-US">Ctrl+B</span>打开断点框，发现此断点后跟随一串说明：<span lang="EN-US">...487 times remaining</span>。意思是还剩下<span lang="EN-US">487</span>次没有执行，那就是说执行到<span lang="EN-US">513</span>（<span lang="EN-US">1000</span>－<span lang="EN-US">487</span>）次时候出错的。因此，我们按步骤<span lang="EN-US">2</span>所讲，更改此断点的<span lang="EN-US">skip</span>次数<span lang="EN-US">,</span>将<span lang="EN-US">1000</span>改为<span lang="EN-US">513</span>。<span lang="EN-US"> <br>&nbsp; 4 </span>再次重新运行程序，程序执行了<span lang="EN-US">513</span>次循环，然后自动停在断点处。这时，我们就可以仔细查看<span lang="EN-US">DoSome</span>是如何返回<span lang="EN-US">0</span>的。这样，你就避免了手指的痛苦，节省了时间。<span lang="EN-US"> <br>&nbsp; </span>再看位置断点其他修饰条件。如<b><span lang="EN-US">Figure 1</span></b>所示，在<span lang="EN-US">“Enter the expression to be evaluated:”</span>下面，可以输入一些条件，当这些条件满足时，断点才启动。譬如，刚才的程序，我们需要<span lang="EN-US">i</span>为<span lang="EN-US">100</span>时程序停下来，我们就可以输入在编辑框中输入<span lang="EN-US">“i==<?xml:namespace prefix = st1 /><st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="100" unitname="&rdquo;">100”</st1:chmetcnv></span>。<span lang="EN-US"> <br>&nbsp; </span>另外，如果在此编辑框中如果只输入变量名称，则变量发生改变时，断点才会启动。这对检测一个变量何时被修改很方便，特别对一些大程序。<span lang="EN-US"> <br>&nbsp; </span>用好位置断点的修饰条件，可以大大方便解决某些问题。<span lang="EN-US"> <br><br></span><b>二 数据断点（<span lang="EN-US">Data Breakpoint</span>）</b><span lang="EN-US"> <br>&nbsp; </span>软件调试过程中，有时会发现一些数据会莫名其妙的被修改掉（如一些数组的越界写导致覆盖了另外的变量），找出何处代码导致这块内存被更改是一件棘手的事情（如果没有调试器的帮助）。恰当运用数据断点可以快速帮你定位何时何处这个数据被修改。譬如下面一段程序： <span lang="EN-US"><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">#include "stdafx.h"<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">#include <o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">int main(int argc, char* argv[])<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">{<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char szName1[10];<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char szName2[4];<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>strcpy(szName1,"shenzhen");<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("%s\n", szName1);<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//A<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>strcpy(szName2, "vckbase");<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//B<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("%s\n", szName1);<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>printf("%s\n", szName2);<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p>&nbsp;</o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return 0;<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">}<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US">&nbsp; </span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">这段程序的输出是 <span lang="EN-US"><o:p></o:p></span></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>szName1: shenzhen<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>szName1: ase<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>szName2: vckbase<o:p></o:p></span></p> <p style="text-align: left; line-height: 150%; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p> <p style="line-height: 150%" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt" lang="EN-US">szName1</span><span style="line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; font-size: 12pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">何时被修改呢？因为没有明显的修改<span lang="EN-US">szName1</span>代码。我们可以首先在<span lang="EN-US">A</span>行设置普通断点，<span lang="EN-US">F5</span>运行程序，程序停在<span lang="EN-US">A</span>行。然后我们再设置一个数据断点。如下图：<span lang="EN-US"> <br><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/vc6_9B2B/clip_image002_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/vc6_9B2B/clip_image002_thumb.jpg" width="656" height="381" v:shapes="_x0000_i1026"></a><br><b><span style="color: blue">Figure 2</span></b><span style="color: blue"> </span></span><span style="color: blue">数据断点</span><span lang="EN-US"> <br>&nbsp; F5</span>继续运行，程序停在<span lang="EN-US">B</span>行，说明<span lang="EN-US">B</span>处代码修改了<span lang="EN-US">szName1</span>。<span lang="EN-US">B</span>处明明没有修改<span lang="EN-US">szName1</span>呀？但调试器指明是这一行，一般不会错，所以还是静下心来看看程序，哦，你发现了：<span lang="EN-US">szName2</span>只有<span lang="EN-US">4</span>个字节，而<span lang="EN-US">strcpy</span>了<span lang="EN-US">7</span>个字节，所以覆写了<span lang="EN-US">szName1</span>。<span lang="EN-US"> <br>&nbsp; </span>数据断点不只是对变量改变有效，还可以设置变量是否等于某个值。譬如，你可以将<span lang="EN-US">Figure 2</span>中红圈处改为条件<span lang="EN-US">”szName2[0]==''''y''''“,</span>那么当<span lang="EN-US">szName2</span>第一个字符为<span lang="EN-US">y</span>时断点就会启动。<span lang="EN-US"> <br>&nbsp; </span>可以看出，数据断点相对位置断点一个很大的区别是不用明确指明在哪一行代码设置断点。<span lang="EN-US"> <br><br></span><b>三 其他</b><span lang="EN-US"> <br>&nbsp; 1 </span>在<span lang="EN-US">call stack</span>窗口中设置断点，选择某个函数，按<span lang="EN-US">F9</span>设置一个断点。这样可以从深层次的函数调用中迅速返回到需要的函数。<span lang="EN-US"> <br>&nbsp; 2 Set Next StateMent</span>命令（<span lang="EN-US">debug</span>过程中，右键菜单中的命令）<span lang="EN-US"> <br>&nbsp; </span>此命令的作用是将程序的指令指针（<span lang="EN-US">EIP</span>）指向不同的代码行。譬如，你正在调试上面那段代码，运行在<span lang="EN-US">A</span>行，但你不愿意运行<span lang="EN-US">B</span>行和<span lang="EN-US">C</span>行代码，这时，你就可以在<span lang="EN-US">D</span>行，右键，然后<span lang="EN-US">“Set Next StateMent”</span>。调试器就不会执行<span lang="EN-US">B</span>、<span lang="EN-US">C</span>行。只要在同一函数内，此指令就可以随意跳前或跳后执行。灵活使用此功能可以大量节省调试时间。<span lang="EN-US"> <br>&nbsp; 3 watch</span>窗口<span lang="EN-US"> <br>&nbsp; watch</span>窗口支持丰富的数据格式化功能。如输入<span lang="EN-US">0x65,u</span>，则在右栏显示<span lang="EN-US">101</span>。<span lang="EN-US"> <br>&nbsp; </span>实时显示<span lang="EN-US">windows API</span>调用的错误：在左栏输入<span lang="EN-US">@err,hr</span>。<span lang="EN-US"> <br>&nbsp; </span>在<span lang="EN-US">watch</span>窗口中调用函数。提醒一下，调用完函数后马上在<span lang="EN-US">watch</span>窗口中清除它，否则，单步调试时每一步调试器都会调用此函数。<span lang="EN-US"> <br>&nbsp; 4 messages</span>断点不怎么实用。基本上可以用前面讲述的断点代替。<span lang="EN-US"> <br></span><b>总结</b><span lang="EN-US"> <br>&nbsp; </span>调试最重要的还是你要思考，要猜测你的程序可能出错的地方，然后运用你的调试器来证实你的猜测。而熟练使用上面这些技巧无疑会加快这个过程。最后，大家如果有关于调试方面的问题，我乐意参与探讨</span><span style="line-height: 150%; font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/146082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-05-10 11:01 <a href="http://www.cppblog.com/woaidongmao/archive/2011/05/10/146082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>默认的调试器</title><link>http://www.cppblog.com/woaidongmao/archive/2010/01/25/106377.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 25 Jan 2010 04:13:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2010/01/25/106377.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/106377.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2010/01/25/106377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/106377.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/106377.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">如果一个线程的异常没有被处理，则<span lang=EN-US>Windows</span>的未处理异常过滤器将会被调用。这个函数根据注册表<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">键中的内容来对未处理的异常采取一种统一的行为和方法。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">该键中的<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>Auto: </span><span style="COLOR: black">决定是自动运行调试器，还是让用户决定<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>Debugger: </span><span style="COLOR: black">是指向调试器可执行文件的路径的字符串<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>-------------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">据观察，在我装了<span lang=EN-US>vs2005</span>之后<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>"Auto"="1"<br>"Debugger"="\"C:\\WINDOWS\\system32\\vsjitdebugger.exe\" -p %ld -e %ld"<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">表示将自动运行调试器<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>-------------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">而<span lang=EN-US>Windows</span>默认的调试器是<span lang=EN-US>Dr.Watson<o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">它捕获应用程序应用程序崩溃状态，并记录日志文件（<span lang=EN-US>Drwtsn32.log</span>）和进程崩溃转储文件（<span lang=EN-US>User.dmp</span>）。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">要想查看并配置<span lang=EN-US>Dr.Watson</span>，可以在运行中输入<span lang=EN-US>Drwtsn32.exe</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">要想恢复系统初始状态则可以运行<span lang=EN-US> Drwtsn32 -i<o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black">这样注册表的那两个值会变成<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>"Auto"="1"<br>"Debugger"="drwtsn32 -p %ld -e %ld -g"<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: black" lang=EN-US>-------------------------------------------------------------------------------------------<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: arial; COLOR: black; FONT-SIZE: 9pt; mso-bidi-font-size: 10.0pt" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/106377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2010-01-25 12:13 <a href="http://www.cppblog.com/woaidongmao/archive/2010/01/25/106377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Chrome的Crash Report服务</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99211.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 22 Oct 2009 11:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99211.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99211.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99211.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99211.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文翻译自debugInfo网站上一篇文章generating debug information with visual c++。由于Chrome的Crash产生的Debug信息和这个有一些关系，因此做一些背景知识介绍简介 当我们采用一个调试器调试一个应用程序时，我们总是希望能单步跟踪代码、设置断点、查看变量值，哪怕变量是自定义的用户类型。但是对于一个EXE程序来说，基本上就是一堆二进制...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/10/22/99211.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/99211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-22 19:33 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/22/99211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈Release版本排错</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99210.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 22 Oct 2009 11:28:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99210.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99210.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99210.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通常Release除错都是先通过SetUnhandledExceptionFilter捕获异常，然后生成报告文件，最后定位代码行，主要以下两种方法：（一）通过遍历调用栈，将其调用栈信息输出到文件。然后查找出错地址。查找方式有两种：（1）通过编译器生成的包含行信息的map文件定位出错位置。通过在&#8220;工程属性&#8221;-〉&#8220;link&#8221;-〉&#822...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/10/22/99210.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/99210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-22 19:28 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/22/99210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MiniDump小结</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99201.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 22 Oct 2009 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99201.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99201.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99201.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99201.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%"><span lang=EN-US>1</span>、挂异常链使用<span lang=EN-US>SetUnhandledExceptionFilter<br>2</span>、在调试状态下无效<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span lang=EN-US>3</span>、发生异常的时候为了保留现场堆栈需要冻结进程内其他线程，所使用的操作越少越好。<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span lang=EN-US>4</span>、开启另外一个进程对异常进程进行<span lang=EN-US>MiniDump</span>。<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span lang=EN-US>5</span>、如果要分析崩溃地址是否在某个模块，最好在分析进程里做。或者在模块加载时计算模块区域以便在异常时快速定位。判断崩溃是否和某个模块相关，只能通过分析堆栈里的模块来识别，使用<span lang=EN-US>StackWalk</span>函数。<span lang=EN-US>StackWalk</span>函数里所使用的<span lang=EN-US>context</span>参数要使用异常参数里的<span lang=EN-US>ContextRecord</span>，这样能分析在崩溃的时候的堆栈，而不会受后面操作的影响。<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span lang=EN-US>6</span>、如果希望自己是第一个被调用，可以在挂链之后用<span lang=EN-US>APIHook</span>设置<span lang=EN-US>SetUnhandledExceptionFilter</span>返回空。<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span lang=EN-US>7</span>、在冻结线程的时候，不要打<span lang=EN-US>MessageBox</span>，会导致当前线程因为其他线程挂起而阻死。<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span lang=EN-US>8</span>、异常除了<span lang=EN-US>SetUnHandledExceptionFliter</span>之外，还有<span lang=EN-US><a href="ms-help://MS.MSDNQTR.v90.chs/debug/base/addvectoredexceptionhandler.htm"><strong><span style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">AddVectoredExceptionHandler</span></strong></a></span>，相对于前者，后者的优点是能够让异常按照链式触发，不会被中间节点断开。但是<span lang=EN-US><a href="ms-help://MS.MSDNQTR.v90.chs/debug/base/addvectoredexceptionhandler.htm"><strong><span style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">AddVectoredExceptionHandler</span></strong></a></span>无法在<span lang=EN-US>2K</span>下使用。。。<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: arial; FONT-SIZE: 12pt" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-22 17:27 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/22/99201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异常处理与MiniDump详解(1,2,3,4)</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99200.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 22 Oct 2009 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99200.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99200.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/22/99200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99200.html</trackback:ping><description><![CDATA[<p><a title=http://blog.csdn.net/vagrxie/archive/2009/07/02/4317423.aspx href="http://blog.csdn.net/vagrxie/archive/2009/07/02/4317423.aspx">http://blog.csdn.net/vagrxie/archive/2009/07/02/4317423.aspx</a></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-22 17:15 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/22/99200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用VS2005进行dump文件调试</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 21 Oct 2009 10:58:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99135.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99135.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99135.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%; TEXT-INDENT: 24pt; BACKGROUND: white; WORD-BREAK: break-all; mso-char-indent-count: 2.0" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt">前言：利用</span><span lang=EN-US>drwtsn32<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>或</span><span lang=EN-US>NTSD<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>进行程序崩溃处理，都可以生成可用于调试的</span><span lang=EN-US>dmp<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>格式文件。使用</span><span lang=EN-US>VS2005<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>打开生成的</span><span lang=EN-US>DMP<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>文件，能很方便的找出</span><span lang=EN-US>BUG<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>所在位置。本文将讨论以下内容：</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="mso-fareast-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"><span style="COLOR: black; mso-bidi-font-family: calibri" lang=EN-US>1</span><span style="COLOR: black; mso-bidi-font-family: calibri">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span></span><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"><span style="COLOR: black">程序编译选项</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="mso-fareast-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"><span style="COLOR: black; mso-bidi-font-family: calibri" lang=EN-US>2</span><span style="COLOR: black; mso-bidi-font-family: calibri">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span></span><span style="COLOR: black"><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">利用</span><span lang=EN-US>VS2005 <span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>分析</span><span lang=EN-US>dump<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>文件</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="mso-fareast-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"><span style="COLOR: black; mso-bidi-font-family: calibri" lang=EN-US>3</span><span style="COLOR: black; mso-bidi-font-family: calibri">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span></span><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"><span style="COLOR: black">常见问题讨论</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -21pt; MARGIN: 15.6pt 0cm 15.6pt 21pt; BACKGROUND: white; WORD-BREAK: break-all; mso-para-margin-top: 1.0gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 21.0pt" class=msolistparagraph1><strong><span style="mso-bidi-theme-font: minor-fareast"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal">一、</span></strong><strong><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-weight: normal" lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal">程序编译选项</span></span></strong><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>PDB files contains all debug information like type definition and function prototype</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>.</span><span style="COLOR: black; mso-ansi-language: en-gb" lang=EN-GB> </span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it.</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB> You must do the following setting:</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>C/C++\General\Debug Information Format=Program Database (/Zi).</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image001_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image001_thumb.jpg" width=753 height=591 v:shapes="_x0000_i1025"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black"><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">图</span><span lang=EN-US>1.1 <span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>调试信息格式</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>Linker\Debugging\Generate Program Database File=&#8221;Name and location of your PDB files&#8221;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image002_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image002 border=0 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image002_thumb.jpg" width=753 height=591 v:shapes="_x0000_i1026"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black"><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">图</span><span lang=EN-US>1.2 PDB<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>文件输出路径</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black" lang=EN-US>PDB<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span><span style="COLOR: black">文件路径最好设置在同一个文件夹中，这样方便</span><span lang=EN-US>dmp<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>文件调试时调用。</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red"><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">调试时，所有的</span><span lang=EN-US>PDB<span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"></span>文件和源文件必须严格匹配（</span></span><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>the PDB files <strong><span style="FONT-FAMILY: 宋体">should be</span></strong> the one generated by build the source code<span style="mso-fareast-theme-font: minor-fareast"></span><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb">），并存储在一个安全的位置。当客户报告了一个错误时，你需要这些文件来帮忙以便定位错误于源代码中并解决问题。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -21pt; MARGIN: 15.6pt 0cm 15.6pt 21pt; BACKGROUND: white; WORD-BREAK: break-all; mso-para-margin-top: 1.0gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 21.0pt" class=msolistparagraph1><strong><span style="mso-bidi-theme-font: minor-fareast"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal">二、</span></strong><strong><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-weight: normal" lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal" lang=EN-US>VS2005 </span></strong><strong><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal">分析</span><span lang=EN-US>dump</span><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin">文件</span></span></strong><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it&#8217;s used directly without NULL pointer checking.</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image003_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image003 border=0 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image003_thumb.jpg" width=377 height=667 v:shapes="_x0000_i1027"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">图</span><span lang=EN-GB>1.3 <span style="mso-fareast-theme-font: minor-fareast"></span>演示代码</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">利用</span><span lang=EN-GB>Release<span style="mso-fareast-theme-font: minor-fareast"></span>模式编译该测试程序，在客户机上运行该程序，将根据</span><span lang=EN-GB>NTSD<span style="mso-fareast-theme-font: minor-fareast"></span>设置生成相对应的</span><span lang=EN-GB>DMP<span style="mso-fareast-theme-font: minor-fareast"></span>格式文件。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">可以使用</span><span lang=EN-GB>Visual Studio.Net<span style="mso-fareast-theme-font: minor-fareast"></span>、</span><span lang=EN-GB>NTSD<span style="mso-fareast-theme-font: minor-fareast"></span>或是其他的调试工具对</span><span lang=EN-GB>DMP<span style="mso-fareast-theme-font: minor-fareast"></span>格式文件进行分析。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: wingdings; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>l</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start Visual Studio.Net</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>Click File\Open Solution and make sure the files of type is *.dmp then click Open.</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image004_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image004 border=0 alt=clip_image004 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image004_thumb.jpg" width=703 height=370 v:shapes="_x0000_i1028"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">图</span><span lang=EN-GB>1.3 </span></span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>Open Dump File (GUI)</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: wingdings; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>l</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set Symbol Path</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>Click Tools\Options, Debugging\Symbols<span style="mso-fareast-theme-font: minor-fareast"></span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb">，增加</span><span lang=EN-GB>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件路径。若调试的程序需要微软基础库的</span><span lang=EN-GB>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>信息，可以增加一个路径为：</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://msdl.microsoft.com/download/symbols">http://msdl.microsoft.com/download/symbols</a> </span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">在界面下方</span><span lang=EN-GB>Cache Symbol From symbol&#8230;<span style="mso-fareast-theme-font: minor-fareast"></span>选择本地存储这些</span><span lang=EN-GB>Symbols<span style="mso-fareast-theme-font: minor-fareast"></span>的路径。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image005_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image005 border=0 alt=clip_image005 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image005_thumb.jpg" width=648 height=360 v:shapes="_x0000_i1029"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">图</span><span lang=EN-GB>1.4 Symbol Path</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb"><span style="mso-fareast-theme-font: minor-fareast">如果</span><span lang=EN-GB>DMP<span style="mso-fareast-theme-font: minor-fareast"></span>文件没有放入本身</span><span lang=EN-GB>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件所在目录，也可以在此处增加一个本地目录。点</span><span lang=EN-GB>OK<span style="mso-fareast-theme-font: minor-fareast"></span>后，</span><span lang=EN-GB>VS2005<span style="mso-fareast-theme-font: minor-fareast"></span>将从网络中下载所需要的</span><span lang=EN-GB>Symbols<span style="mso-fareast-theme-font: minor-fareast"></span>，需要等待一段时间。如果是多次调试同一个程序错误所生成的</span><span lang=EN-GB>DMP<span style="mso-fareast-theme-font: minor-fareast"></span>文件，可以在对话框中选择&#8220;</span><span lang=EN-GB>Search the above locations only when symbols are loaded manually<span style="mso-fareast-theme-font: minor-fareast"></span>&#8221;。从而可以节省网络带宽。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: red; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: wingdings; mso-ansi-language: en-gb" lang=EN-GB>l</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set Source code path</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>Open Solution Property Pages and set the source code path.</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image006_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image006 border=0 alt=clip_image006 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image006_thumb.jpg" width=260 height=134 v:shapes="_x0000_i1030"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">图</span><span lang=EN-US>1.5 <span style="mso-fareast-theme-font: minor-fareast"></span>属性菜单</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image007_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image007 border=0 alt=clip_image007 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image007_thumb.jpg" width=698 height=456 v:shapes="_x0000_i1031"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">图</span><span lang=EN-US>1.6 Debug Source Files</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: wingdings; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>l</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start to Debug the Dump File</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image008_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image008 border=0 alt=clip_image008 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VS2005dump_10A8C/clip_image008_thumb.jpg" width=1284 height=772 v:shapes="_x0000_i1032"></a></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">图</span><span lang=EN-US>1.7 <span style="mso-fareast-theme-font: minor-fareast"></span>调试窗口，定位到源代码</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -21pt; MARGIN: 15.6pt 0cm 15.6pt 21pt; BACKGROUND: white; WORD-BREAK: break-all; mso-para-margin-top: 1.0gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 21.0pt" class=msolistparagraph1><strong><span style="mso-bidi-theme-font: minor-fareast"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal">三、</span></strong><strong><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-weight: normal" lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin"><span style="FONT-FAMILY: 宋体; COLOR: black; mso-bidi-font-family: 宋体; mso-bidi-font-weight: normal">常见问题讨论</span></span></strong><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>1</span><span style="COLOR: black">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; Dump<span style="mso-fareast-theme-font: minor-fareast"></span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'">文件放在哪里？</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>Dump<span style="mso-fareast-theme-font: minor-fareast"></span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'">文件不用非要放在你编译出来的位置，你完全可以建立一个新的文件夹来放它。但若不是存放在编译出来的位置，需要将编译生成的</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件拷贝到</span><span lang=EN-US>Dump<span style="mso-fareast-theme-font: minor-fareast"></span>文件目录，或是利用</span><span lang=EN-US>VS2005<span style="mso-fareast-theme-font: minor-fareast"></span>打开</span><span lang=EN-US>Dump<span style="mso-fareast-theme-font: minor-fareast"></span>文件后，设置</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件路径。参照图</span><span lang=EN-US>1.4<span style="mso-fareast-theme-font: minor-fareast"></span>。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>2</span><span style="COLOR: black">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">如何恢复当时的现场？</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black">可能你要问，怎么可能，这个<span lang=EN-US>dump</span>文件可是用户发给我的，我不可能去用户家里调试吧？这个恢复现场可不是指的非要到那台机器上去，而是要把产生<span lang=EN-US>dump</span>文件对应的二进制文件拿到。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black">但是恢复现场需要所有的二进制文件都要对应，你一定要有导致用户崩溃的那些<span lang=EN-US>Exe</span>和<span lang=EN-US>DLL</span>。既然是你发布的程序，<span lang=EN-US>Exe</span>文件当然你会有。所以这里只考虑<span lang=EN-US>DLL</span>就行了。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black" lang=EN-US>Dump</span><span style="COLOR: black">文件中记录了所有<span lang=EN-US>DLL</span>文件的版本号和时间戳，所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好，如果不方便，用户不可能用的是我们平常不常用的操作系统，所以找个有对应系统的机器一般都会有。但是记住不仅是文件名称要一致，还要核对版本和时间戳，如果不同一样没有办法用。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black">如果客户用了某个特殊的补丁怎么办？<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black">其实这个问题也很好解决，只要它不阻碍阅读堆栈，就不用管它，调试<span lang=EN-US>Dump</span>和运行程序不一样，缺少一两个<span lang=EN-US>DLL</span>没有任何问题。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>3</span><span style="COLOR: black">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">如果真的需要怎么办？</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black">符号文件现在主要是指<span lang=EN-US>PDB</span>文件。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black">如果没有符号文件，那么调试的时候可能导致堆栈错误。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black"><span style="mso-fareast-theme-font: minor-fareast">如果你丢失了这个发布版本中你编译出来的那些</span><span lang=EN-US>exe<span style="mso-fareast-theme-font: minor-fareast"></span>和</span><span lang=EN-US>DLL<span style="mso-fareast-theme-font: minor-fareast"></span>的</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>，那么这个损失是严重的，重新编译出来的版本是不能使用的。</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black"><span style="mso-fareast-theme-font: minor-fareast">我自己的</span><span lang=EN-US>DLL<span style="mso-fareast-theme-font: minor-fareast"></span>都有了，可是缺的是系统的</span><span lang=EN-US>DLL<span style="mso-fareast-theme-font: minor-fareast"></span>的对应</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件怎么办？图</span><span lang=EN-US>1.4<span style="mso-fareast-theme-font: minor-fareast"></span>中已经介绍了方法。微软在它的符号数据库上为我们提供了所有的</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件，还有部分非关键</span><span lang=EN-US>DLL<span style="mso-fareast-theme-font: minor-fareast"></span>。设置好后程序将自动下载需要的</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>及</span><span lang=EN-US>DLL<span style="mso-fareast-theme-font: minor-fareast"></span>文件。</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>4</span><span style="COLOR: black">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">拿到需要的文件了，这些文件应该放在哪里？</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black"><span style="mso-fareast-theme-font: minor-fareast">符号数据库中的文件不用动，把其它的</span><span lang=EN-US>exe<span style="mso-fareast-theme-font: minor-fareast"></span>和</span><span lang=EN-US>DLL<span style="mso-fareast-theme-font: minor-fareast"></span>、</span><span lang=EN-US>PDB<span style="mso-fareast-theme-font: minor-fareast"></span>文件放在</span><span lang=EN-US>dump<span style="mso-fareast-theme-font: minor-fareast"></span>文件目录里就行了。</span><span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp;</span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>5</span><span style="COLOR: black">、</span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>&nbsp; </span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">我用的是</span><span lang=EN-US>VS2005<span style="mso-fareast-theme-font: minor-fareast"></span>，明明有源代码，为什么显示不了？</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'"><span style="mso-fareast-theme-font: minor-fareast">这个是</span><span lang=EN-US>dump<span style="mso-fareast-theme-font: minor-fareast"></span>调试的最头痛问题，代码可能已经改过了，即使你从</span><span lang=EN-US>SVN<span style="mso-fareast-theme-font: minor-fareast"></span>拿到当时的版本，时间戳也是错的，</span><span lang=EN-US>VS2005<span style="mso-fareast-theme-font: minor-fareast"></span>就是不让你显示代码。其实只要在</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>Tools\Options<span style="mso-fareast-theme-font: minor-fareast"></span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'">，</span><span lang=EN-US>Debugging\General<span style="mso-fareast-theme-font: minor-fareast"></span>中去掉</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 0cm 0cm 0pt 39pt; BACKGROUND: white; WORD-BREAK: break-all" class=msolistparagraph1><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'" lang=EN-US>Require source files to exactly match the original version<span style="mso-fareast-theme-font: minor-fareast"></span><span style="COLOR: black; mso-bidi-font-family: 'Times New Roman'">的复选就行了。</span></span><span style="COLOR: black" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-21 18:58 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/21/99135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NTSD(Command Line)调试DMP格式文件</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99134.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 21 Oct 2009 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99134.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99134.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99134.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99134.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">前言：之前介绍了利用<span lang=EN-US>VS2005</span>进行<span lang=EN-US>Dump</span>文件的调试，功能非常强大。但<span lang=EN-US>VS2005</span>是一个大程序，本文将讨论利用<span lang=EN-US>NTSD</span>的<span lang=EN-US>Command Line </span>实现<span lang=EN-US>Dump </span>文件的调试。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 15.6pt 6pt 15.6pt 45pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-para-margin-top: 1.0gd; mso-para-margin-right: 6.0pt; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 45.0pt" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt" lang=EN-US>1</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt">、</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp; </span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">载入<span lang=EN-US>DMP</span>格式文件</span></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">利用<span lang=EN-US>CMD</span>打开命令行窗口，切换到<span lang=EN-US>NTSD</span>所在目录。利用命令载入<span lang=EN-US>DMP</span>文件：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: red; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>ntsd &#8211;z dumpfileName &#8211;y symbolPath &#8211;srcpath sourcecodePath</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>dumpfileName</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">：<span lang=EN-US>DMP</span>格式文件路径<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>symbolPath</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">：<span lang=EN-US>PDB</span>文件路径<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>sourcecodePath</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">：程序的源代码路径<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如图<span lang=EN-US>1.1</span>，若载入成功，将弹出一个<span lang=EN-US>NTSD</span>窗口，如图<span lang=EN-US>1.2</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image001_4.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image001_thumb_1.jpg" width=967 height=76 v:shapes="_x0000_i1025"></a><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>1.1 </span>载入<span lang=EN-US>DMP</span>格式文件<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image002_4.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image002 border=0 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image002_thumb_1.jpg" width=673 height=442 v:shapes="_x0000_i1026"></a><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>1.2 NTSD</span>界面<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">红色的圈中显示了<span lang=EN-US>BUG</span>的原因，函数<span lang=EN-US>IsPrefix </span>存在错误。</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>0x36</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb">是错误相对于函数的偏移值。这个错误是一个<span lang=EN-GB>Access Violation</span>的异常，异常地址为<span lang=EN-GB>00401036</span>。</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>Note</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb">：</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -21pt; MARGIN: 0cm 6pt 0pt 48pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: wingdings; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>l</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>&nbsp; </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb">若路径中存在空格，需要用在路径前后加上引号。</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -21pt; MARGIN: 0cm 6pt 0pt 48pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: wingdings; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>l</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>&nbsp; </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb">若提示错误，根据提示查看是否由于<span lang=EN-GB>dbghelp.dll</span>不存在导致，安装的调试工具包中存在该动态库。</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -18pt; MARGIN: 15.6pt 6pt 15.6pt 45pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-para-margin-top: 1.0gd; mso-para-margin-right: 6.0pt; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 45.0pt" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt" lang=EN-US>2</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt">、</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp; </span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">定位与源代码</span></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">利用如下命令可以定位错误到源代码中：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>lsp<span style="mso-spacerun: yes">&nbsp; </span>&#8211;a 500<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>lsa<span style="mso-spacerun: yes">&nbsp; </span>.<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">第一行命令用于设置显示的源代码行数，第二行命令将错误定位与错误行。如图：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image003_4.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image003 border=0 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image003_thumb_1.jpg" width=673 height=506 v:shapes="_x0000_i1027"></a><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>1.3 Analysis Result: Line of Source Code Causing Crash<o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">从图中可以看出，第<span lang=EN-US>13</span>号是导致程序错误的位置。如果希望看到变量的值，使用命令：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>x <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">若需要详细查看某个变量的值，使用命令：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>?? </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB><span style="mso-spacerun: yes">&nbsp;</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>variableName</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image004_4.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image004 border=0 alt=clip_image004 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image004_thumb_1.jpg" width=673 height=442 v:shapes="_x0000_i1028"></a></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-US>图</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>1.4 <span style="mso-no-proof: yes">Analysis Result: Value of Variable Causing Crash</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-GB> </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><strong><u><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>Module Address of Your Application</span></u></strong><strong><u><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>(</span></u></strong><strong><u><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: en-gb">显示程序模块地址<span lang=EN-GB>)</span></span></u></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>Command:</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>x *!</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image005_4.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image005 border=0 alt=clip_image005 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image005_thumb_1.jpg" width=673 height=250 v:shapes="_x0000_i1029"></a></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb">图<span lang=EN-GB>1.5 Application Module Information</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>It shows all the module address in your application.</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>&nbsp;</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><strong><u><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-fareast-language: en-us; mso-ansi-language: en-gb" lang=EN-GB>Crash Stack Trace</span></u></strong><strong><u><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: en-gb">（显示程序调用堆栈）</span></u></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>If you want to trace the stack of application, use this command:</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>Command:</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB>kb</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb" lang=EN-GB><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image006_4.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image006 border=0 alt=clip_image006 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/NTSDCommandLineDMP_10A2C/clip_image006_thumb_1.jpg" width=673 height=250 v:shapes="_x0000_i1030"></a></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt; mso-ansi-language: en-gb">图<span lang=EN-GB>1.6 Application Stack Trace</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>It shows that function main invokes function IsPrefix then application crashes.</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US> <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>For more commands of NTSD, refer to debugger.chm in Microsoft Debugger Tools package.</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-21 18:56 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/21/99134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinDbg调试DMP格式文件</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99133.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 21 Oct 2009 10:53:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99133.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99133.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99133.html</trackback:ping><description><![CDATA[<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 21pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">前言：<span lang=EN-US>WinDbg</span>是微软开发的免费源代码级的调试工具。<span lang=EN-US>Win<u style="text-underline: double">D</u>bg</span>可以用于<span lang=EN-US>Kernel</span>模式调试和用户模式调试，还可以调试<span lang=EN-US>Dump</span>文件。本文的讨论是在安装了<span lang=EN-US>Debugging Tools for Windows </span>的前提下进行的，下载地址可以参考我之前的文章。<span lang=EN-US>WinDbg</span>对于<span lang=EN-US>dump</span>文件的调试可以通过菜单设置<span lang=EN-US>Symbol File Path</span>、<span lang=EN-US>Source File Path </span>，并可设置多个路径。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -17.85pt; MARGIN: 15.6pt 6pt 15.6pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-para-margin-top: 1.0gd; mso-para-margin-right: 6.0pt; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 44.85pt" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt" lang=EN-US>1</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt">、</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp; </span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">打开<span lang=EN-US>Dump</span>格式文件</span></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">打开<span lang=EN-US>WinDbg</span>，通过菜单<span lang=EN-US>[File] </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: wingdings; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: wingdings" lang=EN-US><span style="mso-char-type: symbol; mso-symbol-font-family: wingdings">&#224;</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US> [Open Crash dump] </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">选择<span lang=EN-US>dump</span>文件打开，也可通过<span lang=EN-US>CMD</span>打开<span lang=EN-US>Dos</span>命令窗口，切换到<span lang=EN-US>WinDbg</span>所在目录，利用命令：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>WinDbg &#8211;z &#8220;D:\Lines<st1:chsdate year="2009" month="7" day="25" islunardate="False" isrocdate="False" w:st="on">2009-7-25</st1:chsdate>-22-20-33-900.dmp&#8221;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>-z</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">表示路径<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WinDbgDMP_10974/clip_image001_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WinDbgDMP_10974/clip_image001_thumb.jpg" width=787 height=138 v:shapes="_x0000_i1025"></a><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>1.1 </span>利用<span lang=EN-US>WinDbg</span>打开<span lang=EN-US>dump</span>文件<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">载入<span lang=EN-US>dump</span>文件显示如图：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WinDbgDMP_10974/clip_image002_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image002 border=0 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WinDbgDMP_10974/clip_image002_thumb.jpg" width=848 height=682 v:shapes="_x0000_i1026"></a><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>1.2 WinDbg</span>界面<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -17.85pt; MARGIN: 15.6pt 6pt 15.6pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-para-margin-top: 1.0gd; mso-para-margin-right: 6.0pt; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 44.85pt" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt" lang=EN-US>2</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: calibri; mso-font-kerning: 0pt">、</span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp; </span></strong><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">分析<span lang=EN-US>dump</span>文件</span></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">若生成的<span lang=EN-US>dump</span>文件在本机，<span lang=EN-US>dump</span>文件中将包含调试需要的<span lang=EN-US>PDB</span>文件及源代码路径，若不在本机，可以通过<span lang=EN-US>WinDbg</span>菜单<span lang=EN-US>[File] </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: wingdings; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: wingdings" lang=EN-US><span style="mso-char-type: symbol; mso-symbol-font-family: wingdings">&#224;</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US> [Symbol File path] </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">及 <span lang=EN-US>[Source File Path] </span>分别设置<span lang=EN-US>PDB</span>文件路径和源代码路径。如果程序涉及到<span lang=EN-US>DLL</span>，需要将<span lang=EN-US>EXE</span>、<span lang=EN-US>DLL</span>所有涉及的<span lang=EN-US>PDB</span>、源代码路径都包括。使用命令：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>!analyze &#8211;v <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">将分析<span lang=EN-US>dump</span>文件，并显示程序崩溃处于的代码行：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WinDbgDMP_10974/clip_image003_2.jpg"><img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image003 border=0 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/WinDbgDMP_10974/clip_image003_thumb.jpg" width=848 height=682 v:shapes="_x0000_i1027"></a><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 44.85pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>1.3 </span>分析<span lang=EN-US>dump </span>文件<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-21 18:53 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/21/99133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序自动生成Dump文件</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99132.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 21 Oct 2009 10:52:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99132.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99132.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99132.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99132.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言：通过drwtsn32、NTSD、CDB等调试工具生成Dump文件， drwtsn32存在的缺点虽然NTSD、CDB可以完全解决，但并不是所有的操作系统中都安装了NTSD、CDB等调试工具。了解了mini dump文件格式后，完全可以程序自动生成Dump文件。本文主要讨论以下内容：1、&nbsp; 运行原理2、&nbsp; 程序修改3、&nbsp; 注意事项一、&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/10/21/99132.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/99132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-21 18:52 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/21/99132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己创建 minidump</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99130.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 21 Oct 2009 10:50:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99130.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99130.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99130.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99130.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt">以前曾写过一个<span lang=EN-US> bugslayer.dll </span>的介绍<span lang=EN-US>. </span>在程序出错时将调用栈写到文件<span lang=EN-US>. </span>觉得不错<span lang=EN-US>. </span>后来开始用<span lang=EN-US> windbg. </span>知道了<span lang=EN-US> userdump. </span>知道了如何调试<span lang=EN-US> dump... </span>才知道程序崩溃的时候写<span lang=EN-US> dump </span>文件其实可以获取比调用栈多得多的信息<span lang=EN-US>.&nbsp; <o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt">如果你的程序什么都不干<span lang=EN-US>. </span>那么在程序出错的时候<span lang=EN-US>. drwtsn32.exe </span>会写一个<span lang=EN-US> userdump. </span>但<span lang=EN-US> drwtsn32 </span>有些缺点<span lang=EN-US>. </span>比如只能写一个<span lang=EN-US> dump </span>文件<span lang=EN-US>. </span>后面的崩溃写<span lang=EN-US> dump </span>文件时会覆盖前面的<span lang=EN-US>. win2000 </span>下的<span lang=EN-US> drwtsn32 </span>只能写旧式的<span lang=EN-US> dump </span>文件<span lang=EN-US>(</span>往往尺寸比较大<span lang=EN-US>). </span>有一篇文章论述的比较清楚<span lang=EN-US>:<br>&nbsp;<a href="http://www.debuginfo.com/articles/ntsdwatson.html">http://www.debuginfo.com/articles/ntsdwatson.html</a><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt">建议使用<span lang=EN-US> ntsd </span>代替<span lang=EN-US> drwtsn32. </span>但<span lang=EN-US> ntsd </span>的缺点就是需要安装最新的<span lang=EN-US> windbg. </span>这是一个硬伤<span lang=EN-US>. </span>在看了<span lang=EN-US> debuginfo.com </span>的另一篇文章<span lang=EN-US>:<br>&nbsp;<a href="http://www.debuginfo.com/articles/effminidumps.html">http://www.debuginfo.com/articles/effminidumps.html</a><br>&nbsp;<br></span>之后<span lang=EN-US>, </span>我选择的是在程序出错的时候调用<span lang=EN-US> api </span>自己写<span lang=EN-US> minidump. </span>克服了<span lang=EN-US> drwtsn32, ntsd </span>的缺点<span lang=EN-US>. <br></span>将封装好的函数放到了一个头文件中<span lang=EN-US>, </span>包含即可<span lang=EN-US>. </span>使用的方法很简单<span lang=EN-US>:<o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt" lang=EN-US>#include &lt;windows.h&gt;<br>#include "minidump.h"<br>LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)<br>{<br>CreateMiniDump(pExceptionInfo, "c:\\user.dmp");<br>return EXCEPTION_EXECUTE_HANDLER;<br>}<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt" lang=EN-US>void main()<br>{<br>SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);<br>*(int*)0=0; // AV<br>}<o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt">这样就好了<span lang=EN-US>. </span>注意安装至少<span lang=EN-US> xp </span>以上的<span lang=EN-US> sdk.<br></span>这里用到了一个<span lang=EN-US> api SetUnhandledExceptionFilter(), </span>如果不明白可以搜一下<span lang=EN-US> msdn.<br></span>运行例子程序出错退出之后<span lang=EN-US>, </span>就得到了<span lang=EN-US> c:\\user.dmp. </span>可以用<span lang=EN-US> windbg </span>等调试器来分析了<span lang=EN-US>.&nbsp; <o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%; MARGIN: 12pt 0cm 6pt; BACKGROUND: #eeeedd; WORD-BREAK: break-all" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt">代码从这里下载 <span lang=EN-US><a href="http://nicoster.googlepages.com/minidump.rar">http://nicoster.googlepages.com/minidump.rar</a><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-21 18:50 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/21/99130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005中SetUnhandledExceptionFilter函数应用</title><link>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99129.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 21 Oct 2009 10:47:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99129.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/99129.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/10/21/99129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/99129.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/99129.html</trackback:ping><description><![CDATA[<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 24pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">很多软件通过设置自己的异常捕获函数，捕获未处理的异常，生成报告或者日志（例如生成<span lang=EN-US>mini-dump</span>文件），达到<span lang=EN-US>Release</span>版本下追踪<span lang=EN-US>Bug</span>的目的。但是，到了<span lang=EN-US>VS2005</span>（即<span lang=EN-US>VC8</span>），<span lang=EN-US>Microsoft</span>对<span lang=EN-US>CRT</span>（<span lang=EN-US>C</span>运行时库）的一些与安全相关的代码做了些改动，典型的，例如增加了对缓冲溢出的检查。新<span lang=EN-US>CRT</span>版本在出现错误时强制把异常抛给默认的调试器（如果没有配置的话，默认是<span lang=EN-US>Dr.Watson</span>），而不再通知应用程序设置的异常捕获函数，这种行为主要在以下三种情况出现。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -36pt; MARGIN: 0cm 6pt 0pt 63pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">（<span lang=EN-US>1</span>）</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">调用<span lang=EN-US>abort</span>函数，并且设置了<span lang=EN-US>_CALL_REPORTFAULT</span>选项（这个选项在<span lang=EN-US>Release</span>版本是默认设置的）。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -36pt; MARGIN: 0cm 6pt 0pt 63pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">（<span lang=EN-US>2</span>）</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">启用了运行时安全检查选项，并且在软件运行时检查出安全性错误，例如出现缓存溢出。（安全检查选项<span lang=EN-US> /GS </span>默认也是打开的）<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: -36pt; MARGIN: 0cm 6pt 0pt 63pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">（<span lang=EN-US>3</span>）</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">遇到<span lang=EN-US>_invalid_parameter</span>错误，而应用程序又没有主动调用<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 63pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>_set_invalid_parameter_handler</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">设置错误捕获函数。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; TEXT-INDENT: 24pt; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">所以结论是，使用<span lang=EN-US>VS2005</span>（<span lang=EN-US>VC8</span>）编译的程序，许多错误都不能在<span lang=EN-US>SetUnhandledExceptionFilter</span>捕获到。这是<span lang=EN-US>CRT</span>相对于前面版本的一个比较大的改变，但是很遗憾，<span lang=EN-US>Microsoft</span>却没有在相应的文档明确指出。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 15.6pt 6pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-para-margin-top: 1.0gd; mso-para-margin-right: 6.0pt; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 6.0pt" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: red; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">解决方法</span></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">之所以应用程序捕获不到那些异常，原因是因为新版本的<span lang=EN-US>CRT</span>实现在异常处理中强制删除所有应用程序先前设置的捕获函数，如下所示：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>/* Make sure any filter already in place is deleted. */ <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>SetUnhandledExceptionFilter(NULL); <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>UnhandledExceptionFilter(&amp;ExceptionPointers); <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">解决方法是拦截<span lang=EN-US>CRT</span>调用<span lang=EN-US>SetUnhandledExceptionFilter</span>函数，使之无效。在<span lang=EN-US>X86</span>平台下，可以使用以下代码。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>#ifndef _M_IX86<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#error "The following code only works for x86!"<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>#endif<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>void DisableSetUnhandledExceptionFilter()<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>{<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt 27pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"SetUnhandledExceptionFilter");<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if (addr) <o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unsigned char code[16];<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int size = 0;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>code[size++] = 0x33;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>code[size++] = 0xC0;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>code[size++] = 0xC2;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>code[size++] = 0x04;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>code[size++] = 0x00;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1">&nbsp; </span><span style="mso-spacerun: yes">&nbsp; </span>DWORD dwOldFlag, dwTempFlag;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VirtualProtect(addr, size, PAGE_READWRITE, &amp;dwOldFlag);<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VirtualProtect(addr, size, dwOldFlag, &amp;dwTempFlag);<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>}<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">在设置自己的异常处理函数后，调用<span lang=EN-US>DisableSetUnhandledExceptionFilter</span>禁止<span lang=EN-US>CRT</span>设置即可。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 15.6pt 6pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan; mso-para-margin-top: 1.0gd; mso-para-margin-right: 6.0pt; mso-para-margin-bottom: 1.0gd; mso-para-margin-left: 6.0pt" class=MsoNormal align=left><strong style="mso-bidi-font-weight: normal"><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: red; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">其它讨论</span></strong><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">上面通过设置<span lang=EN-US>api hook</span>，解决了在<span lang=EN-US>VS2005</span>上的异常捕获问题，这种虽然不是那么&#8220;干净&#8221;的解决方案，确是目前唯一简单有效的方式。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; MARGIN: 0cm 6pt 0pt; BACKGROUND: white; WORD-BREAK: break-all; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">虽然也可以通过<span lang=EN-US>_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), </span>和<span lang=EN-US>_set_invalid_parameter_handler(...) </span>解决（<span lang=EN-US>1</span>）（<span lang=EN-US>3</span>），但是对于（<span lang=EN-US>2</span>），设置<span lang=EN-US>api hook</span>是唯一的方式。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/99129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-10-21 18:47 <a href="http://www.cppblog.com/woaidongmao/archive/2009/10/21/99129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>