diff options
author | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 17:43:39 +0200 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 17:43:39 +0200 |
commit | f4092abdf94af6a99aff944d6264bc1284e8bdd4 (patch) | |
tree | 2ac1c9cc16ceb93edb2c4382c088dac5aeafdf0f /nx-X11/util/memleak/getreti386.c | |
parent | a840692edc9c6d19cd7c057f68e39c7d95eb767d (diff) | |
download | nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.gz nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.bz2 nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.zip |
Imported nx-X11-3.1.0-1.tar.gznx-X11/3.1.0-1
Summary: Imported nx-X11-3.1.0-1.tar.gz
Keywords:
Imported nx-X11-3.1.0-1.tar.gz
into Git repository
Diffstat (limited to 'nx-X11/util/memleak/getreti386.c')
-rw-r--r-- | nx-X11/util/memleak/getreti386.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/nx-X11/util/memleak/getreti386.c b/nx-X11/util/memleak/getreti386.c new file mode 100644 index 000000000..80038b7cc --- /dev/null +++ b/nx-X11/util/memleak/getreti386.c @@ -0,0 +1,54 @@ +/* + * some bits copied from mprof by Ben Zorn + * + * Copyright (c) 1995 Jeffrey Hsu + */ + +/* $XFree86: xc/util/memleak/getreti386.c,v 3.2 1996/10/16 14:46:28 dawes Exp $ */ + +#define get_current_fp(first_local) ((unsigned)&(first_local) + 4) +#define prev_fp_from_fp(fp) *((unsigned *) fp) +#define ret_addr_from_fp(fp) *((unsigned *) (fp+4)) + +#ifdef __FreeBSD__ +#define CRT0_ADDRESS 0x10d3 +#endif +#if defined(__NetBSD__) || defined(__OpenBSD__) +#define CRT0_ADDRESS 0x109a +#endif +#ifdef linux +#define CRT0_ADDRESS 0x80482fc +#endif + +static unsigned long +junk (int *foo) +{ + return (unsigned long) foo + 4; +} + +void +getStackTrace(unsigned long *results, int max) +{ + + int first_local; + unsigned long fp, ret_addr; + + first_local = 0; + fp = junk(&first_local); + fp = get_current_fp(first_local); + ret_addr = ret_addr_from_fp(fp); + + while (ret_addr > CRT0_ADDRESS && max-- > 1) { + *results++ = ret_addr; + if (fp < (unsigned long) &first_local) + break; + fp = prev_fp_from_fp(fp); + if (!fp) + break; + if (fp < (unsigned long) &first_local) + break; + ret_addr = ret_addr_from_fp(fp); + } + *results++ = 0; + +} |