Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用反向cpp在手臂上获得stacktrace_C++_Linux_Exception_Arm_Stack Trace - Fatal编程技术网

C++ 如何使用反向cpp在手臂上获得stacktrace

C++ 如何使用反向cpp在手臂上获得stacktrace,c++,linux,exception,arm,stack-trace,C++,Linux,Exception,Arm,Stack Trace,在使用库的ARM机器上引发异常后,我试图恢复我的程序stacktrace。在AMD64机器上运行简单程序时,以下代码返回预期的堆栈跟踪: #包括 向后::信号处理sh{}; int main(){ 投掷1枚; } 但是,当在ARM机器上运行相同的代码时,程序给出的stacktrace不是特别有用: terminate called after throwing an instance of 'int' Stack trace (most recent call last): #7 Obj

在使用库的ARM机器上引发异常后,我试图恢复我的程序stacktrace。在AMD64机器上运行简单程序时,以下代码返回预期的堆栈跟踪:

#包括
向后::信号处理sh{};
int main(){
投掷1枚;
}
但是,当在ARM机器上运行相同的代码时,程序给出的stacktrace不是特别有用:

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
terminate在抛出“int”实例后调用
堆栈跟踪(最近一次调用):
#7对象“/lib/arm-linux-gnueabihf/libc.so.6”,位于gsignal中0xb6d08e9f处
#6对象“/lib/armlinux gnueabihf/libc.so.6”,位于0xb6cf9c65,在gnu get_libc_版本中
#5对象“/lib/arm-linux-gnueabihf/libc.so.6”,位于0xb6d09cbf,位于默认的sa_恢复程序中
#4 Source“/home/uy/Sandbox/SimpleC++/backward cpp/include/backward/backward.hpp”,第3972行,在backward::signHandling::sig_handler(int signo,siginfo_t*info,void*_ctx)[0x7f5a2429]
#3 Source“/home/uy/Sandbox/SimpleC++/backward cpp/include/backward/backward.hpp”,第3947行,在backward::signalhandlesignal(int,siginfo_t*info,void*_ctx)[0x7f5a2371]
#2 Source“/home/uy/Sandbox/SimpleC++/backward cpp/include/backward/backward.hpp”,第823行,大小为向后::StackTraceImpl::加载自(void*addr,大小为深度)[0x7f59d44f]
#1 Source“/home/uy/Sandbox/SimpleC++/backward cpp/include/backward/backward.hpp”,第817行,大小为backward::StackTraceImpl::load_here(大小为深度)[0x7f59d3d3]
#0 Source“/home/uy/Sandbox/SimpleC++/backward cpp/include/backward/backward.hpp”,第802行,大小为向后::详细信息::展开(回调f,大小为深度)[0x7f5a2df3]
中止(tkill()8424 1000发送的信号)
流产

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

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

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


在大多数情况下,从堆栈异常结构手动创建该上下文足以通过调用堆栈伪造从处理程序模式向上的回溯。下面是一些示例代码(来自):

考虑使用它看起来这是一个已知问题:
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