В 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 для меня.

Другие вопросы по тегам