В Linux возможно ли gcore процесс, исполняемый файл которого был удален?
Программируя на CentOS 6.6, я удалил исполняемый файл (упс, make clean
) пока он работал в сеансе экрана.
Теперь, не связанные, я хочу gcore
процесс отладки чего-либо. Я восстановил исполняемый файл, но gcore
не принимает замененный файл. Он знает, что оригинальный файл был удален, и не позволит мне сбросить ядро.
# gcore 15659
core.YGsoec:4: Error in sourced command file:
/home/dev/bin/daemon/destinyd (deleted): No such file or directory.
gcore: failed to create core.15659
# ls -l /proc/15659/exe
lrwxrwxrwx. 1 root root 0 Mar 12 21:33 /proc/15659/exe -> /home/dev/bin/daemon/destinyd (deleted)
# ln -s /proc/15659/exe /home/dev/bin/daemon/destinyd
ln: creating symbolic link `/home/dev/bin/daemon/destinyd': File exists
# rm /proc/15659/exe
rm: remove symbolic link `/proc/15659/exe'? y
rm: cannot remove `/proc/15659/exe': Permission denied
файле FreeBSDgcore
имеет необязательный аргумент "исполняемый файл", который выглядит многообещающе (как если бы я мог указать двоичный файл для использования, который не является /proc/15659/exe
), но это бесполезно для меня, как для Linuxgcore
не имеет такого аргумента.
Есть ли обходные пути? Или мне просто нужно будет перезапустить процесс (с помощью воссозданного исполняемого файла) и дождаться, пока отслеживаемая ошибка не воспроизведет себя?
1 ответ
Несмотря на выход ls -l /proc/15659/exe
исходный исполняемый файл фактически все еще доступен по этому пути.
Таким образом, я не только смог восстановить исходный файл с помощью простого cp
(хотя этого было недостаточно, чтобы восстановить ссылку и получить gcore
работать), но я смог подключить GDB к процессу, используя этот путь в качестве исполняемого файла:
# gdb -p 15659 /proc/15659/exe
а затем запустить " generate-core-file
"команда, а затем" detach
".
Затем я стал свободно проверять файл ядра по мере необходимости:
# gdb /proc/15659/exe core.15659
По правде говоря, я забыл о способности GDB генерировать файлы ядра, плюс я беспокоился о том, чтобы на самом деле подключить GDB к процессу, потому что время было очень важным: генерировать файл ядра точно в нужное время, чтобы исправить эту ошибку.
Но ни один не вернул меня на этот путь, и, мои опасения, очевидно, необоснованные, GDB был в состоянии произвести прекрасный core.15659
для меня.