使用GDB查找枚举的可能数值

3

使用以下方式声明和实例化枚举:

enum test_enumeration
    {
        test1 = 4,
        test2 = 10,
        test3,
    };

test_enumeration test_enum;

我可以调用

(gdb) ptype test_enum

离开

type = enum test_enumeration {test1 = 4, test2 = 10, test3}

这个代码可以给我test1和test2的数值,但是无法给我test3的数值。 如果我调用

(gdb) print (int)test3

GDB打印出值为11。然而,我希望能够得到以下内容:
type = enum test_enumeration {test1 = 4, test2 = 10, test3 = 11}

通过使用test_enum打印出整个类型定义。
不幸的是

(gdb) ptype (int)test_enum

返回类型为整数而不是值。

是否有一种方法可以像这样打印枚举常量,或者需要设置选项以始终显示它们的数字版本?

GDB V10.1


你可以使用python为此创建一个新的命令。 - undefined
2个回答

4

这将打印出枚举类型的所有元素。可执行文件需要编译时启用了调试信息。

$ cat print-enum.py
import gdb

class PrintEnumCmd(gdb.Command):
  """print all elements of the given enum type"""

  def __init__(self):
    super(PrintEnumCmd, self).__init__("print-enum", gdb.COMMAND_DATA, gdb.COMPLETE_EXPRESSION)

  def invoke(self, argstr, from_tty):
    typename = argstr
    if not typename or typename.isspace():
      raise gdb.GdbError("Usage: print-enum type")

    try:
      t = gdb.lookup_type(typename)
    except gdb.error:
      typename = "enum " + typename
      try:
        t = gdb.lookup_type(typename)
      except gdb.error:
        raise gdb.GdbError("type " + typename + " not found")

    if t.code != gdb.TYPE_CODE_ENUM:
      raise gdb.GdbError("type " + typename + " is not an enum")

    for f in t.fields():
      print(f.name, "=", f.enumval)

PrintEnumCmd()

$ gdb enu
Reading symbols from enu...done.
(gdb) source print-enum.py
(gdb) print-enum
Usage: print-enum type
(gdb) print-enum test<tab>
test1             test2             test3             test_enumeration
(gdb) print-enum test_enumeration
test1 = 4
test2 = 10
test3 = 11

Python GDB API在gdb.types模块中有一个make_enum_dict(enum_type)函数,它可以完成相同的操作:https://sourceware.org/gdb/onlinedocs/gdb/gdb_002etypes.html#gdb_002etypes - undefined
@user486185 你可以使用for k, v in gdb.types.make_enum_dict(t).items(): print(k, "=", v),但在CPython 3.6之前,字典不会保留插入顺序。 - undefined

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接