[PATCH] make strace handle SIGTRAP properly
Denys Vlasenko
dvlasenk at redhat.com
Fri May 27 12:46:58 UTC 2011
On Fri, 2011-05-27 at 02:23 +0400, Dmitry V. Levin wrote:
> On Thu, May 26, 2011 at 10:55:14AM +0200, Denys Vlasenko wrote:
> [...]
> > Please take a look at the patch below. It should have all your
> > suggestions incorporated.
>
> Thanks, OK for me, with one more suggestion related to *error_msg*()
> implementation.
>
> > -static void error_msg_and_die(const char *fmt, ...)
> > -#if defined __GNUC__
> > - __attribute__ ((noreturn, format(printf, 1, 2)))
> > -#endif
> > -;
> > -static void error_msg_and_die(const char *fmt, ...)
> > +static void verror_msg(int err_and_exitflag, const char *fmt, va_list p)
> > {
> > char *msg;
> > - va_list p;
> >
> > - va_start(p, fmt);
> > msg = NULL;
> > vasprintf(&msg, fmt, p);
> > if (msg) {
> > - fprintf(stderr, "%s: %s\n", progname, msg);
> > + int err = err_and_exitflag & INT_MAX;
> > + fflush(NULL);
> > + if (err)
> > + fprintf(stderr, "%s: %s: %s\n", progname, msg, strerror(err));
> > + else
> > + fprintf(stderr, "%s: %s\n", progname, msg);
> > free(msg);
> > }
> > +
> > + if (err_and_exitflag & ((unsigned)INT_MAX+1)) {
> > + /* Careful: don't do cleanup not from tracer process */
> > + if (strace_tracer_pid == getpid()) {
> > + /* TODO? cflag = 0; -- or else cleanup() may print summary */
> > + cleanup();
> > + }
> > + exit(1);
> > + }
> > +}
>
> I think it would be more readable just to create a simple die() function
> instead:
>
> static void die(void) __attribute__ ((noreturn))
> {
> if (strace_tracer_pid == getpid()) {
> cflag = 0;
> cleanup();
> }
> exit(1);
> }
>
> > +void error_msg_and_die(const char *fmt, ...)
> > +{
> > + va_list p;
> > + va_start(p, fmt);
> > + verror_msg(((unsigned)INT_MAX+1), fmt, p);
> > + exit(1); /* verror_msg won't return. shut up compiler's warning */
>
> verror_msg(0, fmt, p);
> die();
>
> > +}
> > +
> > +void perror_msg(const char *fmt, ...)
> > +{
> > + va_list p;
> > + va_start(p, fmt);
> > + verror_msg(errno, fmt, p);
> > + va_end(p);
> > +}
> > +
> > +void perror_msg_and_die(const char *fmt, ...)
> > +{
> > + va_list p;
> > + va_start(p, fmt);
> > + verror_msg(((unsigned)INT_MAX+1) | errno, fmt, p);
> > + exit(1); /* verror_msg won't return. shut up compiler's warning */
>
> verror_msg(errno, fmt, p);
> die();
Yes, this seems to be a better way to do that.
I pushed the patch to git. Thanks!
--
vda
More information about the Strace-devel
mailing list