zoukankan      html  css  js  c++  java
  • 符号语法和符号匹配

    符号用来直接操作被调试程序的助记符(tokens)。例如,可以通过命令bp main 来在main函数上设置断点,或者使用dd MyInt L1命令来显示整数变量MyInt 的值。很多情况下,符号可以作为调试器命令的参数。可以支持大多数数字参数,以及一些文本参数。除了常规的符号语法之外,也有一些适用于各种单独情况的语法规则。

    常规符号语法规则

    符号名由一个或多个字符组成,但是总是以字母、下划线(_)、问号(?)或美元符号($)开头。

    符号名可以用模块名来进行限制。使用一个感叹号(!)来分隔模块名和符号(例如,mymodule!main)。没有使用模块名的时候,符号也可以用感叹号作为前缀。即使对于局部变量,使用不带模块名的感叹号也尤其有用,它可以向调试器命令指明某个参数是一个名字而不是16进制数字。例如,如果没有加上感叹号前缀或者-n选项的话,变量fade会被命令dt (Display Type)当作一个地址来读取。但是,可以通过加上美元符号( $ )和感叹号( ! )当作前缀来指明一个符号是局部变量,如$!lime

    符号名是完全不区分大小写的。这意味着如果程序中同时存在myIntMyInt ,不能被调试器正确识别;不管怎么写,访问它们的命令都有可能访问到另外一个。

    数值表达式中的符号语法

    调试器可以识别两种不同的表达式:Microsoft宏汇编(MASM)表达式和C++表达式。由于和符号相关,这两种语法形式有以下区别:

    • 在MASM表达式中,每个符号都被解释成地址。根据该符号引用的内容不同,它可以是全局变量、局部变量、函数、段、模块的地址或者其他任何可识别的标志。
    • 在C++ 表达式中,符号根据它的类型来解释。根据引用内容的不同,可能被解释为整数、数据结构、函数指针或任何其他数据类型。不符合C++数据类型的符号(例如未更改的模块名)都会产生语法错误。

    关于如何使用每一种语法的说明,查看表达式求值。

    如果使用MSAM表达式语法,任何可以被解释为16进制数或寄存器的符号(例如,BadFeed, ebX)都必须用感叹号作为前缀。这能确保调试器将它识别为符号。

    ss (Set Symbol Suffix)命令可以用来设置符号后缀。这使得调试器在找不到符号的情况下自动在符号名后添加"A" 或者"W"。

    很多Win32函数存在ASCII和Unicode版本。这些函数的名字后被分别添加了"A" 或"W"。使用符号后缀可以帮助调试器搜索这些符号。

    后缀匹配默认没有激活。

    文本表达式中的符号语法

    符号可以用于一些命令的文本参数 — 例如bm (Set Breakpoint)x (Examine Symbols)

    这些文本参数支持很多通配符和说明。查看字符串通配符语法获取详细信息。除标准字符串通配符之外,用来指定符号的文本表达式也可以使用一个下划线作为前缀。当对这样的符号进行匹配时,调试器把它当作任意数量的下划线,包括零。

    匹配文本表达式中的符号时,不会使用符号后缀。

  • 相关阅读:
    常用docker命令
    docker环境安装rabbitmq
    docker环境安装mongdb
    docker 安装redis
    docker 安装mysql
    spring关于resource文件加载原理解析(转的一篇文章)
    ✡ leetcode 165. Compare Version Numbers 比较两个字符串数字的大小 --------- java
    ✡ leetcode 164. Maximum Gap 寻找最大相邻数字差 --------- java
    ✡ leetcode 163. Missing Ranges 找出缺失范围 --------- java
    ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java
  • 原文地址:https://www.cnblogs.com/yilang/p/12971273.html
Copyright © 2011-2022 走看看