在核心生成期间压缩核心文件

时间:2011-02-21 07:20:33

标签: linux

在linux 2.6.x中,有没有办法在核心转储生成过程中压缩核心文件?基本上,我们的系统存储空间有限,因此我们无法生成完整的核心文件,然后再进行gzip。

的问候, 普拉巴卡尔

3 个答案:

答案 0 :(得分:16)

Linux内核/proc/sys/kernel/core_pattern文件将执行您想要的操作:http://www.mjmwired.net/kernel/Documentation/sysctl/kernel.txt#141

将文件名设置为|/bin/gzip -1 > /var/crash/core-%t-%p-%u.gz,您的核心文件应该为您压缩保存。

答案 1 :(得分:0)

对于嵌入式Linux系统,以下脚本更改可以完美地完成两步生成压缩核心文件的工作

步骤1:创建脚本

touch /bin/gen_compress_core.sh
chmod +x /bin/gen_compress_core.sh

cat > /bin/gen_compress_core.sh #!/bin/sh exec /bin/gzip -f - >"/var/core/core-$1.$2.gz"
ctrl +d

步骤2:更新核心特征码文件

cat > /proc/sys/kernel/core_pattern |/nuova/bin/gen_compress_core.sh %e %p ctrl+d

答案 2 :(得分:0)

根据其他答案的建议,Linux内核/ proc / sys / kernel / core_pattern文件是一个不错的起点:http://www.mjmwired.net/kernel/Documentation/sysctl/kernel.txt#141

如文档所述,您可以指定特殊字符“ |”这将告诉内核将文件输出到脚本。如建议的那样,您可以使用| / bin / gzip -1> /var/crash/core-%t-%p-%u.gz作为名称,但是它似乎不适用于我。我希望这是因为在我的系统内核上,不会将>字符视为输出,而是可能将其作为参数传递给gzip。

为了避免此问题,像其他建议一样,您可以在我正在使用/home//crash/core.sh的某个位置创建文件,请使用以下命令创建它,并替换为您的用户。另外,您也可以明显地更改整个路径。

echo -e '#!/bin/bash\nexec /bin/gzip -f - >"/home/<username>/crashes/core-$1-$2-$3-$4-$5.gz"' > ~/crashes/core.sh

现在,此脚本将使用5个输入参数并将其连接起来并添加到core-path。完整路径必须在〜/ crashes / core.sh中指定。还可以指定此脚本的位置。现在让我们告诉内核在生成文件时使用带有参数的tour可执行文件:

sudo sysctl -w kernel.core_pattern="|/home/<username>/crashes/core.sh %e %p %h %t"

应该再次替换(或整个路径以匹配core.sh脚本的位置和名称)。下一步是使某些程序崩溃,让我们创建崩溃的cpp文件示例:

int main (){
    int * a = nullptr;
    int b = *a;
}

编译并运行后,有两个选项,我们将看到:

  

分段错误(核心已转储)

  

分段错误

如果我们看到后者,则可能的原因很少。

  1. 未设置ulimit,ulimit -c应该指定什么是内核限制
  2. apport或您的发行版核心转储收集器未运行,应对此进行进一步调查
  3. 我们编写的脚本中有错误,我建议您检查一些基本的转储路径,以检查是否其他原因不是以下内容创建/tmp/core.dump的原因:

    sudo sysctl -w kernel.core_pattern="/tmp/core.dump"
    

我知道这个问题已经有了答案,但是对我来说,为什么它不能“开箱即用”并不明显,所以我想总结一下我的发现,希望对大家有所帮助。