调用堆栈是指向程序计数器当前位置的函数调用链。调用堆栈的顶部函数是当前函数,下一个函数是调用当前函数的函数,依此类推。显示的调用堆栈基于当前程序计数器,除非更改寄存器上下文。
在 WinDbg 中,可以通过输入命令或通过使用Call Stack窗口中查看调用堆栈。
Call Stack窗口的打开方式
- 通过菜单View--->Call Stack打开
- 通过快捷键Alt+6打开
- 通过工具栏按钮打开
Call Stack窗口
作为一种替代方法 k命令时,您可以调用窗口中查看调用堆栈。通过上面的方式打开call stack窗口
call stack窗口中的按钮可用于自定义调用堆栈的视图。要移动到源窗口或反汇编窗口中相应的调用位置,请双击调用堆栈中的一行,或选择一行并按回车键。此操作还将本地上下文更改为选定的堆栈帧。
调用窗口具有一个包含多个按钮和具有带其他命令的快捷菜单的工具栏。 若要访问此菜单中,右键单击标题栏或单击窗口 (在右上角附近的图标)。 工具栏和菜单包含以下按钮和命令:
-
Raw args 显示传递给函数的前三个参数。在基于x86的处理器上,此显示包括传递给函数的前三个参数(“Args to Child”)。
-
Func info 显示帧指针省略(FPO)数据和其他有关函数的内部信息。此命令仅在基于x86的处理器上可用。
-
Source 在函数名之后显示源模块名和行号(如果调试器具有此信息)。
-
Addrs 显示各种与帧相关的地址。在基于x86的处理器上,此显示包括堆栈帧的基指针(“ChildEBP”)和返回地址(“RetAddr”)。
-
Nonvolatile regs 显示寄存器上下文的非易失性部分。此命令仅在基于安腾的处理器上可用。
-
Frame nums 显示帧编号。帧总是连续编号的,从零开始。
-
Headings 显示列头
-
Arg types 显示有关堆栈中的函数预期和接收的参数的详细信息。
-
Always floating 将使窗口停靠,即使仍拖到停靠位置。
-
Move with frame WinDbg帧移动时使窗口在移动,即使窗口已解除锁定。
其他说明
在用户模式下,堆栈跟踪基于当前线程的堆栈。在内核模式下,堆栈跟踪基于当前寄存器上下文。 可以设置寄存器上下文以匹配特定线程、 上下文记录或捕获帧。 如果Call Stack窗口打开时,使用~1s切换线程、.cxr切换上下文等指令事,Call Stack窗口里显示的堆栈内容会发生改变。