У меня есть файл ядра, но я не уверен, какая версия программы создала его. Когда я использую команду file
, я получаю только двоичное имя, а не версию.
% file core.20200730-1203
core.20200730-1203: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from 'qdrouterd -c /tmp/qdrouterd.json', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: '/usr/sbin/qdrouterd', platform: 'x86_64'
Я могу попытаться предоставить моему отладчику несколько двоичных файлов по очереди, которые, как мне кажется, близки по версии, и вижу что работает, а что нет.
Я считаю, что решение состоит в том, чтобы поместить строковую константу с версией в программный код. Дампы ядра содержат программный код, поскольку он загружается в память для выполнения, и поэтому я должен иметь возможность восстановить его с помощью команды strings
.
В настоящее время программа содержит следующее, где QPID_DISPATCH_VERSION
- макрос препроцессора.
qd_log(router->log_source, QD_LOG_INFO, "Version: %s", QPID_DISPATCH_VERSION);
Я могу добраться до него с помощью
% strings core.20200730-1203 | grep -A3 -B3 "Version: "
Activating management agent on $_management_internal
router
Router Engine Instantiated: id=router-default-0 instance=1596103149 max_routers=128
Version: 1.13.0-SNAPSHOT
Router started in Interior mode, area=0 id=router-default-0
Container Name: router-default-0
Milan
, но это, вероятно, просто случайность, строка журнала, которая все еще присутствовала в памяти на момент cra sh.
Каков надежный способ кодирования и восстановления информации о версии?