我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.
我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).
我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?
我正在开发通过NDK与Android一起使用的本机应用程序.我需要在backtrace()发生崩溃时调用该函数.问题是<execinfo.h>NDK 没有 .
有没有其他方法来获得回溯?
我通过代码处理SIGSEGV:
int C()
{
int *i = NULL;
*i = 10; // Crash there
}
int B()
{
return C();
}
int A()
{
return B();
}
int main(void)
{
struct sigaction handler;
memset(&handler,0,sizeof(handler));
handler.sa_sigaction = handler_func;
handler.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV,&handler,NULL);
return(C());
}
Run Code Online (Sandbox Code Playgroud)
处理程序代码在哪里:
static int handler_func(int signal, siginfo_t info, void* rserved)
{
const void* stack[MAX_DEPTH];
StackCrowlState state;
state.addr = stack;
state.count = MAX_DEPTH;
_Unwind_Reason_Code code = _Unwind_Backtrace(trace_func,&state);
printf("Stack trace count: %d, code: %d\n",MAX_DEPTH - state.count, code);
kill(getpid(),SIGKILL);
}
static …Run Code Online (Sandbox Code Playgroud) 我的问题与其他有关故障地址的问题有所不同.我正在尝试实现一个可怕的黑客来从信号处理程序确定信号是否通过检查保存的指令指针处的代码并将其与主机体系结构的可能的系统调用条目指令进行比较来中断系统调用或普通用户代码.继续前进.这是实现正确的POSIX线程取消的一部分,它不会受到我在旧问题中描述的竞争条件和资源泄漏的影响:
如果这种方法不可靠或不正确,我也想听听原因.
我试图在我的Android NDK应用程序中捕获SIGSEGV等信号以进行调试.为此,我设置了一个名为的sigaction.
我现在正试图获得通话的堆栈.问题是_Unwind_Backtrace只能在当前堆栈和sigaction上运行它自己的堆栈.
那么,有没有办法获得接收信号的执行指针的堆栈?(基本上告诉_Unwind_Backtrace放松另一个堆栈而不是当前?)
我应该指出:
使用backtrace()和backtrace_symbols()不是选项,因为这些功能未在Android NDK中提供
我正在使用GDB来调查本地设备上的崩溃.我不想替换GDB,我希望能够在向他发送测试版本时从客户端接收有意义的堆栈跟踪.
编辑:使用Android的libcorkscrew从系统/核心所建议的法登,但是当我使用它的unwind_backtrace_signal_arch功能,我得到一个奇怪的回溯不代表死机我都试过了.
可以告诉我函数名称存储在堆栈框架中的任何正文.我知道返回地址存储在链接寄存器(lr)中.但我的要求是实现回溯哪个打印功能名称我不想打印功能地址.
c ×4
signals ×3
stack-trace ×3
android ×2
android-ndk ×2
c++ ×2
gcc ×2
linux ×2
arm ×1
assert ×1
backtrace ×1
cancellation ×1
crash ×1
pthreads ×1
unix ×1