Under Linux, is it possible to gcore a process whose executable has been deleted?

2.7k Views Asked by At

Programming on CentOS 6.6, I deleted an executable (whoops, make clean) while it was running in a screen session.

Now, unrelated, I want to gcore the process to debug something. I have rebuilt the executable, but gcore doesn't accept the replaced file. It knows the original file was deleted and won't let me dump core.

# 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

FreeBSD's gcore has an optional argument "executable" which looks promising (as if I could specify a binary to use that is not /proc/15659/exe), but that's of no use to me as Linux's gcore does not have any such argument.

Are there any workarounds? Or will I just have to restart the process (using the recreated executable) and wait for the bug I'm tracking to reproduce itself?

1

There are 1 best solutions below

0
Lightness Races in Orbit On BEST ANSWER

Despite the output of ls -l /proc/15659/exe, the original executable is in fact still available through that path.

So, not only was I able to restore the original file with a simple cp (though this was not enough to restore the link and get gcore to work), but I was able to attach GDB to the process using this path as executable:

# gdb -p 15659 /proc/15659/exe

and then run the "generate-core-file" command, followed by "detach".

Then, I became free to examine the core file as needed:

# gdb /proc/15659/exe core.15659

In truth I had forgotten about the ability of GDB to generate core files, plus I was anxious about actually attaching GDB to the process because timing was quite important: generating the core file at precisely the right time to catch that bug.

But nos steered me back onto this path and, my fears apparently unfounded, GDB was able to produce a lovely core.15659 for me.