Debugging Tools for Windows

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

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

语法

用户模式

[~Threadk[b|p|P|v] [n] [f] [L] [FrameCount
[~Threadk[b|p|P|v] [n] [f] [L= BasePtr [FrameCount
[~Threadk[b|p|P|v] [n] [f] [L= BasePtr StackPtr InstructionPtr 
[~Threadkd [WordCount

内核模式

[Processork[b|p|P|v] [n] [f] [L] [FrameCount
[Processork[b|p|P|v] [n] [f] [L= BasePtr [FrameCount
[Processork[b|p|P|v] [n] [f] [L= BasePtr StackPtr InstructionPtr 
[Processorkd [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 参数)或两个参数(被当作StackPtrInstructionPtr 参数)。
StackPtr
(仅x86处理器) 指定用于堆栈回溯的堆栈指针。如果省略掉StackPtrInstructionPtr ,命令会使用esp寄存器中指定的堆栈指针和eip中指定的指令指针。
InstructionPtr
(仅x86处理器) 指定用于堆栈回溯的指令指针。如果省略掉StackPtrInstructionPtr ,命令会使用esp寄存器中指定的堆栈指针和eip中指定的指令指针。
WordCount
指定堆栈中要转储的DWORD_PTR 值的个数。如果没有使用.kframes (Set Stack Length)命令修改的话,默认值为20 (0x14)。

环境

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

注释

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

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

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

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

如果使用kbkv命令,则显示传递给每个函数的前三个参数。如果使用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处理器上指定基指针需要指定BasePtrStackPtrInstructionPtr。这些参数需要和堆栈回溯对应的ebpespeip值相等。如果指定了BasePtr 而省略StackPtrInstructionPtr,当存在FPO帧时可能获得错误的结果。

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

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

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

附加信息

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

Build machine: CAPEBUILD