核心转储:如何确定崩溃应用程序的版本

问题描述 投票:0回答:1

我需要将系统生成的每个核心文件严格绑定到崩溃应用程序的某个 bin 版本。我可以在 sysctl.conf:kernel.core_pattern 中指定核心名称模式,但无法在此处放置 bin 版本。

如何将崩溃程序的版本放入核心文件(修订号)或任何其他方式来确定崩溃bin的版本?

version-control coredump
1个回答
1
投票

我在 .pro 文件中使用 qmake VERSION 变量,其中包含 SVN 的修订号。它可以通过 QCoreApplication::applicationVersion() 获得,在我的每个 bin 中通过标志 --version

假设您的应用程序可以在没有核心转储的情况下打印出其版本号,您可以编写一个由核心转储调用的小程序(Python 可能是最简单的)。该程序将读取标准输入,将其转储到文件中,然后根据版本号重命名该文件。

来自男人5核心:

将核心转储传送到程序
       从内核 2.6.19 开始,Linux 支持替代语法
       /proc/sys/kernel/core_pattern 文件。如果这个的第一个字符
       file 是管道符号 (|),则该行的其余部分是内部的
       解释为要执行的程序。而不是写入磁盘
       文件中,核心转储作为程序的标准输入给出。笔记
       以下几点:

       * 必须使用绝对路径名(或路径)指定程序
          相对于根目录的名称,/),并且必须紧跟其后
          '|'特点。

       * 为运行程序而创建的进程以 root 用户和组身份运行。

       * 可以向程序提供命令行参数(因为 Linux
          2.6.24),由空格分隔(总行长度最多为 128
          字节)。

       * 命令行参数可以包含任何 % 说明符
          以上所列。例如,传递进程的 PID
          被转储时,请在参数中指定 %p。

如果您调用脚本 /usr/local/bin/dumper,则

echo "| /usr/local/bin/dumper %E" > /proc/sys/kernel/core_pattern

转储程序应将标准输入复制到文件,然后尝试运行在其命令行上命名的程序以提取版本号并使用它来重命名文件。

这样的东西可能会起作用(我还没有尝试过,所以使用时要冒极大的风险:)

#!/usr/bin/python
import sys,os,subprocess
from subprocess import check_output

CORE_FNAME="/tmp/core"

with open(CORE_FNAME,"f") as f:
    while buf=sys.stdin.read(10000):
        f.write(buf)

pname=sys.argv[1].replace('!','/')
out=subprocess.check_output([pname, "--version"])
version=out.split('\n')[0].split()[-1]
os.rename(CORE_FNAME, CORE_FNAME+version)

这样做的真正巨大风险是递归核心转储可能会导致系统崩溃。请务必使用 ulimit 来仅允许可以打印出自己的版本而不进行核心转储的进程进行核心转储。

最好更改脚本以重新运行程序以获取版本信息如果它是您期望的程序。

© www.soinside.com 2019 - 2024. All rights reserved.