C++ 如何避免写入核心文件并加快回溯生成

C++ 如何避免写入核心文件并加快回溯生成,c++,linux,gdb,core,C++,Linux,Gdb,Core,在我提问之前,我简要描述一下我是如何从我的客户那里得到回溯的。 我在Linux上编写了一个C++应用程序(opSuSE)。 此应用程序由脚本(启动器)启动,如果应用程序崩溃,将生成一个核心转储(因为ulimit-c unlimited)。 然后,启动器从包含gdb的核心文件生成回溯,并再次启动应用程序,这使得用户可以发送包含回溯的崩溃报告 现在我的问题和我的问题: 问题:核心转储可能相当大(高达5或10 GB)。核心文件的副本需要一定的时间(最多2分钟)。这对我的客户来说是个问题:崩溃和应用程

在我提问之前,我简要描述一下我是如何从我的客户那里得到回溯的。 我在Linux上编写了一个C++应用程序(opSuSE)。 此应用程序由脚本(启动器)启动,如果应用程序崩溃,将生成一个核心转储(因为ulimit-c unlimited)。 然后,启动器从包含gdb的核心文件生成回溯,并再次启动应用程序,这使得用户可以发送包含回溯的崩溃报告

现在我的问题和我的问题:

  • 问题:核心转储可能相当大(高达5或10 GB)。核心文件的副本需要一定的时间(最多2分钟)。这对我的客户来说是个问题:崩溃和应用程序自动重启之间的时间太长了
  • 问题:我使用gdb从1)我的程序2)核心文件生成回溯。 当应用程序崩溃时,会调用一个自定义脚本:在这个程序中,我是否可以直接将gdb连接到“垂死”程序,并生成回溯,以便有时间将核心文件复制到HDD上
提前谢谢

只是一句话:

  • 我尽我所能将核心转储的大小减少到最小(没有调试符号,只转储回溯所需的内容(请参阅))

    • 您不必添加整个
      gdb
      ,只需对崩溃程序进行回溯即可。只需截取SIGBUS之类的信号,当收到信号时,您可以使用或简单地使用程序的pid调用gstack。

      关于如何在不生成复制/粘贴形式的堆芯转储的情况下获得堆栈跟踪,有一个很好的答案


      它将生成一个到stderr的stacktrace,但是您可以轻松地执行一些不同的操作,例如使用HTTP等发布stacktrace数据。

      在构建时是否尝试减少调试信息?我的意思是,例如,使用
      -g1
      而不是
      -g
      ;优化
      -O1
      -O2
      不应可靠工作。因为
      回溯
      不是异步信号安全的。看见