首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ARM上使用backward-cpp获取堆栈跟踪

如何在ARM上使用backward-cpp获取堆栈跟踪
EN

Stack Overflow用户
提问于 2021-03-22 18:57:22
回答 1查看 304关注 0票数 4

在使用backward-cpp库的ARM机器上抛出异常后,我正在尝试恢复我的程序堆栈跟踪。在AMD64机器上运行简单程序时,以下代码返回预期的堆栈跟踪:

代码语言:javascript
运行
复制
#include <backward/backward.hpp>

backward::SignalHandling sh{};

int main() {
    throw 1;
}
代码语言:javascript
运行
复制
terminate called after throwing an instance of 'int'
Stack trace (most recent call last):
#9    Object "", at 0xffffffffffffffff, in 
#8    Object "/home/uy/Sandbox/SimpleC++/cmake-build-debug---native/main", at 0x556929e5308d, in 
#7    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fb8a1e8c0b2, in __libc_start_main
#6    Source "/home/uy/Sandbox/SimpleC++/main.cpp", line 7, in int main() [0x556929e53174]
          4: backward::SignalHandling sh{};
          5: 
          6: int main() {
      >   7:     throw 1;
          8: }
#5    Object "/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fb8a211c798, in __cxa_throw
#4    Object "/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fb8a211c4e6, in std::terminate()
#3    Object "/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fb8a211c47b, in 
#2    Object "/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fb8a2110950, in 
#1    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fb8a1e8a858, in abort
#0    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fb8a1eab18b, in gsignal
Aborted (Signal sent by tkill() 32939 1000)

但是,当在ARM机器上运行相同的代码时,程序提供的堆栈跟踪并不是特别有用:

代码语言:javascript
运行
复制
terminate called after throwing an instance of 'int'
Stack trace (most recent call last):
#7    Object "/lib/arm-linux-gnueabihf/libc.so.6", at 0xb6d08e9f, in gsignal
#6    Object "/lib/arm-linux-gnueabihf/libc.so.6", at 0xb6cf9c65, in gnu_get_libc_version
#5    Object "/lib/arm-linux-gnueabihf/libc.so.6", at 0xb6d09cbf, in __default_sa_restorer
#4    Source "/home/uy/Sandbox/SimpleC++/backward-cpp/include/backward/backward.hpp", line 3972, in backward::SignalHandling::sig_handler(int signo, siginfo_t *info, void *_ctx) [0x7f5a2429]
#3    Source "/home/uy/Sandbox/SimpleC++/backward-cpp/include/backward/backward.hpp", line 3947, in backward::SignalHandling::handleSignal(int, siginfo_t *info, void *_ctx) [0x7f5a2371]
#2    Source "/home/uy/Sandbox/SimpleC++/backward-cpp/include/backward/backward.hpp", line 823, in size_t backward::StackTraceImpl<backward::system_tag::linux_tag>::load_from(void *addr, size_t depth) [0x7f59d44f]
#1    Source "/home/uy/Sandbox/SimpleC++/backward-cpp/include/backward/backward.hpp", line 817, in size_t backward::StackTraceImpl<backward::system_tag::linux_tag>::load_here(size_t depth) [0x7f59d3d3]
#0    Source "/home/uy/Sandbox/SimpleC++/backward-cpp/include/backward/backward.hpp", line 802, in size_t backward::details::unwind<backward::StackTraceImpl<backward::system_tag::linux_tag>::callback>(callback f, size_t depth) [0x7f5a2df3]
Aborted (Signal sent by tkill() 8424 1000)
Aborted

如何获得与在AMD64机器上得到的堆栈跟踪类似的堆栈跟踪?

EN

回答 1

Stack Overflow用户

发布于 2021-04-09 23:15:16

这是可行的,但需要访问libgcc如何实现_Unwind_Backtrace函数的内部详细信息。幸运的是,代码是开源的,但依赖于这样的内部细节是脆弱的,因为它可能会在没有任何通知的情况下在armgcc的未来版本中崩溃。

通常,通过读取执行回溯的libgcc的源代码,它会创建CPU核心寄存器的内存虚拟表示,然后使用此表示在堆栈中遍历,模拟异常抛出。_Unwind_Backtrace做的第一件事是从当前的CPU寄存器填充这个上下文,然后调用一个内部实现函数。

在大多数情况下,从堆栈异常结构手动创建该上下文就足以伪造回溯,从处理程序模式向上通过调用堆栈。下面是一些示例代码(来自https://github.com/bakerstu/openmrn/blob/62683863e8621cef35e94c9dcfe5abcaf996d7a2/src/freertos_drivers/common/cpu_profile.hxx#L162):

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66744688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档