Hexagon GDB Debugger介绍(47)

2023-11-11

4.5.2.8 Python 中的命令

新的调试器命令可以在Python中实现。一个命令是用gdb.Command类的一个实例实现的,最常见的是使用子类。
注意 以下项目都是定义在Command类上的方法。
init name command_class [completer_class] [prefix]
Command的对象初始化器向调试器注册新的命令。这个初始化器通常是由子类自己的__init__方法调用的。
name是命令的名称。如果name由多个词组成,那么最初的词将作为前缀命令来寻找。在这种情况下,如果其中一个前缀命令不存在,就会引发一个异常。
不支持多行命令。
command_class应该是下面定义的COMMAND_常量中的一个。这个参数告知调试器如何在帮助系统中对新命令进行分类。
completer_class是一个可选的参数。如果给出,它应该是下面定义的COMPLETE_常量之一。这个参数通知调试器如何对这个命令进行完成。如果没有指定该参数,调试器会尝试使用对象的完成方法(见下文)来完成;如果没有找到这样的方法,在尝试完成时就会出现错误。
prefix是一个可选的参数。如果是True,那么新命令是一个前缀命令;这个命令的子命令可以被注册。
新命令的帮助文本取自该命令类的Python文档字符串,如果有的话。如果没有提供文档字符串,则使用默认值 “此命令没有文档”。
dont_repeat
默认情况下,当用户在命令提示符下输入空行时,调试器命令会被重复。一个命令可以通过调用 dont_ repeat 方法来抑制这种行为。这与用户命令dont-repeat(第4.2节)类似。
invoke argument from_tty
调试器在调用此命令时,会调用此方法。
argument是一个字符串。它是命令的参数,前面和后面的空白已经被剥离。
from_tty是一个布尔值参数。当为真时,它表示该命令是由用户在终端输入的;当为假时,它表示该命令来自其他地方。
如果这个方法抛出一个异常,它将被转化为一个调试器错误调用。否则,返回值被忽略。
complete text word
当用户试图完成这个命令时,调试器会调用这个方法。
所有形式的完成都由这个方法处理,即TAB和M-? 键的绑定(第2.5.3节),以及完整的命令(第2.5.7节)。
参数text和word都是字符串。text保存完整的命令行,直到光标的位置。word保存命令行的最后一个字;这是使用断字启发法计算的。
complete方法可以返回多个值:
1.如果返回值是一个序列,那么该序列的内容就被用作完成度。由完成者来确保这些内容确实完成了这个词。允许出现零长度的序列,这意味着没有可用的补全内容。只有序列中的字符串元素被使用,序列中的其他元素被忽略。
2.如果返回值是下面定义的COMPLETE_常量之一,那么相应的调试器内部的完成函数被调用,其结果被使用。
3.所有其他的结果被当作没有可用的完成函数来处理。
当一个新的命令被注册时,它必须被声明为某个一般命令类别的成员。这被用来对在线帮助系统中的顶级命令进行分类;注意,前缀命令不会被列在自己的类别下,而是列在其顶级命令的类别下。可用的分类由以下常数表示,这些常数在gdb模块中定义:
COMMAND_NONE
该命令不属于任何特定类别。这个类别的命令不显示在任何帮助类别中。
COMMAND_RUNNING
该命令与运行下级有关。例如,start、step和continue都属于这个类别。在调试器提示符下输入help running,可以看到这一类的命令列表。
COMMAND_DATA
该命令与数据或变量有关。例如,调用、查找和打印都属于这一类。在调试器提示符下输入help data可以看到这一类的命令列表。
COMMAND_STACK
该命令与堆栈的操作有关。例如,backtrace、frame和return都属于这个类别。在调试器提示符下输入help stack可以看到这一类的命令列表。
COMMAND_FILES
这个类别用于与文件有关的命令。例如,file、list和section都属于这个类别。在调试器提示符下输入help files可以看到这个类别的命令列表。
COMMAND_SUPPORT
这应该用于 “support facilities”,一般是指在与调试器交互时对用户有用的东西,但与劣质品的状态没有关系。例如,help、make和shell都属于这个类别。在调试器提示符下输入help support,可以看到这一类的命令列表。
COMMAND_STATUS
该命令是与 "info "相关的命令,也就是说,与调试器本身的状态相关。例如,info、macro和show都属于这个类别。在调试器命令提示符下输入help status,可以看到这一类的命令列表。
COMMAND_BREAKPOINTS
该命令与断点有关。例如,break、clear和delete都属于这个类别。在调试器命令提示符下输入help breakpoints,可以看到这一类的命令列表。
COMMAND_TRACEPOINTS
该命令与追踪点有关。例如,trace, actions, 和 tfind 都属于这个类别。在调试器命令提示符下输入help tracepoints,可以看到这个类别的命令列表。
COMMAND_OBSCURE
该命令只在不寻常的情况下使用,或者不是用户普遍关心的。例如,checkpoint、fork和stop都属于这个类别。在调试器命令提示符下输入help obscure,可以看到这一类的命令列表。
COMMAND_MAINTENANCE
该命令只对调试器维护者有用。维护和flushregs命令都属于这个类别。在调试器提示符下输入help internals,可以看到这个类别的命令列表。

