Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

strace on Linux not logging all calls to open()

I am using strace to capture calls to open(), close() and read() on Linux. The target process is the jetty web server. As far as I can tell, strace is not logging all calls to open(). Maybe the others too, I have not tried to correlate the file descriptors to open() calls.

For example, starting strace:

strace -f -e trace=open,close,read -o/tmp/strace.out -p62881

I then use wget to fetch 100 static files; all were retrieved successfully. In one run, only 56 open events were logged; on another run of 100 different files, I got 66 open events.

I believe that using "-f" results in strace attaching to all the LWPIDs for the threads ("Process 62881 attached with 25 threads - interrupt to quit "); when I try to explicitly attach to all using multiple "-p" options, I get a single "attach" success message, but multiple "Operation not permitted messages", one for each child PID.

I restarted Jetty to clear its cache before my tests.

Kernel version is 2.6.32-504.3.3.el6.x86_64 (Red Hat). Strace package version is strace-4.5.19-1.19.el6.x86_64.

What am I missing?

Thanks

like image 283
Jim Gallagher Avatar asked Apr 13 '16 18:04

Jim Gallagher


People also ask

How do you trace all the function calls in a running process Linux?

If a process is already running, you can trace it by simply passing its PID as follows; this will fill your screen with continues output that shows system calls being made by the process, to end it, press [Ctrl + C] .

Which command is used to check system calls in Linux?

The ls command internally calls functions from system libraries (aka glibc) on Linux. These libraries invoke the system calls that do most of the work.

How does strace call work?

strace works by using the ptrace system call which causes the kernel to halt the program being traced each time it enters or exits the kernel via a system call. The tracing program (in this case strace ) can then inspect the state of the program by using ptrace .


1 Answers

On some systems you have to use openat() instead of open().

Try: strace -f -e trace=openat,close,read -o/tmp/strace.out -p62881

like image 79
Abhijeet Pathak Avatar answered Oct 06 '22 17:10

Abhijeet Pathak