.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. Harbor 开机自启遇到的问题

    Harbor 是一个企业级的 Docker 私有仓库项目,它本身由多个 Docker Containers 组成,通过 docker-compose 管理 containers 之间的依赖关系. 安装 ...

  2. Golang ---testing包

    golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能. 建议安装gotests插件自动生成测试代码: go get -u -v github.com ...

  3. yii框架里DetailView视图和GridView的区别

    1,首先从语义上分析 DetailView是数据视图,用于显示一条记录的数据,相当于网页中的详情页 GridView是网格视图,用于显示数据表里的所有记录,相当于网页里的列表页 2.用法上的区别 首先 ...

  4. Redis Cluster: (error) MOVED

      I have a Redis cluster with the following nodes: 192.168.0.14:6379 master (slots from 0 to 16383) ...

  5. windows操作系统更改 <远程桌面> 端口号

    windows远程桌面连接默认使用的是3389端口,为了避免被他人扫描从而暴力破解远程服务器或者病毒入侵.可以将默认端口修改为其它端口,如8888,11111等.最好修改为10000以后的端口,这样可 ...

  6. 转:什么是DIP、IoC、DI

    DIP依赖倒置原则DIP(Dependency-Inversion Principles) IoC控制反转(Inversion of Control,IoC),简言之就是代码的控制器交由系统控制,而不 ...

  7. 批量关联update

    UPDATE A SET A.field = B.field from table A inner join table B ON A.field = b.field

  8. pandas-14 concatenate和combine_first的用法

    pandas-14 concatenate和combine_first的用法 concatenate主要作用是拼接series和dataframe的数据. combine_first可以做来填充数据. ...

  9. JavaWeb 之 Filter 验证用户登录案例

    需求: 1. 访问一个网站的资源.验证其是否登录 2. 如果登录了,则直接放行. 3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录". 代码实现: import j ...

  10. mysql-connector-java与mysql版本的对应关系

    记录下mysql-connector-java与mysql版本的对应关系,已方便以后参考,这是最新版本对应, 时间:2019年9月27日 官网文档地址: https://dev.mysql.com/d ...