WinDbg常用命令系列---线程栈中局部上下文切换.frame
.frame (Set Local Context)
.frame命令指定使用哪个本地上下文(作用域)解释本地变量或显示当前本地上下文。
.frame [/c] [/r] [FrameNumber] .frame [/c] [/r] = BasePtr [FrameIncrement] .frame [/c] [/r] = BasePtr StackPtr InstructionPtr
参数:
- /c
将指定的帧设置为当前本地重写上下文。此操作允许用户访问调用堆栈中任何函数的非易失性寄存器。 - /r
显示有关指定本地上下文的寄存器和其他信息。 - FrameNumber
指定需要其本地上下文的帧的数目。如果此参数为零,则该命令指定当前帧。如果省略此参数,则此命令将显示当前本地上下文。 - BasePtr
如果在命令名(.frame)后添加等号(=),则指定用于确定帧的堆栈跟踪的基指针。在基于x86的处理器上,在baseptr(解释为frameincrement)之后添加另一个参数,或在baseptr(解释为instructionptr和stackptr)之后添加两个以上参数。 - FrameIncrement
仅限基于x86的处理器,指定超过基指针的额外帧数。例如,如果基指针0x0012ff00是帧3的地址,则命令.frame 12ff00等效于.frame 3,.frame 12ff00 2等效于.frame 5。 - StackPtr
仅限基于x86的处理器,指定用于确定帧的堆栈跟踪的堆栈指针。如果省略stackptr和instructionptr,调试器将使用esp寄存器指定的堆栈指针和eip寄存器指定的指令指针。 - InstructionPtr
仅限基于x86的处理器,指定用于确定帧的堆栈跟踪的指令指针。如果省略stackptr和instructionptr,调试器将使用esp寄存器指定的堆栈指针和eip寄存器指定的指令指针。
环境:
模式 |
用户模式下,内核模式 |
目标 |
实时、 崩溃转储 |
平台 |
全部 |
应用程序运行时,局部变量的含义取决于程序计数器的位置,因为这些变量的范围仅扩展到在其中定义的函数。如果不使用.frame命令,调试器将使用当前函数(堆栈上的当前帧)的范围作为本地上下文。要更改本地上下文,请使用.frame命令并指定所需的帧号。帧编号是堆栈跟踪中堆栈帧的位置。可以使用k(display stack backtrace)命令或“调用”窗口查看此堆栈跟踪。第一行(当前帧)是帧号0。随后的行表示帧号1、2、3等。 如果将n参数与k命令一起使用,k命令将显示帧号和堆栈跟踪。这些帧编号始终以十六进制形式显示。另一方面,.frame命令将其参数解释为默认基数,除非使用前缀(如x)重写此设置。若要更改默认基数,请使用n(set number base)命令。您可以将本地上下文设置为不同的堆栈帧,以便查看新的本地变量信息。但是,可用的实际变量取决于正在执行的代码。如果发生任何应用程序执行,本地上下文将重置为程序计数器的作用域。如果寄存器上下文发生更改,则本地上下文将重置为顶部堆栈帧。
例如:
0:000> kv # ChildEBP RetAddr Args to Child 00 009efb40 7772448d ffffffff 00000000 00f9114a ntdll!NtTerminateProcess+0xc (FPO: [2,0,0]) 01 009efc18 76e03a22 00000000 77e8f3b0 ffffffff ntdll!RtlExitUserProcess+0xbd (FPO: [Non-Fpo]) 02 009efc2c 0f07e619 00000000 009efc88 0f07ee79 KERNEL32!ExitProcessImplementation+0x12 (FPO: [1,0,0]) 03 009efc38 0f07ee79 00000000 1554bc36 00f9114a MSVCR120D!__crtExitProcess+0x19 (FPO: [Non-Fpo]) (CONV: cdecl) [f:\dd\vctools\crt\crtw32\startup\crt0dat.c @ 776] 04 009efc88 0f07eea0 00000000 00000000 00000000 MSVCR120D!doexit+0x1a9 (FPO: [Non-Fpo]) (CONV: cdecl) [f:\dd\vctools\crt\crtw32\startup\crt0dat.c @ 678] 05 009efc9c 00f928b6 00000000 c88ea480 00f9114a MSVCR120D!exit+0x10 (FPO: [Non-Fpo]) (CONV: cdecl) [f:\dd\vctools\crt\crtw32\startup\crt0dat.c @ 417] 06 009efce4 00f92a8d 009efd00 76e08484 00bf7000 ConsoleApplication3!__tmainCRTStartup+0x1b6 (FPO: [Non-Fpo]) (CONV: cdecl) [f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c @ 662] 07 009efcec 76e08484 00bf7000 76e08460 84bfe2f0 ConsoleApplication3!mainCRTStartup+0xd (FPO: [Non-Fpo]) (CONV: cdecl) [f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c @ 466] 08 009efd00 777541c8 00bf7000 975113fe 00000000 KERNEL32!BaseThreadInitThunk+0x24 (FPO: [Non-Fpo]) 09 009efd48 77754198 ffffffff 7776f32e 00000000 ntdll!__RtlUserThreadStart+0x2f (FPO: [SEH]) 0a 009efd58 00000000 00f9114a 00bf7000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo]) 0:000> .frame 6 06 009efce4 00f92a8d ConsoleApplication3!__tmainCRTStartup+0x1b6 [f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c @ 662] 0:000> dv lock_free = 0x00000000 fiberid = 0x009f0000 nested = 0n0
为虫子生,为虫子死,为虫子奋斗一辈子