gdb ptype 打印整数后缀以指示它是有符号的、无符号的、无符号的长整型等
gdb ptype print integer suffix to indicate it is signed, unsigned, unsigned long etc
如何在 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 的参数的输入以获得相同的调试信息,这将很有帮助。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 未定义的符号:符号引用错误.没有输出写入主
- 符号"符号"的偏移不一致
- 未定义的符号 - 符号查找错误