一个新的命令可以使用预定义的完成函数,可以在初始化时通过一个参数指定它,也可以从完成方法中返回它。这些预定义的完成常量都是在gdb模块中定义的:
COMPLETE_NONE
这个常量意味着不应该进行任何完成。
COMPLETE_FILENAME
这个常数意味着应该进行文件名的完成。
COMPLETE_LOCATION
这个常数表示应该进行位置完成(第2.11.2节)。
COMPLETE_COMMAND
这个常数表示应该进行调试器命令名的完成。
COMPLETE_SYMBOL
这个常数表示应该使用符号名作为源码进行完成。

下面的代码样本显示了如何在Python中实现一个微不足道的调试器命令:

 class HelloWorld (gdb.Command):
     """Greet the whole world."""
   def __init__ (self):
     super (HelloWorld, self).__init__ ("hello-world",
       gdb.COMMAND_OBSCURE)
   def invoke (self, arg, from_tty):
     print "Hello, World!"
   HelloWorld ()

最后一行实例化了这个类,对于触发调试器的命令注册是必要的。
注意 根据Python代码被读入调试器的方式,你可能需要明确地导入gdb模块。

4.5.2.9 Writing new convenience functions

你可以在 Python 中实现新的方便函数 (第 2.12.9 节)。一个方便函数是gdb.Function类的一个子类的实例。
注意 以下项目都是定义在Function类上的方法。
init name
unction的初始化器向调试器注册新函数。
name是函数的名称,用字符串表示。该函数对用户来说是可见的,是一个内部函数类型的方便变量,其名称与给定的名称相同。
新函数的文档取自新类的文档字符串。

Type 的实例具有以下属性(都是 Type 的实例变量):
*invoke args
当一个方便函数被评估时,它的参数被转换为gdb.Value的实例,然后调用该函数的invoke方法。注意,调试器并不预先确定方便函数的arity。相反,所有可用的参数都传递给 invoke,遵循标准的 Python 调用惯例。特别是,一个方便函数可以有默认的参数值,而没有任何不良影响。
这个方法的返回值被用作其在包围表达式中的值。如果返回的是一个普通的Python值,它将按照通常的规则转换为gdb.Value。
The following code sample shows how a trivial convenience function can be implemented in Python:

  class Greet (gdb.Function):
     """Return string to greet someone.
   Takes a name as argument."""
   def __init__ (self):
     super (Greet, self).__init__ ("greet")
   def invoke (self, name):
     return "Hello, %s!" % name.string ()
Greet ()

