• Windbg命令学习13(ln和伪寄存器)


    1.ln

    ln 命令显示给定地址处的或者最近的符号。

    ln表示list near,ln命令将尽可能地给出与特定地址相关的符号,如果没有符号能够精确地与这个地址匹配,那么调试器将通过指针算法对靠近这地址的符号进行运逄,

    并返回运算结果符号

    0:000> ln 01012475
    (01012475)   calc!WinMainCRTStartup   |  (0101263c)   calc!__CxxFrameHandler
    Exact matches:
        calc!WinMainCRTStartup = <no type information>
    0:000> ln 01012475+1
    (01012475)   calc!WinMainCRTStartup+0x1   |  (0101263c)   calc!__CxxFrameHandler
    


    我们发现,第一个显示为Exact matches:表示精确匹配了一个地址,如果不是精确匹配,我们要小心,是否模块进行了优化,在优化后,一个函数,可能被拆分为多个部分

    分别位于不同的地址,经过优化的映像可以通过lm查看:会有perf标识

    当你在查看某部分数据,却不知道这部分数据所表示的内容时,这个命名能带来极大的帮助

    2.伪寄存器

    对于那些偶尔使用调试器的用户是很难记得所有平台的指令指针寄存器名字(或其他的名字),为了克服这个问题,调试器的开发团队引入了各种伪寄存器,由调试器把这些伪寄存器对应到不同的硬件架构上,形式为$name,与标准的寄存器一样,如果要在表达式中使用伪寄存器,那么必须使用转义字符@

    $exentry
    当前进程的入口地址

    0:002> r $exentry
    $exentry=01012475


     一般可以直接在这下断点,

    这个就对应PE文件中的ImageBase+AddressOfEntryPoint(_IMAGE_OPTIONAL_HEADER)

    $ip

    指令指针寄存器

    在X86架构上,$ip = eip

    在x64架构上,$ip = rip

    在Itanium架构上, $ip = iip

     x86/x64/ia-64的区别

    0:000> r @$ip
    $ip=7c92120e
    0:000> r eip
    eip=7c92120e

    注意到下面显示的分别是$ip,eip,虽然它们在X86下是同一个东东.

    $ra

    当前函数的返回地址

    0:000> r $ra
    $ra=7c95e612
    0:000> kb
    ChildEBP RetAddr  Args to Child              
    0012fb1c 7c95e612 7ffdd000 7ffde000 00000000 ntdll!DbgBreakPoint
    0012fc94 7c94108f 0012fd30 7c920000 0012fce0 ntdll!LdrpInitializeProcess+0xffa
    0012fd1c 7c92e437 0012fd30 7c920000 00000000 ntdll!_LdrpInitialize+0x183
    00000000 00000000 00000000 00000000 00000000 ntdll!KiUserApcDispatcher+0x7


    其实也是对应当前线程,如果要看所有线程的当前函数的返回地址:

    0:000> ~* r $ra
    $ra=77d191be
    $ra=7c92df2c
    $ra=7c92df3c
    $ra=7c970010

    $retreg

    主要的值寄存器,在函数调用返回后,函数的结果将放在这个寄存器中,根据处理器架构的不同,$retreg的值分别为

    在x86架构上,$retreg = eax

    在x64架构上,$retreg = rax

    在Itanium架构上,$retreg = ret0

    0:000> r $retreg
    $retreg=00251eb4
    0:000> r eax
    eax=00251eb4


    $csp

    当前的栈指针,根据处理器架构的不同,$csp的值分别为

    在x86架构上,$csp = esp

    在x64架构上,$csp = rsp

    在Itanium架构上,$csp = bsp

    0:000> r $csp
    $csp=0012fb24
    0:000> r esp
    esp=0012fb24

    $tpid

    当前进程的标识(PID)

    0:000> r $tpid
    $tpid=000013f4


    $tid

    当前线程的标识(TID0

    0:000> r $tid
    $tid=000014a0



     

  • 相关阅读:
    linux下清空文件的几种方式以及对比
    远程桌面连接无法验证您希望连接的计算机的身份-mac连接远程桌面
    Linux配置临时IP和网关命令
    linux(centos、ubuntu)网卡配置文件不生效
    负载均衡
    Zookeeper基础使用机制原理
    高性能RPC框架选型
    事务隔离机制
    一致性协议Raft
    机器学习入门
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693517.html
Copyright © 2020-2023  润新知