.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

WinDbg常用命令系列---线程栈中局部上下文切换.frame的更多相关文章

  1. WinDbg常用命令系列---线程相关操作~*

    ~ (Thread Status) 波浪符(~)命令显示指定线程或当前进程中所有线程的状态. ~ Thread 参数: Thread指定要显示的线程.如果省略此参数,将显示所有线程. 环境: 模式 仅 ...

  2. WinDbg常用命令系列---断点操作b*

    ba (Break on Access) ba命令设置处理器断点(通常称为数据断点,不太准确).此断点在访问指定内存时触发. 用户模式下 [~Thread] ba[ID] Access Size [O ...

  3. WinDbg常用命令系列---!findstack

    简介 !findstack扩展查找所有包含指定的符号或模块的堆栈.此命令搜索线程调用堆栈中的特定符号,并显示匹配的线程. 使用形式 !findstack Symbol[DisplayLevel] !f ...

  4. WinDbg常用命令系列---显示局部变量dv

    dv (Display Local Variables) dv命令显示当前作用域中所有局部变量的名称和值. dv [Flags] [Pattern] 参数: Flags显示其他信息.可以包括以下任何区 ...

  5. WinDbg常用命令系列---检查符号X

    x (Examine Symbols) x命令在所有与指定模式匹配的上下文中显示符号. x [Options] Module!Symbol x [Options] * 参数: Options特定符号搜 ...

  6. WinDbg常用命令系列---内存数据显示和对应符号显示d*s(dds、dps、dqs)

    命令dds, dps,  dqs显示给定范围内的内存内容.假定该内存是符号表中的一系列地址.相应的符号也会显示出来. dds [Options] [Range] dqs [Options] [Rang ...

  7. WinDbg常用命令系列---查看线程调用栈命令K*简介

    Windbg里的K*命令显示给定线程的堆栈帧以及相关信息,对于我们调试时,进行调用栈回溯有很大的帮助. 一.K*命令使用方式 在不同平台上,K*命令的使用组合如下 User-Mode, x86 Pro ...

  8. WinDbg常用命令系列---!uniqstack

    简介 这个!uniqstack扩展扩展显示的所有线程的堆栈的所有当前进程,不包括显示为具有重复项的堆栈中. 使用形式 !uniqstack [ -b | -v | -p ] [ -n ] 参数 -b将 ...

  9. WinDbg常用命令系列---单步执行p*

    p (Step) p命令执行单个指令或源代码行,并可选地显示所有寄存器和标志的结果值.当子例程调用或中断发生时,它们被视为单个步骤. 用户模式: [~Thread] p[r] [= StartAddr ...

随机推荐

  1. 查看Linux服务器配置

    1.查看CPU lscpu 2.查看内存 free -g 或 free -m 3.查看硬盘 df -h

  2. 4、线程池(摘自C#高级编程第7版)

    1.需求背景 创建线程需要时间.如果有不同的小任务完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多的线程时增加,在需要释放资源时减少.   2.线程池出场 不需要自己 ...

  3. kubernetes使用securityContext和sysctl

    前言 在运行一个容器时,有时候需要使用sysctl修改内核参数,比如net..vm..kernel等,sysctl需要容器拥有超级权限,容器启动时加上--privileged参数即可.那么,在kube ...

  4. Java中Date、String、Calendar类型之间的转化

    1.Calendar 转化 String   //获取当前时间的具体情况,如年,月,日,week,date,分,秒等   Calendar calendat = Calendar.getInstanc ...

  5. 关于如何控制一个页面的Ajax读数据只读一次的简单解决办法!

    例如:一个页面有一个按钮,点击的时候用ajax去后台获取数据,获取成功以后返回.下次再点击的时候就不要去获取数据了. 解决办法有很多: 1.用Get方法去读数据,会缓存. 2.用jquery的data ...

  6. celery 定时任务,使用crontab表达式不执行(版本4.3.x)

    celery 定时任务,使用crontab表达式不执行(版本4.3.x) 在使用celery 执行定时任务时,发现任务不会执行,schedule设置如下: 经测试,如果去掉hour,则任务每分钟都会执 ...

  7. 79.mobile/js---手机端分享调用功能的实现(只能在真机上测试有效)

    html:<a href="javascript:void(0);" class="all-share" onclick="call('defa ...

  8. weblogic unable to get file lock问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误: <2012-3- ...

  9. springboot feign too many bytes written executing POST

    解決办法: pom添加: <dependency><groupId>io.github.openfeign</groupId><artifactId>f ...

  10. nginx反向代理前后端分离项目(后端多台)

    目前软件架构都比较流行前后端分离,前后端的分离也实现了前后端架构的分离,带来的好处 —— 整个项目的开发权重往前移,实现真正的前后端解耦,动态资源和静态资源分离,提高了性能和扩展性. 通常Spring ...