当 gcc 中的应用程序在没有 gdb 的情况下崩溃时,如何生成堆栈转储和转储的寄存器值?
Posted
技术标签:
【中文标题】当 gcc 中的应用程序在没有 gdb 的情况下崩溃时,如何生成堆栈转储和转储的寄存器值?【英文标题】:How to generate stackdump and dumped register values when an application in gcc crashes without gdb? 【发布时间】:2011-08-02 00:04:11 【问题描述】:当我的 c++ 应用程序崩溃时,我想生成 stackdump 并显示转储的寄存器值。
我的应用在 Linux 上运行。
我希望我的程序能够在崩溃时生成堆栈转储并显示转储的寄存器值,并且下次用户运行它时,它会询问他们是否可以将这些发送给我,以便我可以追踪问题。我可以处理堆栈跟踪信息,但我不知道如何生成这两件事。有什么想法吗?
感谢所有回复者
谢谢 vlc
【问题讨论】:
Google'sstacktrace.cc
几年前推出时引起了轰动;我不确定它是否仍然流行,但标题确实提到了libunwind
,它在我的Ubuntu系统上的包libunwind7
和-dev
中可用。
【参考方案1】:
The 这个问题的答案可能对您的情况有用。但是答案中的代码会打印一个堆栈跟踪并仅在 SIGSEGV 上注册。您可能需要做更多工作才能满足您的需求。
【讨论】:
您好 vpit,非常感谢您的回复。您是绝对正确的....但我需要打印寄存器和堆栈转储的转储值。我也打印了堆栈跟踪。那么,我如何在我的应用程序中做到这一点而不使用调试器。有什么想法??? 如果 libsigsegv.so 如前所述构建并与您的应用程序一起提供给您的用户,他们将在 SIGSEGV 上看到堆栈跟踪和注册状态。您的应用程序在构建时必须将-rdynamic
传递给 gcc。如果您希望在 SIGSEGV 之外的其他信号上崩溃,请为这些信号注册一个信号处理程序。不需要gdb。我使用此代码仅捕获 SIGSEGV,因为这是我的程序会生成的最常见异常。以上是关于当 gcc 中的应用程序在没有 gdb 的情况下崩溃时,如何生成堆栈转储和转储的寄存器值?的主要内容,如果未能解决你的问题,请参考以下文章