SOURCES: xorg-xserver-server-backtrace.patch - fixed

arekm arekm at pld-linux.org
Sun Nov 2 15:52:33 CET 2008


Author: arekm                        Date: Sun Nov  2 14:52:33 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- fixed

---- Files affected:
SOURCES:
   xorg-xserver-server-backtrace.patch (1.1 -> 1.2) 

---- Diffs:

================================================================
Index: SOURCES/xorg-xserver-server-backtrace.patch
diff -u SOURCES/xorg-xserver-server-backtrace.patch:1.1 SOURCES/xorg-xserver-server-backtrace.patch:1.2
--- SOURCES/xorg-xserver-server-backtrace.patch:1.1	Sun Nov  2 15:48:19 2008
+++ SOURCES/xorg-xserver-server-backtrace.patch	Sun Nov  2 15:52:27 2008
@@ -1,3 +1,430 @@
+From 7a8a31c041b52d87c1522e684cb301b07ea6ad9b Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax at redhat.com>
+Date: Fri, 10 Oct 2008 15:53:48 -0400
+Subject: [PATCH] Move xorg_backtrace() up to the OS level so we can call it from DIX.
+
+---
+ hw/xfree86/common/xf86Events.c |  173 ----------------------------------
+ include/os.h                   |    2 +
+ os/Makefile.am                 |    1 +
+ os/backtrace.c                 |  202 ++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 205 insertions(+), 173 deletions(-)
+ create mode 100644 os/backtrace.c
+
+diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
+index 6ca0ae7..a2c206e 100644
+--- a/hw/xfree86/common/xf86Events.c
++++ b/hw/xfree86/common/xf86Events.c
+@@ -358,179 +358,6 @@
+     xf86SigIllHandler = sigillhandler;
+ }
+ 
+-#ifdef HAVE_BACKTRACE
+-#include <execinfo.h>
+-
+-static __inline__ void xorg_backtrace(void)
+-{
+-    void *array[32]; /* deeper nesting than this means something's wrong */
+-    size_t size, i;
+-    char **strings;
+-    ErrorF("\nBacktrace:\n");
+-    size = backtrace(array, 32);
+-    strings = backtrace_symbols(array, size);
+-    for (i = 0; i < size; i++)
+-        ErrorF("%d: %s\n", i, strings[i]);
+-    free(strings);
+-}
+-
+-#else /* not glibc or glibc < 2.1 */
+-
+-# if defined(sun) && defined(__SVR4)
+-#  define HAVE_PSTACK
+-# endif
+-
+-# if defined(HAVE_WALKCONTEXT) /* Solaris 9 & later */
+-
+-# include <ucontext.h>
+-# include <signal.h>
+-# include <dlfcn.h>
+-# include <sys/elf.h>
+-
+-#ifdef _LP64
+-# define ElfSym Elf64_Sym
+-#else
+-# define ElfSym Elf32_Sym
+-#endif
+-
+-/* Called for each frame on the stack to print it's contents */
+-static int xorg_backtrace_frame(uintptr_t pc, int signo, void *arg)
+-{
+-    Dl_info dlinfo;
+-    ElfSym *dlsym;
+-    char header[32];
+-    int depth = *((int *) arg);
+-
+-    if (signo) {
+-	char signame[SIG2STR_MAX];
+-
+-	if (sig2str(signo, signame) != 0) {
+-	    strcpy(signame, "unknown");
+-	}
+-
+-	ErrorF("** Signal %d (%s)\n", signo, signame);
+-    }
+-
+-    snprintf(header, sizeof(header), "%d: 0x%lx", depth, pc);
+-    *((int *) arg) = depth + 1;
+-
+-    /* Ask system dynamic loader for info on the address */
+-    if (dladdr1((void *) pc, &dlinfo, (void **) &dlsym, RTLD_DL_SYMENT)) {
+-	unsigned long offset = pc - (uintptr_t) dlinfo.dli_saddr;
+-	const char *symname;
+-	
+-	if (offset < dlsym->st_size) { /* inside a function */
+-	    symname = dlinfo.dli_sname;
+-	} else { /* found which file it was in, but not which function */
+-	    symname = "<section start>";
+-	    offset = pc - (uintptr_t)dlinfo.dli_fbase;
+-	}
+-	ErrorF("%s: %s:%s+0x%lx\n", header, dlinfo.dli_fname,
+-	       symname, offset);
+-
+-    } else {
+-	/* Couldn't find symbol info from system dynamic loader, should
+-	 * probably poke elfloader here, but haven't written that code yet,
+-	 * so we just print the pc.
+-	 */
+-	ErrorF("%s\n", header);
+-    }
+-
+-    return 0;
+-}
+-# endif /* HAVE_WALKCONTEXT */
+-
+-# ifdef HAVE_PSTACK
+-static int xorg_backtrace_pstack(void) {
+-    pid_t kidpid;
+-    int pipefd[2];
+-
+-    if (pipe(pipefd) != 0) {
+-	return -1;
+-    }
+-
+-    kidpid = fork1();
+-
+-    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);
+-	closefrom(STDERR_FILENO);
+-
+-	snprintf(parent, sizeof(parent), "%d", getppid());
+-	execle("/usr/bin/pstack", "pstack", parent, 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;
+-		ErrorF("%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;
+-}
+-# endif /* HAVE_PSTACK */
+-
+-
+-# if defined(HAVE_PSTACK) || defined(HAVE_WALKCONTEXT)
+-
+-static __inline__ void xorg_backtrace(void) {
+-
+-    ErrorF("\nBacktrace:\n");
+-
+-#  ifdef HAVE_PSTACK
+-/* First try fork/exec of pstack - otherwise fall back to walkcontext
+-   pstack is preferred since it can print names of non-exported functions */
+-
+-    if (xorg_backtrace_pstack() < 0)
+-#  endif	
+-    {
+-#  ifdef HAVE_WALKCONTEXT
+-	ucontext_t u;
+-	int depth = 1;
+-	
+-	if (getcontext(&u) == 0)
+-	    walkcontext(&u, xorg_backtrace_frame, &depth);
+-	else
+-#  endif
+-	    Error("Failed to get backtrace info");
+-    }
+-    ErrorF("\n");	
+-}
+-
+-# else
+-
+-/* Default fallback if we can't find any way to get a backtrace */
+-static __inline__ void xorg_backtrace(void) { return; }
+-
+-# endif
+-#endif
+-
+ /*
+  * xf86SigHandler --
+  *    Catch unexpected signals and exit or continue cleanly.
+diff --git a/include/os.h b/include/os.h
+--- a/include/os.h
++++ b/include/os.h
+@@ -517,4 +517,6 @@
+ extern void Error(char *str);
+ extern void LogPrintMarkers(void);
+ 
++extern void xorg_backtrace(void);
++
+ #endif /* OS_H */
+diff --git a/os/Makefile.am b/os/Makefile.am
+--- a/os/Makefile.am
++++ b/os/Makefile.am
+@@ -11,6 +11,7 @@
+ 	WaitFor.c	\
+ 	access.c	\
+ 	auth.c		\
++	backtrace.c	\
+ 	connection.c	\
+ 	io.c		\
+ 	mitauth.c	\
+diff --git a/os/backtrace.c b/os/backtrace.c
+new file mode 100644
+--- /dev/null
++++ b/os/backtrace.c
+@@ -0,0 +1,201 @@
++/*
++ * Copyright 2008 Red Hat, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software")
++ * to deal in the software without restriction, including without limitation
++ * on the rights to use, copy, modify, merge, publish, distribute, sub
++ * license, and/or sell copies of the Software, and to permit persons to whom
++ * them Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTIBILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
++ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
++ * IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ */
++
++#ifdef HAVE_DIX_CONFIG_H
++#include <dix-config.h>
++#endif
++
++#include "os.h"
++#include "misc.h"
++
++#ifdef HAVE_BACKTRACE
++#include <execinfo.h>
++
++void xorg_backtrace(void)
++{
++    void *array[32]; /* deeper nesting than this means something's wrong */
++    size_t size, i;
++    char **strings;
++    ErrorF("\nBacktrace:\n");
++    size = backtrace(array, 32);
++    strings = backtrace_symbols(array, size);
++    for (i = 0; i < size; i++)
++        ErrorF("%d: %s\n", i, strings[i]);
++    free(strings);
++}
++
++#else /* not glibc or glibc < 2.1 */
++
++# if defined(sun) && defined(__SVR4)
++#  define HAVE_PSTACK
++# endif
++
++# if defined(HAVE_WALKCONTEXT) /* Solaris 9 & later */
++
++# include <ucontext.h>
++# include <signal.h>
++# include <dlfcn.h>
++# include <sys/elf.h>
++
++#ifdef _LP64
++# define ElfSym Elf64_Sym
++#else
++# define ElfSym Elf32_Sym
++#endif
++
++/* Called for each frame on the stack to print it's contents */
++static int xorg_backtrace_frame(uintptr_t pc, int signo, void *arg)
++{
++    Dl_info dlinfo;
++    ElfSym *dlsym;
++    char header[32];
++    int depth = *((int *) arg);
++
++    if (signo) {
++	char signame[SIG2STR_MAX];
++
++	if (sig2str(signo, signame) != 0) {
++	    strcpy(signame, "unknown");
++	}
++
++	ErrorF("** Signal %d (%s)\n", signo, signame);
++    }
++
++    snprintf(header, sizeof(header), "%d: 0x%lx", depth, pc);
++    *((int *) arg) = depth + 1;
++
++    /* Ask system dynamic loader for info on the address */
++    if (dladdr1((void *) pc, &dlinfo, (void **) &dlsym, RTLD_DL_SYMENT)) {
++	unsigned long offset = pc - (uintptr_t) dlinfo.dli_saddr;
++	const char *symname;
++	
++	if (offset < dlsym->st_size) { /* inside a function */
++	    symname = dlinfo.dli_sname;
++	} else { /* found which file it was in, but not which function */
++	    symname = "<section start>";
++	    offset = pc - (uintptr_t)dlinfo.dli_fbase;
++	}
++	ErrorF("%s: %s:%s+0x%lx\n", header, dlinfo.dli_fname,
++	       symname, offset);
++
++    } else {
++	/* Couldn't find symbol info from system dynamic loader, should
++	 * probably poke elfloader here, but haven't written that code yet,
++	 * so we just print the pc.
++	 */
++	ErrorF("%s\n", header);
++    }
++
++    return 0;
++}
++# endif /* HAVE_WALKCONTEXT */
++
++# ifdef HAVE_PSTACK
++static int xorg_backtrace_pstack(void) {
++    pid_t kidpid;
++    int pipefd[2];
++
++    if (pipe(pipefd) != 0) {
++	return -1;
++    }
++
++    kidpid = fork1();
++
++    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);
++	closefrom(STDERR_FILENO);
++
++	snprintf(parent, sizeof(parent), "%d", getppid());
++	execle("/usr/bin/pstack", "pstack", parent, 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;
++		ErrorF("%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;
++}
++# endif /* HAVE_PSTACK */
++
++
++# if defined(HAVE_PSTACK) || defined(HAVE_WALKCONTEXT)
++
++void xorg_backtrace(void) {
++
++    ErrorF("\nBacktrace:\n");
++
++#  ifdef HAVE_PSTACK
++/* First try fork/exec of pstack - otherwise fall back to walkcontext
++   pstack is preferred since it can print names of non-exported functions */
++
++    if (xorg_backtrace_pstack() < 0)
++#  endif	
++    {
++#  ifdef HAVE_WALKCONTEXT
++	ucontext_t u;
++	int depth = 1;
++	
++	if (getcontext(&u) == 0)
++	    walkcontext(&u, xorg_backtrace_frame, &depth);
++	else
++#  endif
++	    Error("Failed to get backtrace info");
++    }
++    ErrorF("\n");	
++}
++
++# else
++
++/* Default fallback if we can't find any way to get a backtrace */
++void xorg_backtrace(void) { return; }
++
++# endif
++#endif
+-- 
+1.6.0.1
+
 From ad677238bc96a8578113bbe76d605d7a87aca44c Mon Sep 17 00:00:00 2001
 From: Adam Jackson <ajax at redhat.com>
 Date: Tue, 14 Oct 2008 13:00:50 -0400
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/xorg-xserver-server-backtrace.patch?r1=1.1&r2=1.2&f=u



More information about the pld-cvs-commit mailing list