我需要严格地将系统生成的每个核心文件绑定到崩溃的应用程序的某个bin版本。我可以在sysctl.conf中指定core-name模式:kernel.core_pattern,但是没有办法把bin版本放在这里。
如何将崩溃程序的版本放入核心文件(修订版号)或任何其他方式来确定崩溃的垃圾箱的版本?
答案 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仅允许来自可以在没有核心转储的情况下打印出自己版本的进程的核心转储。
如果它是您期望的程序,最好更改脚本以重新运行程序以获取版本信息 。