在linux 2.6.x中,有没有办法在核心转储生成过程中压缩核心文件?基本上,我们的系统存储空间有限,因此我们无法生成完整的核心文件,然后再进行gzip。
的问候, 普拉巴卡尔
答案 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系统,以下脚本更改可以完美地完成两步生成压缩核心文件的工作
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
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;
}
编译并运行后,有两个选项,我们将看到:
分段错误(核心已转储)
或
分段错误
如果我们看到后者,则可能的原因很少。
我们编写的脚本中有错误,我建议您检查一些基本的转储路径,以检查是否其他原因不是以下内容创建/tmp/core.dump的原因:
sudo sysctl -w kernel.core_pattern="/tmp/core.dump"
我知道这个问题已经有了答案,但是对我来说,为什么它不能“开箱即用”并不明显,所以我想总结一下我的发现,希望对大家有所帮助。