Debugging Tools for Windows

k, kb, kd, kp, kP, kv (Display Stack Backtrace)

k*命令显示给定线程的调用堆栈,以及其他相关信息。

语法

用户模式

[~Thread] k[b|p|P|v] [n] [f] [L] [FrameCount] 
[~Thread] k[b|p|P|v] [n] [f] [L] = BasePtr [FrameCount] 
[~Thread] k[b|p|P|v] [n] [f] [L] = BasePtr StackPtr InstructionPtr 
[~Thread] kd [WordCount] 

内核模式

[Processor] k[b|p|P|v] [n] [f] [L] [FrameCount] 
[Processor] k[b|p|P|v] [n] [f] [L] = BasePtr [FrameCount] 
[Processor] k[b|p|P|v] [n] [f] [L] = BasePtr StackPtr InstructionPtr 
[Processor] kd [WordCount] 

参数

Thread
指定要显示调用堆栈的线程。如果省略该参数,则显示当前线程的堆栈。线程语法的更多信息,查看线程语法。仅有用户模式可以指定线程。
Processor
指定要显示调用堆栈的处理器。处理器语法的更多信息,查看多处理器语法。仅在内核模式下可以指定处理器。
b
显示传递给堆栈回溯中的每个函数的前三个参数。
p
显示传递给堆栈回溯中的每个函数的所有参数。参数列表包含参数的数据类型、名字和值。p命令是区分大小写的。使用该参数需要完整符号信息。
P
和p参数一样,显示传递给堆栈回溯中的每个函数的所有参数。但是,使用P ,函数参数在第二行中显示,而不是作为数据的结尾在行末显示。
v
显示帧指针省略信息(FPO)。在x86处理器上,还显示调用约定(即__stcdall、__cdecl等等 — 译者注)的信息。
n
显示帧号码。
f
显示临近的帧之间的距离。该距离是在实际堆栈中分隔两个帧的字节数。
L
隐藏源码行信息。L区分大小写。
FrameCount
指定要显示的堆栈帧号码。如果没有使用n (Set Number Base)命令改变基数的话,需要使用16进制数。如果没有使用.kframes (Set Stack Length)命令改变的话,它的默认值是20(0x14)。
BasePtr
指定堆栈回溯的基指针。BasePtr 参数仅在命令后有等号(=)时可用。在x86处理器上,BasePtr 之后可以添加一个参数(被当作FrameCount 参数)或两个参数(被当作StackPtr 和InstructionPtr 参数)。
StackPtr
(仅x86处理器) 指定用于堆栈回溯的堆栈指针。如果省略掉StackPtr 和InstructionPtr ,命令会使用esp寄存器中指定的堆栈指针和eip中指定的指令指针。
InstructionPtr
(仅x86处理器) 指定用于堆栈回溯的指令指针。如果省略掉StackPtr 和InstructionPtr ,命令会使用esp寄存器中指定的堆栈指针和eip中指定的指令指针。
WordCount
指定堆栈中要转储的DWORD_PTR 值的个数。如果没有使用.kframes (Set Stack Length)命令修改的话,默认值为20 (0x14)。

环境

模式 用户模式、内核模式
目标 活动目标、崩溃转储
平台 所有

注释

使用k、kb、kp、kP或kv 命令时,堆栈回溯按照表格形式显示。如果启用了行号,源码模块和行号也会显示出来。

堆栈回溯中包含堆栈帧的基指针、返回地址和函数名。

如果使用kp 或 kP 命令,堆栈回溯中每个函数的所有参数都会显示出来。参数列表包含每个参数的数据类型、名字和值。

该命令的执行可能很慢。例如,当MyFunction1 调用MyFunction2时,调试器必须获得MyFunction1 的完整符号信息来显示传递过去的参数。该命令不能完整显示在公有符号中未暴露的Microsoft Windows内部例程。

如果使用kb 或 kv命令,则显示传递给每个函数的前三个参数。如果使用kv,FPO数据也会显示出来。

在x86处理器上,kv命令也会显示调用约定的信息。

在基于Itanium的处理器上,kv命令也会使得非易失性寄存器(nonvolatile registers)显示出来。该信息使得可以回溯寄存器堆栈。

使用kv命令时,FPO信息按如下格式添加到行末。

FPO文本 含义
FPO: [non-Fpo]
帧中没有FPO数据。
FPO: [N1,N2,N3]
N1是参数的总数。

N2 是局部变量的DWORD值个数。

N3是保存了的寄存器的个数。
FPO: [N1,N2] TrapFrame @ Address
N1 是参数总数。

N2是局部变量的DWORD值个数。

Address 是陷阱帧的地址。

FPO: TaskGate Segment:0
Segment 是任务门的段选择子。
FPO: [EBP 0xBase]
Base 是帧的基指针。

kd命令显示原始堆栈数据。每个DWORD值都显示在单独的行上。这些行中的符号信息也和关联的符号显示在一起。这种格式比其他k*包含更详细的列表。kd命令和使用dds (Display Memory)命令并将堆栈地址作为参数一样。

如果想从不是当前堆栈位置开始堆栈回溯,可以使用BasePtr参数来指定基指针的值。在x86处理器上指定基指针需要指定BasePtr、StackPtr和InstructionPtr。这些参数需要和堆栈回溯对应的ebp、esp、eip值相等。如果指定了BasePtr 而省略StackPtr 和InstructionPtr,当存在FPO帧时可能获得错误的结果。

如果在某个函数开头使用k命令(在函数内部的预处理执行之前),会得到错误的结果。调试器使用帧寄存器来计算回溯,而该寄存器在预处理执行之前都不会被正确设置。

在用户模式下,堆栈回溯基于当前线程的栈。关于线程的更多信息,查看控制进程和线程。

在内核模式下,堆栈跟踪基于当前寄存器上下文。可以设置寄存器上下文来匹配指定线程、上下文记录或陷阱帧。

附加信息

关于堆栈回溯的更多信息和其它显示调用堆栈的方法,查看查看调用堆栈。关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文。

Build machine: CAPEBUILD