WinDbg常用命令系列---单步执行p*
p (Step)
p命令执行单个指令或源代码行,并可选地显示所有寄存器和标志的结果值。当子例程调用或中断发生时,它们被视为单个步骤。
用户模式:
[~Thread] p[r] [= StartAddress] [Count] ["Command"]
内核模式:
p[r] [= StartAddress] [Count] ["Command"]
参数:
- Thread
指定要继续执行的线程。所有其他线程都被冻结。只能在用户模式下指定线程。 - r
打开和关闭寄存器和标志的显示。默认情况下,将显示寄存器和标志。可以使用pr、tr或.prompt_allow-reg命令禁用寄存器显示。所有这三个命令都控制着相同的设置,您可以使用它们中的任何一个来覆盖以前对这些命令的任何使用。也可以使用l-os命令禁用寄存器显示。此设置与其他三个命令不同。要控制显示哪些寄存器和标志,请使用rm (Register Mask)命令。
- StartAddress
指定执行应开始的地址。如果不使用startaddress,则从指令指针指向的指令开始执行 - Count
指定停止前要单步执行的指令或源行数。每个步骤在调试器命令窗口中显示为单独的操作。默认值为1。 - Command
指定要在执行步骤后执行的调试器命令。此命令在显示标准p结果之前执行。如果还使用count,则在所有步骤完成后(但在显示最后一步的结果之前)执行指定的命令。
当您指定count时,每个指令都会在单步执行时显示出来。如果调试器在单步执行时遇到调用指令或中断,则被调用的子例程将完全执行,除非遇到断点。在调用或中断后的下一条指令中,控件将返回给调试器。每个步骤执行单个汇编指令或单个源行,这取决于调试器是处于汇编模式还是源模式。使用l+t和l-t命令或windbg工具栏上的按钮在这些模式之间切换。当您在windbg中多次快速单步执行时,调试信息窗口将在每个步骤之后更新。如果此更新导致响应时间变慢,请使用.suspend_ui (Suspend WinDbg Interface)暂时暂停刷新这些窗口。
pa (Step to Address)
pa命令执行程序,直到到达指定的地址,显示每个步骤。
用户模式:
[~Thread] pa [r] [= StartAddress] StopAddress ["Command"]
内核模式:
pa [r] [= StartAddress] StopAddress ["Command"]
参数:
- Thread
指定要继续执行的线程。所有其他线程都被冻结。只能在用户模式下指定线程。
- r
打开和关闭寄存器和标志的显示。默认情况下,将显示寄存器和标志。可以使用pr、tr或.prompt_allow-reg命令禁用寄存器显示。所有这三个命令都控制着相同的设置,您可以使用它们中的任何一个来覆盖以前对这些命令的任何使用。也可以使用l-os命令禁用寄存器显示。此设置与其他三个命令不同。要控制显示哪些寄存器和标志,请使用rm (Register Mask)命令。
- StartAddress
指定执行应开始的地址。如果不使用startaddress,则从指令指针指向的指令开始执行。
- StopAddress
指定停止执行的地址。此地址必须与指令的确切地址匹配。
- Command
指定要在执行步骤后执行的调试器命令。此命令在显示标准p结果之前执行。如果还使用count,则在所有步骤完成后(但在显示最后一步的结果之前)执行指定的命令。
pa命令使目标开始执行。此执行将继续,直到到达指定的指令或遇到断点。如果在内核模式下使用此命令,则当在任何虚拟地址空间中的指定虚拟地址处遇到指令时,执行将停止。在此执行期间,所有步骤都将显式显示。被调用函数被视为单个单元。因此,此命令的显示与重复执行p(step)直到程序计数器到达指定地址时所看到的类似。
例如,下面的命令显式地遍历目标代码,直到到达当前函数的返回地址。
0:000> pa @$ra
下面的示例演示如何使用pa命令和kb命令来显示堆栈跟踪:
0:000> pa 70b5d2f1 "kb"
pc (Step to Next Call)
pc命令执行程序,直到到达调用指令。
用户模式:
[~Thread] pc [r] [= StartAddress] [Count]
内核模式:
pc [r] [= StartAddress] [Count]
参数:
- Thread
指定要继续执行的线程。所有其他线程都被冻结。只能在用户模式下指定线程。 - r
打开和关闭寄存器和标志的显示。默认情况下,将显示寄存器和标志。可以使用pr、tr或.prompt_allow-reg命令禁用寄存器显示。所有这三个命令都控制着相同的设置,您可以使用它们中的任何一个来覆盖以前对这些命令的任何使用。也可以使用l-os命令禁用寄存器显示。此设置与其他三个命令不同。要控制显示哪些寄存器和标志,请使用rm (Register Mask)命令。 - StartAddress
指定调试器开始执行的地址。否则,调试器从指令指针指向的指令开始。 - Count
指定调试器要停止此命令必须遇到的调用指令数。默认值为1。
pc命令使目标开始执行。此执行将继续,直到达到调用指令或遇到断点。如果程序计数器已经在调用指令上,则执行整个调用。返回此调用后,将继续执行,直到到达另一个调用。这个调用的执行,而不是跟踪,是pc和tc(跟踪到下一个调用)之间的唯一区别。在源代码模式下,可以将一个源代码行与多个程序集指令相关联。pc命令不会在与当前源行关联的调用指令处停止。
ph (Step to Next Branching Instruction)
ph命令执行程序,直到到达任何类型的分支指令,包括条件或无条件分支、调用、返回和系统调用。
用户模式:
[~Thread] ph [r] [= StartAddress] [Count]
内核模式:
ph [r] [= StartAddress] [Count]
参数:
- Thread
指定要继续执行的线程。所有其他线程都被冻结。只能在用户模式下指定线程。 - r
打开和关闭寄存器和标志的显示。默认情况下,将显示寄存器和标志。可以使用pr、tr或.prompt_allow-reg命令禁用寄存器显示。所有这三个命令都控制着相同的设置,您可以使用它们中的任何一个来覆盖以前对这些命令的任何使用。也可以使用l-os命令禁用寄存器显示。此设置与其他三个命令不同。要控制显示哪些寄存器和标志,请使用rm (Register Mask)命令。 - StartAddress
指定调试器开始执行的地址。否则,调试器从指令指针指向的指令开始。 - Count
指定要停止此命令必须遇到的分支指令数。默认值为1。
ph命令使目标开始执行。此执行将继续执行,直到达到分支指令或遇到断点为止。如果程序计数器已经在分支指令上,则执行整个分支指令。返回此分支指令后,继续执行,直到到达另一个分支指令。调用的这种执行而不是跟踪是ph和th(跟踪到下一个分支指令)之间的唯一区别。在源模式下,可以将一个源行与多个汇编指令关联。ph命令不会在与当前源行关联的分支指令处停止。
pt (Step to Next Return)
Pt命令执行程序,直到达到返回指令。
用户模式:
[~Thread] pt [r] [= StartAddress] [Count] ["Command"]
内核模式:
pt [r] [= StartAddress] [Count] ["Command"]
参数:
- Thread
指定要继续执行的线程。所有其他线程都被冻结。只能在用户模式下指定线程。 - r
打开和关闭寄存器和标志的显示。默认情况下,将显示寄存器和标志。可以使用pr、tr或.prompt_allow-reg命令禁用寄存器显示。所有这三个命令都控制着相同的设置,您可以使用它们中的任何一个来覆盖以前对这些命令的任何使用。也可以使用l-os命令禁用寄存器显示。此设置与其他三个命令不同。要控制显示哪些寄存器和标志,请使用rm (Register Mask)命令。 - StartAddress
指定调试器开始执行的地址。否则,调试器从指令指针指向的指令开始。 - Count
指定要停止此命令必须遇到的返回指令数。默认值为1。 - Command
指定要在执行步骤后执行的调试器命令。此命令在显示标准pt结果之前执行。如果还使用count,则在所有步骤完成后(但在显示最后一步的结果之前)执行指定的命令。
pt命令将导致目标开始执行。 此执行将继续,直至返回达到指令或遇到断点。如果已经打开的程序计数器返回执行指令,整个返回。 返回此返回后,执行将继续,直到另一个返回为止。 此执行,而不是跟踪,在调用之间的唯一区别是pt并 tt (到下一步返回的 Trace)。源模式中,可以将一个源行与多个程序集指令相关联。 pt命令不会停止处返回与当前的源行相关联的指令。
pct (Step to Next Call or Return)
pct命令执行程序,直到它到达调用指令或返回指令。
用户模式:
[~Thread] pct [r] [= StartAddress] [Count]
内核模式:
pct [r] [= StartAddress] [Count]
参数:
- Thread
指定要继续执行的线程。所有其他线程都被冻结。只能在用户模式下指定线程。 - r
打开和关闭寄存器和标志的显示。默认情况下,将显示寄存器和标志。可以使用pr、tr或.prompt_allow-reg命令禁用寄存器显示。所有这三个命令都控制着相同的设置,您可以使用它们中的任何一个来覆盖以前对这些命令的任何使用。也可以使用l-os命令禁用寄存器显示。此设置与其他三个命令不同。要控制显示哪些寄存器和标志,请使用rm (Register Mask)命令。 - StartAddress
指定调试器开始执行的地址。否则,调试器从指令指针指向的指令开始。 - Count
指定要停止此命令必须遇到的调用或返回指令数。默认值为1。
pct命令使目标开始执行。此执行将继续,直到达到调用或返回指令或遇到断点为止。如果程序计数器已经在调用或返回指令上,则执行整个调用或返回。返回此调用或返回后,将继续执行,直到到达另一个调用或返回为止。这个调用的执行,而不是跟踪,是pct和tct(跟踪到下一个调用或返回)之间的唯一区别。在源代码模式下,可以将一个源代码行与多个程序集指令相关联。pct命令不会在与当前源代码行关联的调用或返回指令处停止。