相关疑难解决方法(0)

我的程序崩溃时如何自动生成堆栈跟踪

我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.

我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).

我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?

c++ crash gcc assert stack-trace

561
推荐指数
20
解决办法
33万
查看次数

Android NDK:获得回溯

我正在开发通过NDK与Android一起使用的本机应用程序.我需要在backtrace()发生崩溃时调用该函数.问题是<execinfo.h>NDK 没有 .

有没有其他方法来获得回溯?

c c++ android android-ndk

44
推荐指数
6
解决办法
4万
查看次数

如何在SIGSEGV上使用_Unwind_Backtrace获取fullstacktrace

我通过代码处理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)

c gcc signals stack-trace stack-unwinding

13
推荐指数
3
解决办法
9244
查看次数

从信号处理程序获取保存的指令指针地址

我的问题与其他有关故障地址的问题有所不同.我正在尝试实现一个可怕的黑客来从信号处理程序确定信号是否通过检查保存的指令指针处的代码并将其与主机体系结构的可能的系统调用条目指令进行比较来中断系统调用或普通用户代码.继续前进.这是实现正确的POSIX线程取消的一部分,它不会受到我在旧问题中描述的竞争条件和资源泄漏的影响:

POSIX取消点应该如何表现?

如果这种方法不可靠或不正确,我也想听听原因.

c linux signals pthreads cancellation

12
推荐指数
1
解决办法
7430
查看次数

Android _Unwind_Backtrace里面的sigaction

我试图在我的Android NDK应用程序中捕获SIGSEGV等信号以进行调试.为此,我设置了一个名为的sigaction.

我现在正试图获得通话的堆栈.问题是_Unwind_Backtrace只能在当前堆栈和sigaction上运行它自己的堆栈.

那么,有没有办法获得接收信号的执行指针的堆栈?(基本上告诉_Unwind_Backtrace放松另一个堆栈而不是当前?)

我应该指出:

  • 使用backtrace()和backtrace_symbols()不是选项,因为这些功能未在Android NDK中提供

  • 我正在使用GDB来调查本地设备上的崩溃.我不想替换GDB,我希望能够在向他发送测试版本时从客户端接收有意义的堆栈跟踪.

编辑:使用Android的libcorkscrew从系统/核心所建议的法登,但是当我使用它的unwind_backtrace_signal_arch功能,我得到一个奇怪的回溯不代表死机我都试过了.

android signals stack-trace backtrace android-ndk

7
推荐指数
1
解决办法
3890
查看次数

其中函数名存储在ARM7l的堆栈帧中(链接寄存器"lr"中的函数地址不是)

可以告诉我函数名称存储在堆栈框架中的任何正文.我知道返回地址存储在链接寄存器(lr)中.但我的要求是实现回溯哪个打印功能名称我不想打印功能地址.

c unix linux arm

2
推荐指数
1
解决办法
117
查看次数