Advanced and improved absolute paths decoding
Mike Frysinger
vapier at gentoo.org
Thu Mar 13 09:02:17 UTC 2014
On Tue 11 Mar 2014 15:10:12 Philippe Ombredanne wrote:
> On Tue, Mar 11, 2014 at 12:44 PM, Mike Frysinger wrote:
> > the format will need some way of marking suspended/resumed calls
>
> This would apply only when you follow processes with -f right? -ff has
> no unfinished/resumed business.
> So we could limit support for a structured output to a -ff output only?
> Or would this be too much of a limitation?
fundamentally, strace sees two events -- entering and exiting. the fact that
it appears as one call is merely because nothing happened inbetween and
because it was fast. it would probably be a bad limitation if we only
delivered "whole" results. especially if someone wanted to write a GUI that
used strace as the backend ... when the app hit a sleep() or other long lived
call, they wouldn't see the entry at all until it finished.
also consider that the inputs/outputs could be spread across args. to see
what i mean, run:
strace sleep 2
see how the syscall & first arg are decoded & displayed, then the system
pauses. after 2 seconds, the 2nd arg and the return value are decoded &
displayed. so we probably need to also support delivering info about
inputs/outputs and intermingling them.
{
"syscall": "nanosleep",
"state": "start",
"arg0": {
"dir": "in",
"raw": "0x12345",
"cook": "{1, 0}",
},
}
...
{
"syscall": "nanosleep"
"state": "finish",
"arg1": {
"dir": "out",
"raw": "0x6789",
"cook": "{0, 0}",
},
"ret": "0",
}
that'd probably be fine for a first cut. longer term, we'd probably want to
consider delivering the results broken out even more:
"bake": {
"tv_sec": "1",
"tv_nsec": "0",
}
and instead of packing everything as strings, actually deliver them as
numbers:
"bake": {
"tv_sec": 1,
"tv_nsec": 0,
}
we'd probably have a number of extended options for controlling the output
like dumping the syscall table so people can ingest it easily for GUI
creation.
> > and making
> > sure the other side is able to sanely re-assemble them. and do so across
> > processes/threads/signals/etc... :).
>
> Note that with -f, reconciliation of unfinished to resumed calls can
> be based on the PID and a stack of unfinished calls and afaik there
> should be no ambiguous case of a resumed call that cannot be traced to
> its unfinished call correctly this way.
> So IMHO even if we support a -f structured output there is nothing
> super special to support reassembling these sanely as long as the
> structured output has the pid, as it should.
> We should just make sure that we provide some extra field that states
> a call is unfinished or resumed.
that probably should be sufficient since i think that's how strace is
operating internally already
> Sidebar: how to handle structured PIDs with -ff vs. -f:
> - in -ff today, the trace does not contain the PID, only the trace
> filename holds the PID.
> - with -f the trace contains the PID on each line.
>
> I think we should err on dealing with PIDs in a uniform way with -f or
> -ff and always have a pid field in these cases, even if there might be
sounds fine
> Other suspension cases could be things that happen after some signal
> interruptions (even in a -ff trace) such as:
>
> nanosleep({15, 0}, NULL) = ? ERESTART_RESTARTBLOCK
> (Interrupted by signal)
> --- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=3948067, si_uid=1000}
> --- restart_syscall(<... resuming interrupted call ...>) = 0
this isn't specific to -f or -ff. you'll always see this behavior.
strace sleep 1000
now in a diff term, do:
kill -STOP `pidof sleep`
kill -CONT `pidof sleep`
further consider what happens if you have a custom signal handler that makes
syscalls. when it returns, the original syscall will be resumed. or if you
have nested signals.
this is another reason why a flat array won't really work ... strace also
needs to pass along event information that aren't syscall related like
signals.
> - always include a pid field in the structured output of -f and -ff
> - add a field to support unfinished/resumed business with -f. This
> could be something like a "state" field with possible values of empty,
> unfinished or resumed
i think it'd go even deeper. every syscall (independent of -f/-ff) would have
a state field.
state: {start, resume, finish}
> A stylistic question would be:
> should fields be always included even if empty in the case of pid or
> state? or should they be only present if asked for?
> aka sparse vs. dense output? I would tend to prefer sparse without
> empty values than dense with empty values a dense output with empty
> values would still require a parser to test for empties. sparse values
> would require to test for presence, so in both case the parser would
> have to test something.
sparse should be fine. any sane JSON parser can deal with this easily.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20140313/4a89fdc1/attachment.bin>
More information about the Strace-devel
mailing list