Generally, you should use `kill -15` before `kill -9` to give the target process a chance to clean up after itself. (Processes can't catch or ignore `SIGKILL`, but they can and often do catch `SIGTERM`.) If you don't give the process a chance to finish what it's doing and clean up, it may leave corrupted files (or other state) around that it won't be able to understand once restarted.

`strace`/`truss`, `ltrace` and `gdb` are generally good ideas for looking at why a stick process is stuck. (`truss -u` on Solaris is particularly helpful; I find `ltrace` too often presents arguments to library calls in an unusable format.) Solaris also has useful `/proc`-based tools, some of which have been ported to Linux. (`pstack` is often helpful).