Another way of doing this is to send QUIT signal to the PID (kill –3 PID), but the thread dump will be directed to stdout, which can be viewed with “cat /proc/PID/fd/1 |tee /tmp/dump.log”, messages will be constantly directed to /proc/PID/fd/1 until the process is stopped. So it is useful for real time debugging.
The following java application example use gcore command in gdb. (gcore or kill –3 will not stop the process )
Linux default core file size is 0, which means core dump is disabled, It needs to be changed to unlimited
#ulimit -a | grep core core file size (blocks, -c) 0 #ulimit –c unlimited #ulimit -a | grep core core file size (blocks, -c) unlimited
Firstly, find the virtual memory size of the process, the PID is 10008 in following example.
# ps aux | egrep 'VSZ| 10008'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 10008 0.4 8.3 2231312 660100 ? Sl Jun03 43:57 /opt/sunjdk6/bin/java
The process VSZ=2.2GB, it will be the size of the core file. Go to a dump dir which has more than 2.2GB free space
$cd /var/tmp
Attach to running process PID.
$gdb --pid=10008
At the gdb prompt, enter gcore command
gdb>gcore
wait for few minutes for core file to be generated. type in quit to exit gdb, answer yes to detach the process.
gdb>quit
core file is generated
$ ls -lh /var/tmp/core.10008
-rw-r--r-- 1 root root 2.2G Jun 10 11:59 /var/tmp/core.10008file command reveals the source program name
$ file /var/tmp/core.10008 /var/tmp/core.10008: ELF 64-bit LSB core file AMD x86-64, version 1 (SYSV), SVR4-style, from 'java'