【问题标题】:C++ class methods do not have an address range in DWARF infoC++ 类方法在 DWARF 信息中没有地址范围
【发布时间】:2016-06-13 11:53:27
【问题描述】:

我正在尝试解析 DWARF 调试信息,以确定堆栈跟踪地址中的函数。如果它适用于我的 C 函数(使用 gcc 编译),它不适用于我的 C++ 函数(使用 g++ 编译)

我的 C 函数在 .debug_info 表中都有一个 DW_AT_low_pc 和一个 DW_AT_low_high 属性,它们告诉我这个函数是什么内存范围,例如

<1><17433>: Abbrev Number: 33 (DW_TAG_subprogram)
    <17434>   DW_AT_external    : 1
    <17434>   DW_AT_name        : (indirect string, offset: 0x4704): TLSCursor_init
    <17438>   DW_AT_decl_file   : 1
    <17439>   DW_AT_decl_line   : 46
    <1743a>   DW_AT_linkage_name: (indirect string, offset: 0x4536): _Z14TLSCursor_initP9TLSCursorP13TCPConnection
    <1743e>   DW_AT_low_pc      : 0x1178ce
    <17442>   DW_AT_high_pc     : 0x1b
    <17446>   DW_AT_frame_base  : 1 byte block: 9c  (DW_OP_call_frame_cfa)
    <17448>   DW_AT_GNU_all_call_sites: 1
    <17448>   DW_AT_sibling     : <0x17469>`

Most of my C++ methods, however most do NOT have such attributes:

`<2><144de>: Abbrev Number: 7 (DW_TAG_subprogram)
    <144df>   DW_AT_external    : 1
    <144df>   DW_AT_name        : (indirect string, offset: 0x3505): ~TLSNumber
    <144e3>   DW_AT_decl_file   : 3
    <144e4>   DW_AT_decl_line   : 23
    <144e5>   DW_AT_linkage_name: (indirect string, offset: 0x3510): _ZN9TLSNumberD4Ev
    <144e9>   DW_AT_accessibility: 1    (public)
    <144ea>   DW_AT_declaration : 1
    <144ea>   DW_AT_object_pointer: <0x144f2>
    <144ee>   DW_AT_sibling     : <0x144fd>

这有什么原因吗?在这种情况下如何确定函数的地址范围?

【问题讨论】:

    标签: g++ dwarf


    【解决方案1】:

    DWARF 方法定义可以分为“抽象”和“具体”部分。例如,当您有一个在多个位置内联的函数时,可能会使用它。所有 pc 不变信息都存储在抽象条目中,而具体条目将具有指向抽象条目的指针,并为该方法的特定实例添加 pc 值。

    查看你的侏儒信息,寻找另一个指向此的DW_AT_abstract_origin

    此外,这个子程序 die 上有一个 DW_AT_declaration 标记,它告诉您这是一个声明(例如,来自头文件),不一定是定义。我可能错认为这是一个抽象/具体的对,可能是这个信息在侏儒后期的声明中重复。

    【讨论】:

    • 我确实发现其他 DIE 通过他们的 DW_AT_specification 字段指向第一个 DIE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2010-09-10
    相关资源
    最近更新 更多