【问题标题】:backtrace function inside shared libraries共享库中的回溯功能
【发布时间】:2012-05-04 16:38:59
【问题描述】:

在我的共享库中获得SEGSEGV 后,我正在尝试获取堆栈跟踪并将其保存到文件中。共享库是闭源产品的插件。所有这些都适用于生产,我无法直接访问它。

我的代码捕获SIGSEGV 信号,打印堆栈跟踪并退出。我有这样的事情:

/opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019fee] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc201a587]

/opt/ecelerity/sbin/ecelerity [0x501235]

/opt/ecelerity/sbin/ecelerity(sieve_seng_execute+0x82) [0x506d32] /opt/ecelerity/libexec/validate/sieve.so [0x2aecc2862c9e] /opt/ecelerity/sbin/ecelerity(validate_data+0xa5) [0x4a90d5] /opt/ecelerity/sbin/ecelerity(esmtp_message_factory+0x154e) [0x46eace] /opt/ecelerity/sbin/ecelerity(schedule_event_and_dispatch+0x6a) [0x49c59a]

问题是我不能在其中包含函数的名称和偏移量以进行共享 图书馆。据我了解,我可以在以下帮助下找到给定地址的函数名/文件名 addr2line 实用程序后我会在/proc/$PID/maps 中找到库偏移量。

之后我正在执行类似的操作:

addr2line -e /opt/ecelerity/libexec/site/ec_attachextensions.so (LIBRARY_OFFSET_FROM_MAPS_FILE - 0x2aecc2019f11)

其中0x2aecc2019f11 是上面堆栈跟踪中的地址。我想知道有什么方法可以在不接触地图文件的情况下在堆栈跟踪中获取函数名称?换句话说,我该如何编程? dladdr 会在这里提供帮助吗(dladdr 无法从backtrace 函数提供的地址中获取函数名称在我的情况下)?

【问题讨论】:

    标签: c++ linux stack-trace x86-64 backtrace


    【解决方案1】:

    回溯代码使用与 dladdr 大致相同的机制来确定函数名称。

    如果您的库是使用链接器映射文件(定义要导出的内容,并可用于限制所有其他项目的可见性)或带有显式可见符号的 -fvisibility=hidden 构建的,那么它会掩盖符号,以便它们不会出现在回溯输出中。

    解决方法是在不使用限制库中所有符号可见性的映射文件的情况下进行编译,或者使用-fvisibility=default 进行构建。这将使您无需付出任何努力就可以进行回溯。

    要让它在不这样做的情况下工作,您需要从 .so 加载本地符号表并使用类似于 addr2line 的机制确定符号位置。这样做的机制是利用libelf1。读取本地符号表。

    ... 这当然要求该表尚未从文件中剥离。如果是这种情况,那么这些技巧都无关紧要,因为 .so 根本不附带信息。

    【讨论】:

      【解决方案2】:

      您可以让信号处理程序为您读取 /proc/self/maps。

      或者您可以输出某个函数的绝对地址,然后您可以将其用作比较点来查找库偏移量。

      但如果有一个动态链接器函数可以为您提供基地址,我不会感到惊讶 - 您可以查看文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        相关资源
        最近更新 更多