如何从gdb打印C99结构?

如何从gdb打印C99结构?,gdb,c99,representation,Gdb,C99,Representation,是否可以使用gdb以C99语法打印结构 例如: 此结构的实例可以编写为: struct ApplicationState app_state = { .signal = { .use_crash_handler = true, .use_abort_handler = true, }, .exit_code_on_error = { .python = 0, }, }; 是否可以使用gdb从结构实例中获取这样的文本

是否可以使用gdb以C99语法打印结构

例如:

此结构的实例可以编写为:

struct ApplicationState app_state = {
    .signal = {
        .use_crash_handler = true,
        .use_abort_handler = true,
    },
    .exit_code_on_error = {
        .python = 0,
    },
};

是否可以使用gdb从结构实例中获取这样的文本字符串?

我用python编写了一个新的
gdb
CLI命令,以C99样式打印结构的内容。通过此命令,我可以获得以下信息:

(gdb) print_struct_c99 as
struct ApplicationState as = {
  .x = 0,
  .signal = {
    .use_crash_handler = true,
    .use_abort_handler = false
  },
  .exit_code_on_error = {
    .python = 88
  }
}
在运行
print\u struct\u c99
之前,必须先获取python脚本的源代码。例如:

(gdb) source gdb_script.py
Python脚本:


类PrintStructC99(gdb.Command):
定义初始化(自):
超级(PrintStructC99,self)。\uu init__(
“打印\u结构\u c99”,
gdb.COMMAND_用户,
)
def get_count_标题(自身,字符串):
对于枚举中的i,s(字符串):
如果是!='':
打破
返回i
def extract_typename(self,string):
第一行=string.split('\n')[0]
返回第一行.split('=')[1][:-1].strip()
def调用(self、arg、from_tty):
ret_ptype=gdb.execute('ptype{}.format(arg),to_string=True)
tname=self.extract\u typename(ret\u ptype)
打印({}{}={{.format(tname,arg))
r=gdb.execute('p{}.format(arg),to_string=True)
r=r.split('\n')
对于r[1:]中的rr:
如果“=”不在rr中:
打印(rr)
持续
hs=自身。获取计数标题(rr)
rr_s=rr.strip().split('=',1)
rr_rval=rr_s[1]。条带()
打印('*hs+'.+rr_s[0]+'='+rr_rval)
打印('从%s运行GDB\n'(GDB.PYTHONDIR))
执行(“设置打印漂亮”)
执行('set pagination off')
gdb.execute('set print repeats 0')
执行('set print elements unlimited')
#实例化
PrintStructC99()

默认情况下,
gdb
可以打印:
$1={signal={use\u crash\u handler=true,use\u abort\u handler=false},exit\u code\u on\u error={python=88'X'}}
。它与您想要的不同吗?它可以在每个变量之前用
打印吗?否则它是无效的C99(我希望能够使用它作为输入-结构非常大,而我可以操作输出-如果我可以得到已经可用的输出就好了)。
(gdb) source gdb_script.py