1a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm/* libunwind - a platform-independent unwind library 2a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm Copyright (C) 2002-2003 Hewlett-Packard Co 3a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 5a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmThis file is part of libunwind. 6a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 7a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining 8a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidma copy of this software and associated documentation files (the 9a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm"Software"), to deal in the Software without restriction, including 10a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish, 11a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to 12a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to 13a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmthe following conditions: 14a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 15a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmThe above copyright notice and this permission notice shall be 16a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmincluded in all copies or substantial portions of the Software. 17a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 18a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 25a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 26a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm/* This file tests unwinding from a constructor from within an 27a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm atexit() handler. */ 28a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 29a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <stdio.h> 30a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <stdlib.h> 31a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <unistd.h> 32a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 33a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#include <libunwind.h> 346b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantala#include "compiler.h" 35a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 36587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidmint verbose, errors; 37a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 38a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#define panic(args...) \ 39a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm { ++errors; fprintf (stderr, args); return; } 40a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 41a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmclass Test_Class { 42a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm public: 43a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm Test_Class (void); 44a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}; 45a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 46a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic Test_Class t; 47a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 48a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void 496470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantalado_backtrace (void) 50a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 51a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm char name[128], off[32]; 52a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_word_t ip, offset; 53a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_cursor_t cursor; 54a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_context_t uc; 55a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm int ret, count = 0; 56a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 57a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_getcontext (&uc); 58a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_init_local (&cursor, &uc); 59a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 60a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm do 61a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm { 62a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_get_reg (&cursor, UNW_REG_IP, &ip); 63a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm name[0] = '\0'; 64a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm off[0] = '\0'; 65a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (unw_get_proc_name (&cursor, name, sizeof (name), &offset) == 0 66ffbe29940e04461ad4916cd60fccf695e397bf45Tommi Rantala && offset > 0) 67a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm snprintf (off, sizeof (off), "+0x%lx", (long) offset); 68587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm if (verbose) 69587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm printf (" [%lx] <%s%s>\n", (long) ip, name, off); 70a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (++count > 32) 71a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm panic ("FAILURE: didn't reach beginning of unwind-chain\n"); 72a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm } 73a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm while ((ret = unw_step (&cursor)) > 0); 74a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 75a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (ret < 0) 76a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm panic ("FAILURE: unw_step() returned %d\n", ret); 77a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 78a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 79a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void 80a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmb (void) 81a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 826470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantala do_backtrace(); 83a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 84a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 85a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void 86a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidma (void) 87a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 88587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm if (verbose) 896470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantala printf ("do_backtrace() from atexit()-handler:\n"); 90a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm b(); 91a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (errors) 92a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm abort (); /* cannot portably call exit() from an atexit() handler */ 93a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 94a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 95a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmTest_Class::Test_Class (void) 96a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 97587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm if (verbose) 986470a67461bfea2334404368e295ad09ad9b21f4Tommi Rantala printf ("do_backtrace() from constructor:\n"); 99a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm b(); 100a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 101a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 102a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmint 1036b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantalamain (int argc, char **argv UNUSED) 104a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 105587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm verbose = argc > 1; 106a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm return atexit (a); 107a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 108