2016-07-25 9 views
0

Мне нужно строго привязать каждый файл ядра, сгенерированный системой, к определенной бин-версии разбитого приложения. Я могу указать шаблон core-name в sysctl.conf: kernel.core_pattern, но здесь нет возможности поместить версию bin.Основной дамп: как определить версию разбитого приложения

Как я могу поместить версию разбитой программы в основной файл (номер версии) или любым другим способом определить версию разбитого бина?

+0

Что такое бин версия? Вы сохраняете какую-то переменную где-то в исполняемом файле, который нужно извлечь, чтобы получить номер версии? – evaitl

+0

Я использую переменную qmake VERSION в файле .pro, которая содержит номер версии из SVN. Его доступно QCoreApplication :: applicationVersion(), в моем каждом бункере по флагом --version. – portinary

ответ

0

Я использую переменную qmake VERSION в файле .pro, которая содержит номер версии из SVN. Его доступно QCoreApplication :: applicationVersion(), в моем каждом бункере по флагом --version.

Предполагая, что ваше приложение может получить достаточно далеко, чтобы распечатать его номер версии без дампа ядра, вы можете написать небольшую программу (питон, вероятно, будет проще всего), который вызывается с помощью дампа ядра. Программа будет читать 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/местные/бен/самосвал, затем

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, чтобы разрешать только отвалы ядра от процессов, которые могут распечатывать собственные версии без сброса ядра.

Было бы неплохо изменить сценарий для повторного запуска программы, чтобы получить информацию о версии только, если это программа, которую вы ожидаете.