[Spice-devel] [PATCH] common: add backtrace via gstack

Alon Levy alevy at redhat.com
Thu Jul 14 02:24:02 PDT 2011


On Thu, Jul 14, 2011 at 11:53:30AM +0300, Uri Lublin wrote:
> On 07/14/2011 10:50 AM, Alon Levy wrote:
> >Add a backtrace printing function copied from xserver os/backtrace.c
> >that uses gstack which seems to be available enough that xserver uses it :)
> >Used in ASSERT, tested on F15.
> >---
> >diff --git a/common/backtrace.c b/common/backtrace.c
> >+
> >+        while (!done) {
> >+            bytesread = read(pipefd[0], btline, sizeof(btline) - 1);
> >+
> >+            if (bytesread>  0) {
> >+                btline[bytesread] = 0;
> >+                red_printf("%s", btline);
> 
> nitpick: why not just printf similarly to ASSERT below ?

right, should be printf. But just because red_printf adds a prefix.

> 
> >+            }
> >+            else if ((bytesread<  0) ||
> >+                     ((errno != EINTR)&&  (errno != EAGAIN)))
> >+                done = 1;
> 
> This seems wrong. If read() fails due to EINTR or EAGAIN this
> condition breaks out of the while loop.
> I think it should be
>     ((bytesread < 0) && (errno != EINTR) && (errno != EAGAIN))
> 
> or (break when read() returns the value 0 -- end of file)
>     ((bytesread == 0) || ((errno != EINTR)&&  (errno != EAGAIN)))
> 

You're right. I think both would work, the second is nicer.

> >+        }
> >diff --git a/common/spice_common.h b/common/spice_common.h
> >
> >  #define ASSERT(x) if (!(x)) {                               \
> >      printf("%s: ASSERT %s failed\n", __FUNCTION__, #x);     \
> >+    backtrace();                                           \
> >      abort();                                                \
> >  }
> >
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list