Gtest-init.cxx revision 587bba5c1f8491f852ef531d6266bec490a45f15
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> 34a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 35587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidmint verbose, errors; 36a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 37a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm#define panic(args...) \ 38a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm { ++errors; fprintf (stderr, args); return; } 39a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 40a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmclass Test_Class { 41a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm public: 42a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm Test_Class (void); 43a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm}; 44a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 45a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic Test_Class t; 46a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 47a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void 48a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmbacktrace (void) 49a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 50a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm char name[128], off[32]; 51a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_word_t ip, offset; 52a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_cursor_t cursor; 53a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_context_t uc; 54a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm int ret, count = 0; 55a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 56a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_getcontext (&uc); 57a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_init_local (&cursor, &uc); 58a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 59a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm do 60a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm { 61a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm unw_get_reg (&cursor, UNW_REG_IP, &ip); 62a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm name[0] = '\0'; 63a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm off[0] = '\0'; 64a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (unw_get_proc_name (&cursor, name, sizeof (name), &offset) == 0 65a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm && off > 0) 66a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm snprintf (off, sizeof (off), "+0x%lx", (long) offset); 67587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm if (verbose) 68587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm printf (" [%lx] <%s%s>\n", (long) ip, name, off); 69a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (++count > 32) 70a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm panic ("FAILURE: didn't reach beginning of unwind-chain\n"); 71a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm } 72a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm while ((ret = unw_step (&cursor)) > 0); 73a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 74a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (ret < 0) 75a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm panic ("FAILURE: unw_step() returned %d\n", ret); 76a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 77a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 78a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void 79a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmb (void) 80a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 81a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm backtrace(); 82a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 83a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 84a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmstatic void 85a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidma (void) 86a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 87587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm if (verbose) 88587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm printf ("backtrace() from atexit()-handler:\n"); 89a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm b(); 90a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm if (errors) 91a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm abort (); /* cannot portably call exit() from an atexit() handler */ 92a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 93a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 94a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmTest_Class::Test_Class (void) 95a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 96587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm if (verbose) 97587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm printf ("backtrace() from constructor:\n"); 98a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm b(); 99a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 100a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm 101a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmint 102a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidmmain (int argc, char **argv) 103a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm{ 104587bba5c1f8491f852ef531d6266bec490a45f15hp.com!davidm verbose = argc > 1; 105a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm return atexit (a); 106a4ab1098ea2b47aef9c6b684580849db18fec874mostang.com!davidm} 107