不同arm-none-eabi-gcc版本DWARF输出差异及格式恢复问询
问题:新版arm-none-eabi-gcc生成的DWARF调试信息格式变化导致解析器失效
背景
我编译包含调试信息的ELF文件后,会读取并解析调试信息以获取RAM中所有全局变量和类变量的列表。该流程在旧版编译器(7.3.1)中可正常运行,但升级到10.3.1版本后,尽管同样采用DWARF v4格式,调试信息的结构却发生了变化,导致现有解析器失效。
新旧调试信息格式对比
旧版(7.3.1)格式
全局变量仅对应一个包含DW_AT_location地址信息的DW_TAG_variable节点:
<1><26ec2>: Abbrev Number: 90 (DW_TAG_variable) <26ec3> DW_AT_name : (indirect string, offset: 0x165b): SystemCoreClock <26ec7> DW_AT_decl_file : 120 <26ec8> DW_AT_decl_line : 135 <26ec9> DW_AT_type : <0x4d> <26ecd> DW_AT_location : 5 byte block: 3 68 0 0 20 (DW_OP_addr: 20000068)
新版(10.3.1)格式
同一个变量被拆分为3个关联的DW_TAG_variable节点:首节点存储名称等声明信息,末节点存储地址信息,节点之间通过DW_AT_specification和DW_AT_abstract_origin字段关联:
<1><b3540>: Abbrev Number: 13 (DW_TAG_variable) <b3541> DW_AT_name : (indirect string, offset: 0x2f0a0): SystemCoreClock <b3545> DW_AT_decl_file : 4 <b3546> DW_AT_decl_line : 58 <b3547> DW_AT_decl_column : 17 <b3548> DW_AT_type : <0xb3379> <b354c> DW_AT_external : 1 <b354c> DW_AT_declaration : 1 <1><b37d5>: Abbrev Number: 14 (DW_TAG_variable) <b37d6> DW_AT_specification: <0xb3540> <b37da> DW_AT_decl_file : 6 <b37db> DW_AT_decl_line : 135 <b37dc> DW_AT_decl_column : 12 <1><14cfe>: Abbrev Number: 30 (DW_TAG_variable) <14cff> DW_AT_abstract_origin: <0xb37d5> <14d03> DW_AT_location : 5 byte block: 3 0 0 0 20 (DW_OP_addr: 20000000)
已尝试的解决方法
尝试过使用-gdwarf-version编译选项,未能让新版编译器生成旧格式的调试信息。
疑问
是否有办法让新版arm-none-eabi-gcc(10.3.1)生成与旧版(7.3.1)一致的调试信息格式?
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

