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. --- common/Makefile.am | 2 + common/backtrace.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ common/backtrace.h | 24 +++++++++++++ common/spice_common.h | 2 + 4 files changed, 116 insertions(+), 0 deletions(-) create mode 100644 common/backtrace.c create mode 100644 common/backtrace.h
diff --git a/common/Makefile.am b/common/Makefile.am index e0f4d49..f07f948 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -36,6 +36,8 @@ libspice_common_la_SOURCES = \ spice_common.h \ ssl_verify.c \ ssl_verify.h \ + backtrace.c \ + backtrace.h \ $(NULL) if SUPPORT_GL diff --git a/common/backtrace.c b/common/backtrace.c new file mode 100644 index 0000000..658b6b0 --- /dev/null +++ b/common/backtrace.c @@ -0,0 +1,88 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (C) 2011 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +/* + * Taken from xserver os/backtrace.c: + * Copyright 2008 Red Hat, Inc. + */ + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/wait.h> +#include "common/spice_common.h" + +static int backtrace_gstack(void) { + pid_t kidpid; + int pipefd[2]; + + if (pipe(pipefd) != 0) { + return -1; + } + + kidpid = fork(); + + if (kidpid == -1) { + /* ERROR */ + return -1; + } else if (kidpid == 0) { + /* CHILD */ + char parent[16]; + + seteuid(0); + close(STDIN_FILENO); + close(STDOUT_FILENO); + dup2(pipefd[1],STDOUT_FILENO); + close(STDERR_FILENO); + + snprintf(parent, sizeof(parent), "%d", getppid()); + execle("/usr/bin/gstack", "gstack", parent, NULL, NULL); + exit(1); + } else { + /* PARENT */ + char btline[256]; + int kidstat; + int bytesread; + int done = 0; + + close(pipefd[1]); + + while (!done) { + bytesread = read(pipefd[0], btline, sizeof(btline) - 1); + + if (bytesread > 0) { + btline[bytesread] = 0; + red_printf("%s", btline); + } + else if ((bytesread < 0) || + ((errno != EINTR) && (errno != EAGAIN))) + done = 1; + } + close(pipefd[0]); + waitpid(kidpid, &kidstat, 0); + if (kidstat != 0) + return -1; + } + return 0; +} + +void backtrace() { + backtrace_gstack(); /* no implementation other then via gstack */ +} diff --git a/common/backtrace.h b/common/backtrace.h new file mode 100644 index 0000000..83a54a1 --- /dev/null +++ b/common/backtrace.h @@ -0,0 +1,24 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (C) 2011 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BACKTRACE_H +#define BACKTRACE_H + +void backtrace(void); + +#endif // BACKTRACE_H diff --git a/common/spice_common.h b/common/spice_common.h index bc74486..d58c558 100644 --- a/common/spice_common.h +++ b/common/spice_common.h @@ -22,9 +22,11 @@ #include <stdint.h> #include <time.h> #include <stdlib.h> +#include "backtrace.h" #define ASSERT(x) if (!(x)) { \ printf("%s: ASSERT %s failed\n", __FUNCTION__, #x); \ + backtrace(); \ abort(); \ } -- 1.7.6 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel