C++ 如何避免写入核心文件并加快回溯生成
在我提问之前,我简要描述一下我是如何从我的客户那里得到回溯的。 我在Linux上编写了一个C++应用程序(opSuSE)。 此应用程序由脚本(启动器)启动,如果应用程序崩溃,将生成一个核心转储(因为ulimit-c unlimited)。 然后,启动器从包含gdb的核心文件生成回溯,并再次启动应用程序,这使得用户可以发送包含回溯的崩溃报告 现在我的问题和我的问题:C++ 如何避免写入核心文件并加快回溯生成,c++,linux,gdb,core,C++,Linux,Gdb,Core,在我提问之前,我简要描述一下我是如何从我的客户那里得到回溯的。 我在Linux上编写了一个C++应用程序(opSuSE)。 此应用程序由脚本(启动器)启动,如果应用程序崩溃,将生成一个核心转储(因为ulimit-c unlimited)。 然后,启动器从包含gdb的核心文件生成回溯,并再次启动应用程序,这使得用户可以发送包含回溯的崩溃报告 现在我的问题和我的问题: 问题:核心转储可能相当大(高达5或10 GB)。核心文件的副本需要一定的时间(最多2分钟)。这对我的客户来说是个问题:崩溃和应用程
- 问题:核心转储可能相当大(高达5或10 GB)。核心文件的副本需要一定的时间(最多2分钟)。这对我的客户来说是个问题:崩溃和应用程序自动重启之间的时间太长了
- 问题:我使用gdb从1)我的程序2)核心文件生成回溯。 当应用程序崩溃时,会调用一个自定义脚本:在这个程序中,我是否可以直接将gdb连接到“垂死”程序,并生成回溯,以便有时间将核心文件复制到HDD上
- 我尽我所能将核心转储的大小减少到最小(没有调试符号,只转储回溯所需的内容(请参阅))
- 您不必添加整个
gdb
,只需对崩溃程序进行回溯即可。只需截取SIGBUS之类的信号,当收到信号时,您可以使用或简单地使用程序的pid调用gstack。关于如何在不生成复制/粘贴形式的堆芯转储的情况下获得堆栈跟踪,有一个很好的答案
它将生成一个到stderr的stacktrace,但是您可以轻松地执行一些不同的操作,例如使用HTTP等发布stacktrace数据。在构建时是否尝试减少调试信息?我的意思是,例如,使用
-g1
而不是-g
;优化-O1
或-O2
不应可靠工作。因为回溯
不是异步信号安全的。看见