[PATCH v5 1/3] Introduce -l/--syscall-limit option

Dmitry V. Levin ldv at strace.io
Sun Mar 26 21:30:37 UTC 2023


On Sun, Mar 26, 2023 at 08:34:17PM +0530, Sahil Siddiq wrote:
> On Sunday, 26 March 2023 16:06:04 IST Dmitry V. Levin wrote:
> > On Sun, Mar 26, 2023 at 03:57:24PM +0530, Sahil Siddiq wrote:
> > > Hi,
> > > 
> > > Thank you for the feedback. There are a few things that I haven't
> > > really understood.
> > > 
> > > On Sunday, 26 March 2023 01:11:07 IST Dmitry V. Levin wrote:
> > > > On Mon, Mar 20, 2023 at 11:10:56AM +0530, Sahil Siddiq wrote:
> > > > [...]
> > > > for example, a tracee
> > > > doesn't invoke syscalls, strace -l won't finish.
> > > 
> > > I didn't understand this example. In case the argument to -l is greater
> > > than the number of syscalls that are invoked, wouldn't strace proceed
> > > as usual? If the tracee does not invoke any syscall, the syscall_limit
> > > counter will not decrease in syscall_exiting_trace().
> > 
> > Here is an example: take your strace--syscall-limit.c test, insert sleep(60)
> > right before the waitpid loop, and see what happens.
> 
> I am still a bit confused. I inserted sleep(60) so that the test snippet now looks
> like this:
> 
>         sleep(60);
>         while ((waitpid(child, &status, 0)) != child) {
>                 if (errno == EINTR)
>                         continue;
>                 perror_msg_and_fail("waitpid: %d", child);
>         }
> 
> I first ran the following command:
> 
> strace --signal='!SIGCHLD,SIGCONT' --quiet=path-resolution -f -a 9 --trace=chdir,getpid --syscall-limit=3 ./strace--syscall-limit
> 
> This gives the same output that I would expect. It prints only the first three syscalls
> that were traced along with the "process <pid> attached/detached" log lines and it
> terminates after that.
> 
> However, when running "bash ./strace--syscall-limit.test", the test indeed does not
> terminate.
> 
> Running "ps f" gives the following output:
> 
>   11441 pts/2    Ss     0:00 /bin/bash
> 254572 pts/2    S+     0:00  \_ bash ./strace--syscall-limit.test
> 254648 pts/2    S+     0:00      \_ ../../src/strace -o log --signal=!SIGCHLD,SIGCONT --quiet=path-resolution -f -a 9 --trace=chdir,getpid --syscall-limit=3
> 254651 pts/2    S+     0:00          \_ ../strace--syscall-limit
> 254652 pts/2    Z+     0:00              \_ [strace--syscall] <defunct>
> 
> I wonder why this is the case. I'll try to figure this out.

The test doesn't hang, what you see is that strace is waiting for the
syscall behind sleep(60) to exit, at that moment strace will detach that
process and the test will finish.

As I said before, all you need is to break the event loop
almost as if strace was terminated.


-- 
ldv


More information about the Strace-devel mailing list