最后一行实例化了这个类,对于触发函数在调试器中的注册是必要的。
注意 根据Python代码被读入调试器的方式,你可能需要明确地导入gdb模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hexagon GDB Debugger介绍(47) 的相关文章

  • 如何在 Xcode 4 中从断点操作打印字符串值?

    我有一个断点操作 并且正在使用下拉列表中的 日志 选项 我想打印出字符串 摘要 值 我正在这样做 the person name is p name 但这会打印内存地址 我可以切换到调试器命令选项并执行以下操作 po f name 但后来我
  • 如何使用GDB调试一个大项目?

    现在我有一个c语言项目 其中包括三个目录 bin inc and src 所有头文件 h 包含在 inc和所有源 c 文件存储在 src 即a c b c c c 最终生成的可执行文件位于 bin makefile编译后 会生成所有的obj
  • OSX Lion 上的 GDB 7.3.1

    我正在尝试使用 macports 中的 GDB v 7 3 1 来调试用以下命令编译的可执行文件 g 4 7 也来自 macports 但是 我启动调试器 得到以下输出 GNU gdb GDB 7 3 1 版权所有 C 2011 自由软件基
  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • 在不附加 GDB 的情况下获取所有线程的堆栈跟踪

    有没有一种方法可以在不附加 GDB 的情况下打印所有线程的堆栈跟踪 或者是否有一个命令可以用作 gdb 批处理模式来打印所有线程的堆栈跟踪 elfutils https sourceware org elfutils 除其他实用程序外 还包
  • 如何在使用 GDB 遍历代码时禁用 C++ 模板中的单步执行?

    我试图使用 GDB 遍历代码 而 GDB 总是尝试显示 C 模板源代码 这使得调试不方便并且浪费了我很多时间 GDB 尝试介入该函数 当它找不到实现模板的文件时 它会显示错误 或者它会跳转到我不想看到的模板代码 我找不到如何禁用显示 单步进
  • GDB可以杀死一个特定的线程吗?

    我正在运行一个应用程序 firefox 我想知道是否可以使用 GDB 附加到进程并杀死特定线程 有没有办法做到这一点 我知道此操作可能会使应用程序崩溃 EDIT 在此调试会话中 ps ax显示firefox pid是1328 gdb App
  • 在运行时从应用程序读取调试信息

    除了调试之外 我还有一些关于调试符号以及可以用它们做什么的问题 我最感兴趣的是有关 GCC 的答案 但我也很高兴知道它在其他编译器 包括 MSVC 下的样子 首先 调试符号的常见格式 类型有哪些 它们与编译器和平台有何关系 GCC 和 Mi
  • dprintf 与 break + 命令 + continue 之间有什么区别?

    例如 dprintf main hello n run 生成与以下内容相同的输出 break main commands silent printf hello n continue end run 使用是否有显着的优势dprintf ov
  • 专门逐行调试

    我有一个用 Pascal 编写的脚本 我会以这种方式调试它 在每一行停止 转储内存中所有变量的值 然后转到下一行 是否可以使用 gdb 或其他 Linux 开源工具来完成此操作 使用选项编译文件 g fpc gpc g file pas R
  • GDB错误:“进程记录:当前架构不支持记录功能”

    我正在尝试在 GDB 中进行反向执行 特别是target record按照说明在 gdb 中运行我的程序后here https stackoverflow com questions 1206872 go to previous line
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 如何将整个 GDB 会话转储到文件中,包括我输入的命令及其输出?

    在 bash 中 我可以使用script命令 它将 shell 上显示的所有内容转储到文件中 包括 键入的命令 PS1 line 命令的 stdout 和 stderr gdb 中的等效项是什么 我试着跑shell script从 GDB
  • 在GDB中的每一行设置断点

    有没有办法用GDB在代码的每一行设置断点 明明我不想打b addr对于每一行 所以我想知道是否有一种快速的方法来做到这一点 Edit请注意 我正在运行由其他人创建的二进制文件 并且我无权访问源代码 不幸的是 该二进制文件尚未使用 g 标志进
  • gdb 声称它不知道如何运行

    我在 Mac Pro 上的 Mac OS X 10 6 6 上使用 Xcode 3 2 3 来构建 GrowlTunes 的修订版 5fd480ef577f咆哮开发存储库 http growl info hg growl developme
  • “gdb”调试器奇怪地跳过断点

    这是我的代码的一小段 l2tp inspector cc 14 else if f info gt key proto UDP PROTO 15 if size gt 4 16 uint32 t l2tp part 17 l2tp part
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 使用 math.h 函数时 gdb 给出奇怪的输出[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 gdb 将 sqrt 3 计算为 0 https stackoverflow com questions 5122570 why does gdb evaluate sqrt3 to 0 这里
  • 在 Linux 上,在 Eclipse CDT 中使用 gdb 调试 C++ 应用程序,如何向 stdin 输入内容?

    在 Linux 上 我尝试在 Eclipse CDT 中使用 gdb 调试 C 应用程序 例如应用程序applic exe接受一些命令行参数arg1 and arg2它期望一些数据stdin 比如说 取自文件input txt 通常 要在控
  • 该程序链接到哪个库来提供给定的功能?

    我有一个程序调用函数foo这是在库中定义的 我如何知道该库在文件系统中的位置 比如它是静态库还是动态链接库 更新 使用ldd 程序有很多依赖库 如何判断哪个库包含函数foo 您没有说您所在的操作系统 答案取决于系统 在 Linux 和大多数

随机推荐