首页 > 解决方案 > 需要帮助了解 DW_AT_ranges 值

问题描述

以下所有内容都是通过 dwarfdump 获得的。

我有以下 DIE(其中一个显示对内联函数 foo 的调用):

0x0004076c:     DW_TAG_inlined_subroutine
                  DW_AT_ranges  (0x00002730
                     [0x0000000000a5cda7, 0x0000000000a5cdb0)
                     [0x0000000000a5cdb5, 0x0000000000a5ce50))
                  DW_AT_abstract_origin (0x00040817 "foo")
                  DW_AT_call_line       (154)
                  DW_AT_call_column     (0x09)
                  DW_AT_call_file       ("file.C")

所以这告诉我foo在第 154 行的 file.C 中调用了函数,这是正确的。有 2 个条目foo(不知道为什么一个是内联的,另一个不是)。他们是:

0x00040817:   DW_TAG_subprogram
                DW_AT_decl_line (172)
                DW_AT_decl_file ("file.C")
                DW_AT_declaration       (0x01)
                DW_AT_name      ("foo")
                DW_AT_MIPS_linkage_name ("foo")
                DW_AT_external  (0x01)
                DW_AT_inline    (DW_INL_declared_inlined)

0x00040deb:     DW_TAG_subprogram
                  DW_AT_decl_line       (172)
                  DW_AT_decl_file       ("file.C")
                  DW_AT_declaration     (0x01)
                  DW_AT_MIPS_linkage_name       ("foo")
                  DW_AT_name    ("foo")
                  DW_AT_external        (0x01)

确实foofile.C在第 172 行定义的。这个函数的第一行是 174。如果我查看 debug_line 部分(通过 objdump --dwarf=decodedline)和第 174 行的 grep,我得到以下信息:

file.C                           174            0x4ffaf7
file.C                           174            0x4ffbb7
file.C                           174            0x4ffc77
file.C                           174           0x1fa72f7
file.C                           174           0x1fa73b7
file.C                           174           0x1fa7477
file.C                           174            0xa04897
file.C                           174            0xa04957
file.C                           174            0xa04a17
file.C                           174            0x52e6d7
file.C                           174            0x52e797
file.C                           174            0x52e857

我本来希望在范围值中至少看到其中一个地址。如果我必须做一些额外的算术才能使它有意义,我不确定出了什么问题。任何帮助,将不胜感激。

标签: debugginggdbelficcdwarf

解决方案


推荐阅读