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

时间:2016-07-25 12:20:42

标签: version-control core dump

我需要严格地将系统生成的每个核心文件绑定到崩溃的应用程序的某个bin版本。我可以在sysctl.conf中指定core-name模式:kernel.core_pattern,但是没有办法把bin版本放在这里。

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

1 个答案:

答案 0 :(得分:0)

  

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

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

从男人5核心:

Piping core dumps to a program
       Since  kernel  2.6.19,  Linux  supports  an  alternate  syntax  for the
       /proc/sys/kernel/core_pattern file.  If the  first  character  of  this
       file  is  a  pipe  symbol (|), then the remainder of the line is inter‐
       preted as a program to be executed.  Instead of being written to a disk
       file,  the  core  dump is given as standard input to the program.  Note
       the following points:

       *  The program must be specified using an absolute pathname (or a path‐
          name relative to the root directory, /), and must immediately follow
          the '|' character.

       *  The process created to run the program runs as user and group root.

       *  Command-line arguments can be supplied to the program  (since  Linux
          2.6.24),  delimited by white space (up to a total line length of 128
          bytes).

       *  The command-line arguments can  include  any  of  the  %  specifiers
          listed  above.   For example, to pass the PID of the process that is
          being dumped, specify %p in an argument.

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

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

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

这样的事情可能有用(我还没有尝试过,所以在极端风险下使用:)

#!/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仅允许来自可以在没有核心转储的情况下打印出自己版本的进程的核心转储。

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