gdb ptype 打印整数后缀以指示它是有符号的、无符号的、无符号的长整型等

gdb ptype print integer suffix to indicate it is signed, unsigned, unsigned long etc

本文关键字:无符号 符号 长整型 打印 ptype 整数 后缀 指示 gdb      更新时间:2023-10-16

如何在 ptype 命令中设置 gdb 设置以打印整数后缀

较旧的GDB版本打印整数后缀,但更新GDB(我认为(

后缀被删除

实际:-

(gdb) ptype /m TestDataTemplate 
type = struct TestDataTemplate {
TestDataTemplateObj3<int, 2> m_obj3Int2;
}
---------
(gdb) ptype /m TestDataTemplate 
type = struct TestDataTemplate {
TestDataTemplateObj3<int, 2ul> m_obj3Int2;
}

期望它打印整数的后缀示例:45ul - 无符号长 5ll - 签名长长

我不认为这是一个GDB问题,而是GCC问题。 你看到的类型名称将编码到调试信息中。

我从这个测试程序开始:

template <typename T, unsigned long I>
class MyTemplateClass
{
  T array[I];
};
struct MyStructType
{
  MyTemplateClass<int, 2ul> ArrayOf2Int;
};
MyStructType obj;
int
main ()
{
  return 0;
}

我用GCC(版本7.3.1 20180712(Red Hat 7.3.1-6((编译的,这是我与GDB的调试会话(版本Fedora 8.0.1-36.fc27(:

(gdb) start
# .... snip ....
(gdb) ptype obj
type = struct MyStructType {
    MyTemplateClass<int, 2> ArrayOf2Int;
}
(gdb) 

请注意,尽管模板参数是unsigned long的,并且专门用于2ul,GDB 仍然将类型报告为 MyTemplateClass<int, 2>

现在,如果我们使用objdump -W ...查看矮人,那么我们会看到以下内容:

 ... snip ...
 <1><31>: Abbrev Number: 2 (DW_TAG_class_type)
    <32>   DW_AT_name        : (indirect string, offset: 0xf6e): MyTemplateClass<int, 2>
    <36>   DW_AT_byte_size   : 8
    <37>   DW_AT_decl_file   : 1
    <38>   DW_AT_decl_line   : 2
    <39>   DW_AT_sibling     : <0x61>
 <2><3d>: Abbrev Number: 3 (DW_TAG_member)
    <3e>   DW_AT_name        : (indirect string, offset: 0x1b9f): array
    <42>   DW_AT_decl_file   : 1
    <43>   DW_AT_decl_line   : 4
    <44>   DW_AT_type        : <0x61>
    <48>   DW_AT_data_member_location: 0
 <2><49>: Abbrev Number: 4 (DW_TAG_template_type_param)
    <4a>   DW_AT_name        : T
    <4c>   DW_AT_type        : <0x78>
 <2><50>: Abbrev Number: 5 (DW_TAG_template_value_param)
    <51>   DW_AT_name        : I
    <53>   DW_AT_type        : <0x71>
    <57>   DW_AT_const_value : 8 byte block: 2 0 0 0 0 0 0 0 
 <2><60>: Abbrev Number: 0
 ... snip ...
 <1><7f>: Abbrev Number: 10 (DW_TAG_structure_type)
    <80>   DW_AT_name        : (indirect string, offset: 0xa5f): MyStructType
    <84>   DW_AT_byte_size   : 8
    <85>   DW_AT_decl_file   : 1
    <86>   DW_AT_decl_line   : 7
    <87>   DW_AT_sibling     : <0x98>
 <2><8b>: Abbrev Number: 3 (DW_TAG_member)
    <8c>   DW_AT_name        : (indirect string, offset: 0x155a): ArrayOf2Int
    <90>   DW_AT_decl_file   : 1
    <91>   DW_AT_decl_line   : 9
    <92>   DW_AT_type        : <0x31>
    <96>   DW_AT_data_member_location: 0
 <2><97>: Abbrev Number: 0
 ... snip ...

如果你不熟悉阅读DWARF,那么主要的收获是ArrayOf2Int成员的类型名称是MyTemplateClass<int, 2>,这是由GCC提供的。

为什么或何时改变海湾合作委员会,我不能告诉你。

问题是 gcc 版本GCC 版本 5.4.0 能够提供与 7.3 不同的后缀

也许通过传递 gcc 参数(仍在搜索中(仍然可以这样做尝试过 -gdwarf 版本

如果有人可以提供要传递给 gcc 的参数的输入以获得相同的调试信息,这将很有帮助。