linux: hand-roll a backtrace printer instead of using backtrace_symbols
Why? Because backtrace_symbols calls malloc, which you can't do from a signal handler. Face? Palm.
This commit is contained in:
		
							parent
							
								
									75b9383d8a
								
							
						
					
					
						commit
						eb031d4013
					
				| 
						 | 
					@ -29,19 +29,28 @@
 | 
				
			||||||
#include "misc.h"
 | 
					#include "misc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_BACKTRACE
 | 
					#ifdef HAVE_BACKTRACE
 | 
				
			||||||
 | 
					#define _GNU_SOURCE
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
#include <execinfo.h>
 | 
					#include <execinfo.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void xorg_backtrace(void)
 | 
					void xorg_backtrace(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    void *array[32]; /* deeper nesting than this means something's wrong */
 | 
					    void *array[64];
 | 
				
			||||||
 | 
					    char *mod;
 | 
				
			||||||
    int size, i;
 | 
					    int size, i;
 | 
				
			||||||
    char **strings;
 | 
					    Dl_info info;
 | 
				
			||||||
    ErrorF("\nBacktrace:\n");
 | 
					    ErrorF("\nBacktrace:\n");
 | 
				
			||||||
    size = backtrace(array, 32);
 | 
					    size = backtrace(array, 64);
 | 
				
			||||||
    strings = backtrace_symbols(array, size);
 | 
					    for (i = 0; i < size; i++) {
 | 
				
			||||||
    for (i = 0; i < size; i++)
 | 
						dladdr(array[i], &info);
 | 
				
			||||||
        ErrorF("%d: %s\n", i, strings[i]);
 | 
						mod = (info.dli_fname && *info.dli_fname) ? info.dli_fname : "(vdso)";
 | 
				
			||||||
    free(strings);
 | 
						if (info.dli_saddr)
 | 
				
			||||||
 | 
						    ErrorF("%d: %s (%s+0x%lx) [%p]\n", i, mod,
 | 
				
			||||||
 | 
							   info.dli_sname, array[i] - info.dli_saddr, array[i]);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						    ErrorF("%d: %s (%p+0x%lx) [%p]\n", i, mod,
 | 
				
			||||||
 | 
							   info.dli_fbase, array[i] - info.dli_fbase, array[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else /* not glibc or glibc < 2.1 */
 | 
					#else /* not glibc or glibc < 2.1 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue