195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm/* libunwind - a platform-independent unwind library 295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm Copyright (C) 2004 Hewlett-Packard Co 395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmThis file is part of libunwind. 695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmCopyright (c) 2002 Hewlett-Packard Co. 895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining 1095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidma copy of this software and associated documentation files (the 1195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm"Software"), to deal in the Software without restriction, including 1295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish, 1395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to 1495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to 1595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmthe following conditions: 1695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 1795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmThe above copyright notice and this permission notice shall be 1895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmincluded in all copies or substantial portions of the Software. 1995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 2095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 2495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 2595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 2695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 2795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 2895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm/* This test simply verifies that unw_init_remote() can be used in 2995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm lieu of unw_init_local(). This was broken for a while on ia64. */ 3095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 3195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#ifdef HAVE_CONFIG_H 3295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm# include "config.h" 3395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#endif 3495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 356b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantala#include "compiler.h" 366b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantala 3795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <stdio.h> 3895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <stdlib.h> 3995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <string.h> 4095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#include <libunwind.h> 4195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 4295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm#define panic(args...) \ 4395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm { fprintf (stderr, args); exit (-1); } 4495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 4595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmint verbose; 4695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 4795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmstatic int 4895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmdo_backtrace (void) 4995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm{ 5095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm char buf[512], name[256]; 5195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_word_t ip, sp, off; 5295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_cursor_t cursor; 5395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_context_t uc; 5495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm int ret; 5595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 5695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_getcontext (&uc); 5795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm if (unw_init_remote (&cursor, unw_local_addr_space, &uc) < 0) 5895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm panic ("unw_init_remote failed!\n"); 5995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 6095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm do 6195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm { 6295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_get_reg (&cursor, UNW_REG_IP, &ip); 6395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_get_reg (&cursor, UNW_REG_SP, &sp); 6495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm buf[0] = '\0'; 6595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm if (unw_get_proc_name (&cursor, name, sizeof (name), &off) == 0) 6695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm { 6795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm if (off) 6895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm snprintf (buf, sizeof (buf), "<%s+0x%lx>", name, (long) off); 6995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm else 7095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm snprintf (buf, sizeof (buf), "<%s>", name); 7195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm } 7295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm if (verbose) 7395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm printf ("%016lx %-32s (sp=%016lx)\n", (long) ip, buf, (long) sp); 7495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 7595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm ret = unw_step (&cursor); 7695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm if (ret < 0) 7795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm { 7895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm unw_get_reg (&cursor, UNW_REG_IP, &ip); 7995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm printf ("FAILURE: unw_step() returned %d for ip=%lx\n", 8095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm ret, (long) ip); 8195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm return -1; 8295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm } 8395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm } 8495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm while (ret > 0); 8595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 8695dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm return 0; 8795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm} 8895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 8995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmstatic int 9095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmfoo (void) 9195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm{ 9295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm return do_backtrace (); 9395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm} 9495dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 9595dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidmint 966b55e0ab51eee7dbea679fda2b37ecf61f0025e5Tommi Rantalamain (int argc, char **argv UNUSED) 9795dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm{ 9895dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm verbose = (argc > 1); 9995dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm 10095dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm if (verbose) 10195dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm printf ("Normal backtrace:\n"); 10295dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm return foo (); 10395dea64712c5b1013ba07a14c8ae2fa453e13a82homeip.net!davidm} 104