﻿<?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++博客-Robertxiao-文章分类-Debug</title><link>http://www.cppblog.com/Robertxiao/category/17289.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 29 Aug 2011 10:51:03 GMT</lastBuildDate><pubDate>Mon, 29 Aug 2011 10:51:03 GMT</pubDate><ttl>60</ttl><item><title>Debuging Tool Set（2）:启动调试器</title><link>http://www.cppblog.com/Robertxiao/articles/150790.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Sat, 27 Aug 2011 10:39:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/150790.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/150790.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/150790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/150790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/150790.html</trackback:ping><description><![CDATA[<p>在上节中，我们设置好了符号服务器，接下来我们可以启动调试器了。<br />语法如下<br />[cdb |ntsd |windbg] 后面接下面的选项<br />&nbsp;[<strong>-server</strong> <em>ServerTransport</em>&nbsp; 创建一个可以用其他调试器访问的调试服务器]</p>
<p>&nbsp;[<strong>-remote</strong> <em>ClientTransport</em>&nbsp; 创建一个调试客户端，并连接到已经运行的调试服务器上]</p>
<p><br />&nbsp;[-o(指示其子进程也加入进入调试集合)]<br />&nbsp;[-pn 执行进程名(该进程已处于运行并且只有一份)]<br />&nbsp;[-psn 执行服务名]<br />&nbsp;[-p 执行进程Id，十进制]<br />&nbsp;[-y 符号路径]<br />&nbsp;[-pv 以无侵入的方式加入调试]<br />&nbsp;[-log{a|o} 以附加或者重写方式写日志]<br />&nbsp;[可执行文件名，参数。须位于最后]<br /><br />内核调试方法有通过1394线连接调试，也有通过虚拟机管道来调试。下面以VMWARE虚拟机来介绍管道调试方法。<br /><span style="color: #0000ff">设置虚拟机：</span>首先打开XP虚拟机的设备编辑页面，添加一个串口设备，设备状态选中连接和在启动连接两个选项。在下面选择使用命名管道，名字设置为<a href="file://\\.\pipe\com_1">\\.\pipe\com_1</a>，并选择下面两个下拉框中分别选中&#8221;本机是服务端&#8220;和另外的机器是虚拟机。<br /><span style="color: #0000ff">设置主机：</span>如果被调试机器是NT6.0以前的系统，那么在系统盘启动分区的boot.ini文件中加入启动调试的支持，在[operating systems]节下加入调试版启动项<br />multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200<br />启动时再选择相应的调试版就可以进入到内核调试态。如果目标机器的操作系统是NT6.0C之后的那么就要使用BCDEDIT来加启动项。<br /><span style="color: #0000ff">设置调试机：</span>调试方输入以下的命令就可以和被调试系统连上。<br />路径windbg.exe&nbsp; -b -k com:port=\\.\pipe\com_1,baud=115200,pipe<br />路径KD.exe&nbsp; -b -k com:port=\\.\pipe\com_1,baud=115200,pipe<br /><br /><br /><br /></p><img src ="http://www.cppblog.com/Robertxiao/aggbug/150790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-08-27 18:39 <a href="http://www.cppblog.com/Robertxiao/articles/150790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debuging Tool Set（7 ）：线程和进程</title><link>http://www.cppblog.com/Robertxiao/articles/152842.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Tue, 09 Aug 2011 01:54:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/152842.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/152842.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/152842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/152842.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/152842.html</trackback:ping><description><![CDATA[<div><strong style="color: #0000ff">系统状态</strong><strong><br /></strong>The double vertical bar (<strong>||</strong>) command prints status for the specified system or for all systems that you are currently debugging.<strong>||</strong>&nbsp;<em>[ |* | .| # |系统号]<br /></em>
<p>The <strong>||s</strong> command sets or displays the current system number.</p><strong>||</strong><em>System</em>&nbsp;<strong>s</strong>&nbsp;<br /><br /><span style="color: #000000">在WINDBG 等调试器中，进程和线程的语法分为内核模式和用户模式两种。我先来总结一下用户态模式</span><br /><strong style="color: #0000ff">进程相关</strong><strong><br /></strong>The pipe (<strong>|</strong>) command displays status for the specified process, or for all processes that you are currently debugging.｜ [ |*|.|#|进程号]<br />
<p>The <strong>|s</strong> command sets or displays the current process number.<br /><strong>|</strong><em>Process</em>&nbsp;<strong>s</strong>&nbsp;<br /><br /><strong style="color: #0000ff">线程相关</strong><strong><br /></strong>～ [* | .|#|thread NO.]&nbsp; 显示线程<br />The <strong>~e</strong> command executes one or more commands for a specific thread or for all threads in the target process.<br />～Thread e commandstring<br />在指定的线程上执行指定的命令这个语法，在有时我们会省略e，如显示2线程的堆栈。～2 K<br /><br />冻结和解冻结线程。<br />The <strong>~f</strong> command freezes the given thread, causing it to stop and wait until it is unfrozen.<br /><nobr><strong>~</strong><em>Thread</em>&nbsp;<strong>f</strong>&nbsp;<br />The <strong>~u</strong> command unfreezes the specified thread.<br /></nobr><nobr><strong>~</strong><em>Thread</em>&nbsp;<strong>u<br /><br /></strong>挂起和恢复线程的执行<br />The <strong>~n</strong> command suspends execution of the specified thread.</nobr><nobr></p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"></nobr></nobr><nobr><strong>~</strong><em>Thread</em>&nbsp;<strong>n</strong>&nbsp;<br /></p>
<p>The <strong>~m</strong> command resumes execution of the specified thread.</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><strong>~</strong><em>Thread</em>&nbsp;<strong>m</strong></nobr><nobr></p>
<p><nobr><br />设置当前线程<br />The <strong>~s</strong> command sets or displays the current thread number. <br />~Thread s<br />这个命令在内核模式中表示的是设置当前的处理器。<br /><br />有了上面的调试命令，只要我们善加利用，就可以控制调试目标的运行，进而达到排错查错的目的。</p>
<p><br />&nbsp;</p>
<p></nobr><nobr><nobr><br /></nobr>&nbsp;</p>
<p>&nbsp;</p></div><img src ="http://www.cppblog.com/Robertxiao/aggbug/152842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-08-09 09:54 <a href="http://www.cppblog.com/Robertxiao/articles/152842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debuging Tool Set（6 ）：debug event</title><link>http://www.cppblog.com/Robertxiao/articles/152191.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Mon, 01 Aug 2011 01:32:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/152191.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/152191.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/152191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/152191.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/152191.html</trackback:ping><description><![CDATA[<div>在我们用调试器打开或者附加调试目标之后，目标进程就处于调试环境中了。而调试器通常是用createprocess方法以debug模式来打开目标进程。从此目标进程中所发生的各种事件都会由操作系统派发到调试器中来，如下就是目标进程可能会产生的事件。<br />cpr:就是创建目标进程的事件，也就是第一个事件。<br />exp:退出目标进程的事件，也是最后一个事件。<br />ct:创建线程的事件。<br />et:退出进程的事件。<br />ld:加载模块到进程地址空间之后还没有执行。<br />ud:调用freeLibrary的缷载模块的事件。<br />有关调试目标的更多的事件，可以输入sx以查看。每一列是事件名，第二例是事件的简短描述，第三例是缺省的处理方式。也可以单击windbg中的debug菜单中的event fileter项来打开对话框窗口来设置更多的细节。<br />在调试环境中，对各种事件的处理方式提供了缺省的处理方式。我们也可以在调试过程中，根据需要改变相应的处理方式。<br />比如<br />我们想在内核载入driver1.sys驱动模块后停止以帮助我们下断点。<br />kd:sxe ld:driver1.sys<br />我们不关心载入driver2.sys驱动模块的事件。<br />kd: sxd ld:driver2.sys<br />我们忽略所有模块的载入输出信息<br />kd:sxi ld:*<br /><br />当我们使用sxd时，相应事件的输出信息是会输出到调试环境中，但不会断下来。而使用sxi时，则调试器不接收相应的消息，也没有输出信息在窗口中输出。<br /><br /></div><img src ="http://www.cppblog.com/Robertxiao/aggbug/152191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-08-01 09:32 <a href="http://www.cppblog.com/Robertxiao/articles/152191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debuging Tool Set（5 ）：改变上下文</title><link>http://www.cppblog.com/Robertxiao/articles/151993.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Thu, 28 Jul 2011 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/151993.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/151993.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/151993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/151993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/151993.html</trackback:ping><description><![CDATA[<div>在上一篇中，叙述了多种断点类型以及设置断点的命令。在这一节中，主要讲解各种改变上下文的指令。这些指令包括单步步入，单步不步入，运行指令。<br /><br /><strong style="color: #0000ff; font-size: 18pt">t(Trace) 单步步入</strong><strong><br /></strong>
<p><strong>t</strong> 命令执行单条指令或源码行，并选择性的显示所有寄存器和标志位的结果。当发生子过程调用或中断时，它们的每一步也会被跟踪。<br /></p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>t</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>t</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p>ta 命令执行到指定的地址<br />用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>ta</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;<em>StopAddress</em>&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>ta</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;<em>StopAddress</em>&nbsp;<br /></nobr></p>
<p><strong><br />tb</strong> 命令执行程序直到遇到分支指令</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>tb</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>tc</strong>命令执行程序直到到达call指令。</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>tc</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>tc</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>tct</strong> 命令执行程序直到遇到call指令或return指令。</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>tct</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>tct</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>th </strong>命令继续执行程序直到到达任何种类的分支指令，包括条件或非条件跳转、调用、返回和系统调用。</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>th</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>th</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>tt </strong>命令执行程序直到遇到return指令。</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>tt</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>tt</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;<br /></nobr></p>
<p><br /><span style="color: #0000ff; font-size: 18pt">P （STEP）单步不步入</span></p>
<p><strong>p </strong>命令执行一条指令或者一行源码，并且选择性的显示所有寄存器和标志位的结果。当发生子函数调用或中断时，他们被当作单独的一步。<br /></p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>p</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>p</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]&nbsp;</nobr>&nbsp;</p>
<p><strong><br />pa</strong>命令执行程序直到到达指定地址，每一步都会被显示出来。</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>pa</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;<em>StopAddress</em>&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>pa</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;<em>StopAddress</em>&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>pc</strong>执行程序直到到达一条call指令。</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>pc</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>pc</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr></p><br />
<p><strong>pct</strong> 命令执行程序，直到遇到call指令或返回指令。<br /></p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>pct</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>pct</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>ph</strong>命令执行程序直到遇到任何种类的分支指令，包括条件或非条件跳转、调用、返回和系统调用。</p>
<p>&nbsp;</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>ph</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>ph</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;</nobr></p>
<p>&nbsp;</p>
<p><strong>pt </strong>命令执行程序直到遇到返回指令。</p>
<p>&nbsp;</p>
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>pt</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]</nobr>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>pt</strong>&nbsp;[<strong>r</strong>]&nbsp;[=&nbsp;<em>StartAddress</em>]&nbsp;[<em>Count</em>]&nbsp;[<strong>"</strong><em>Command</em><strong>"</strong>]<br /></nobr></p>
<p><strong style="color: #0000ff; font-size: 18pt"><br />g (Go)<br /></strong>命令开始指定进程或线程的执行。这种执行将会在程序结束、遇到<em>BreakAddress</em> 或者其他造成调试器停止的事件发生时停止。<br /></p>
<p>用户模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>g</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;</nobr>&nbsp;</p>
<p>内核模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>g</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>gc </strong>命令使用和<span style="background-color: #00ccff">遇到断点时一样的方式(单步、跟踪或自由执行)</span>来从一个条件断点恢复执行。也就是原来是pt,则现在还是pt. 常用于条件断点中，关于条件断点，以后会讲。<br /></p>
<p><strong>gh</strong>命令将给定线程的异常标识为已处理，并且允许该线程从产生异常的指令继续执行。<br /></p>
<p>用户模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>gh</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;</nobr>&nbsp;</p>
<p>内核模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>gh</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p><strong>gn</strong>和<strong>gN</strong> 命令继续给定线程的执行，但是不将异常标记为已处理。这样使得应用程序的异常处理器可以处理该异常。</p>
<p>用户模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>gn</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;<br />[<strong>~</strong><em>Thread</em>]&nbsp;<strong>gN</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;</nobr>&nbsp;</p>
<p>内核模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>gn</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;<br /><strong>gN</strong>[<strong>a</strong>]&nbsp;[<strong>=</strong>&nbsp;<em>StartAddress</em>]&nbsp;[<em>BreakAddress</em>&nbsp;...&nbsp;[;&nbsp;<em>BreakCommands</em>]]&nbsp;<br /><br /></nobr></p>
<p><strong><br />gu</strong>命令使得目标继续执行直到当前函数完成。<br /></p>
<p>用户模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>gu</strong>&nbsp;</nobr>&nbsp;</p>
<p>内核模式语法</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>gu</strong>&nbsp;<br /></nobr></p>
<p>&nbsp;</p></div><img src ="http://www.cppblog.com/Robertxiao/aggbug/151993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-07-28 16:20 <a href="http://www.cppblog.com/Robertxiao/articles/151993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debuging Tool Set（4 ）：断点命令</title><link>http://www.cppblog.com/Robertxiao/articles/151178.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Sat, 16 Jul 2011 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/151178.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/151178.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/151178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/151178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/151178.html</trackback:ping><description><![CDATA[与断点相关的命令<br />bl： 列出所有的断点<br />be (断点ID|符号区配符)：启用断点<br />bd(断点ID|符号区配符)：禁用断点<br />bc(断点ID|符号区配符)：清除断点<br /><strong>br</strong>&nbsp;<em>OldID&nbsp;NewID&nbsp;</em>[<em>OldID2&nbsp;NewID2</em>&nbsp;...]&nbsp;<br /><br /><span style="color: #0000ff">数据断点</span><br />
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>ba</strong>[<em>ID</em>]&nbsp;<em>Access</em>&nbsp;<em>Size</em>&nbsp;[<em>Options</em>]&nbsp;[<em>Address</em>&nbsp;[<em>Passes</em>]]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]&nbsp;<br /></nobr></p>
<p>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>ba</strong>[<em>ID</em>]&nbsp;<em>Access</em>&nbsp;<em>Size</em>&nbsp;[<em>Options</em>]&nbsp;[<em>Address</em>&nbsp;[<em>Passes</em>]]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]&nbsp;<br /></nobr></p><br /><span style="color: #0000ff">软断点</span><br />
<p>用户模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr>[<strong>~</strong><em>Thread</em>]&nbsp;<strong>bp</strong>[<em>ID</em>]&nbsp;[<em>Options</em>]&nbsp;[<em>Address</em>&nbsp;[<em>Passes</em>]]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]&nbsp;<br />[<strong>~</strong><em>Thread</em>]&nbsp;<strong>bu</strong>[<em>ID</em>]&nbsp;[<em>Options</em>]&nbsp;[<em>Address</em>&nbsp;[<em>Passes</em>]]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]&nbsp;<br />[<strong>~</strong><em>Thread</em>]&nbsp;<strong>bm</strong>&nbsp;[<em>Options</em>]&nbsp;<em>SymbolPattern</em>&nbsp;[<em>Passes</em>]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]<br /></nobr></p>
<p>&nbsp;</p>
<p>内核模式</p>
<p style="padding-bottom: 2pt; padding-left: 4pt; padding-right: 4pt; font: 100% Courier New, Courier, mono;background: #dddddd; cursor: text; padding-top: 2pt"><nobr><strong>bp</strong>[<em>ID</em>]&nbsp;[<em>Options</em>]&nbsp;[<em>Address</em>&nbsp;[<em>Passes</em>]]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]&nbsp;<br /><strong>bu</strong>[<em>ID</em>]&nbsp;[<em>Options</em>]&nbsp;[<em>Address</em>&nbsp;[<em>Passes</em>]]&nbsp;[<strong>"</strong><em>CommandString</em><strong>"</strong>]&nbsp;<br /><strong>bm</strong>&nbsp;[Options]&nbsp;SymbolPattern&nbsp;[Passes]&nbsp;[<strong>"</strong>CommandString<strong>"</strong>]<br /></nobr></p>
<dt><em>Options</em> 
<dd>指定断点选项。除非特别指出，可以设置任意数量的下面的选项： 
<dl>
<dt><strong>/1</strong> 
<dd>创建一个一次性("one-shot")断点。该断点触发之后就会被从断点列表中永远去除。 
<dt><strong>/f</strong> <em>PredNum</em> 
<dd><em>(仅Itanium、仅用户模式) </em>指定一个断言号。该断点使用相应的断言寄存器(predicate register)进行判定(例如，<strong>bp /f 4 address</strong>设置一个使用<strong>p4</strong>断言寄存器进行判定的断点)。关于断言寄存器的更多信息，查看<a href="http://www.dbgtech.net/windbghelp/hh/debugger/t10_arch_ia64_058d30c8-b157-4fed-8317-371ffe0d0942.xml.htm">Itanium结构体系</a>。 
<dt><strong>/p</strong> <em>EProcess</em> 
<dd><em>(仅内核模式) </em>指定一个和该断点关联的进程。<em>EProcess</em> 必须是EPROCESS结构的实际地址，而不是PID。这种断点仅在指定的进程上下文内遇到的时候才会触发。 
<dt><strong>/t</strong> <em>EThread</em> 
<dd><em>(仅内核模式)</em> 指定一个和断点关联的线程。<em>EThread</em>必须是ETHREAD结构的实际地址而不是线程ID。这种断点仅在指定的线程上下文内遇到的时候才会触发。如果同时使用<strong>/p </strong><em>EProcess</em> 和<strong>/t</strong> <em>EThread</em> ，它们可以按任意顺序排列。 
<dt><strong>/c</strong> <em>MaxCallStackDepth</em> 
<dd>使得断点仅当调用堆栈小于<em>MaxCallStackDepth</em> 深度时才激活。不能将此选项和<strong>/C</strong> 组合使用。 
<dt><strong>/C</strong> <em>MinCallStackDepth</em> 
<dd>使得断点仅当调用堆栈大于<em>MinCallStackDepth</em>深度时才激活。不能将此选项和<strong>/c </strong>组合使用。 
<dt><strong>/a</strong> 
<dd><em>(仅<strong>bm</strong> 使用) </em>在所有指定位置设置断点，不管他们在数据空间还是代码空间。由于数据上的断点可能造成程序错误，所以只能在确认安全的位置使用该选项。 
<dt><strong>/d</strong> 
<dd><em>(仅<strong>bm</strong> 使用)</em> 将断点位置转换为地址。因此，如果代码位置改变了，这个断点还是保持在原来的位置，而不是像使用<em>SymbolPattern</em> 来设置的一样。使用<strong>/d </strong>来避免模块加载或重加载时重新求值对断点进行的改变。 
<dt><strong>/(</strong> 
<dd><em>(仅<strong>bm </strong>使用) </em>在<em>SymbolString</em> 定义的符号字符串中包含参数列表信息。&nbsp; 
<p>这个功能使得可以对具有相同名字但是不同参数列表的重载函数设置断点。例如， <strong>bm /( myFunc</strong> 同时在<strong>myFunc(int a)</strong>和<strong>myFunc(char a)</strong>上设置断点。如果没有"/("，对<strong>myFunc</strong> 设置的断点会失败，因为这样不能确定断点设置到哪一个<strong>myFunc</strong> 上。<br /><br /></p>
<p>&nbsp;</p>
<p><strong>bp</strong>、<strong>bu</strong>和<strong>bm</strong> 命令设置新断点，但是它们有不同的特点：</p>
<ul type="disc"><li><strong>bp (Set Breakpoint)</strong>命令在指定<em>地址</em>的断点位置上设置断点。如果设置断点时调试器还不能将地址表达式计算为断点位置，<strong>bp</strong> 断点被自动转换为<strong>bu</strong> 断点。使用<strong>bp</strong> 命令来设置在模块被卸载之后就不会再被激活的断点。</li><li><strong>bu (Set Unresolved Breakpoint)</strong>命令设置<em>延迟的</em>或<a href="http://www.dbgtech.net/windbghelp/hh/debugger/r07_use_operation_b31049a1-efde-4f99-b82d-f47c3c7daf64.xml.htm#3a87f521-a016-43a6-bc5f-820bfd4fa0c4"><em>未定断点</em></a>。<strong>bu </strong>设置在命令中指定的符号引用的断点位置上(不是一个地址上)，并且当所引用的模块能够确定时激活。</li><li><strong>bm (Set Symbol Breakpoint)</strong> 命令在能够匹配指定模板的符号上设置断点。该命令可以设置多于一个的断点。默认情况下，当模板被匹配之后，<strong>bm</strong> 断点和<strong>bu</strong> 断点相同。</li></ul>
<p>&nbsp;</p></dd></dl></dd><img src ="http://www.cppblog.com/Robertxiao/aggbug/151178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-07-16 17:58 <a href="http://www.cppblog.com/Robertxiao/articles/151178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debuging Tool Set（3）：设置源文件路径</title><link>http://www.cppblog.com/Robertxiao/articles/151175.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Sat, 16 Jul 2011 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/Robertxiao/articles/151175.html</guid><wfw:comment>http://www.cppblog.com/Robertxiao/comments/151175.html</wfw:comment><comments>http://www.cppblog.com/Robertxiao/articles/151175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Robertxiao/comments/commentRss/151175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Robertxiao/services/trackbacks/151175.html</trackback:ping><description><![CDATA[<div>WINDBG调试工具一般以调试汇编码的方式调试程序，但同时也可以对C++进行源码调试。在汇编调试模式下，一次运行的是一个汇编指令。在源码调试模式下一次单步运行的是一个C++语句。要进行源码调试，就须有私有符号文件，并且要有相应的源文件。在有了上面的资源后，我们需要设定源文件搜索目录。<br />.srcpath&nbsp; 源文件路径<br />.srcpath+ 源文件径<br />.srcnoise [1|0] 打开或关闭搜索源文件夹的输出信息<br />.srcfix 源文件服务器</div><img src ="http://www.cppblog.com/Robertxiao/aggbug/151175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Robertxiao/" target="_blank">Robertxiao</a> 2011-07-16 17:26 <a href="http://www.cppblog.com/Robertxiao/articles/151175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>