Debugging Tools for Windows |
k*命令显示给定线程的调用堆栈,以及其他相关信息。
用户模式
[~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] = BasePtr [FrameCount]
[Processor] k[b|p|P|v] [n] [f] [L] = BasePtr StackPtr InstructionPtr
[Processor] kd [WordCount]
模式 | 用户模式、内核模式 |
目标 | 活动目标、崩溃转储 |
平台 | 所有 |
使用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命令(在函数内部的预处理执行之前),会得到错误的结果。调试器使用帧寄存器来计算回溯,而该寄存器在预处理执行之前都不会被正确设置。
在用户模式下,堆栈回溯基于当前线程的栈。关于线程的更多信息,查看控制进程和线程。
在内核模式下,堆栈跟踪基于当前寄存器上下文。可以设置寄存器上下文来匹配指定线程、上下文记录或陷阱帧。
关于堆栈回溯的更多信息和其它显示调用堆栈的方法,查看查看调用堆栈。关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文。