How can I see which system calls my Java program is making? Is there a tool that will do this on Linux?
3 Answers
Use strace. But there is is trick for my case. Option -f is needed and is the same as --follow-forks. For example, the following code:
public class Foo { public static void main (String [] args) { System.out.println("XXX"); } } After running javac Foo.java to compile it, strace java Foo 2>&1 | grep write print nothing. But strace -f java Foo 2>&1 | grep write prints:
[pid 11655] write(3, "0x63", 4) = 4 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(3, "\0", 1) = 1 [pid 11655] write(1, "XXX", 3XXX) = 3 [pid 11655] write(1, "\n", 1 [pid 11655] write(1, "XXX", 3XXX) = 3 shows the system call made for System.out.println("XXX").
Comments
see ltrace http://linux.die.net/man/1/ltrace
2 Comments
Mike Kwan
ptrace might be more useful in this case
Pavan Manjunath
@MikeKwan
ltrace is for library function calls and ptrace is to examine other process' memory. strace is the one for system calls.
strace java your_program?