119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* More debugging hooks for `malloc'.
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Copyright (C) 1991, 1992 Free Software Foundation, Inc.
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 Written April 2, 1991 by John Gilmore of Cygnus Support.
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 Based on mcheck.c by Mike Haertel.
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectThis library is free software; you can redistribute it and/or
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmodify it under the terms of the GNU Library General Public License as
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectpublished by the Free Software Foundation; either version 2 of the
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectLicense, or (at your option) any later version.
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectThis library is distributed in the hope that it will be useful,
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectbut WITHOUT ANY WARRANTY; without even the implied warranty of
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectLibrary General Public License for more details.
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectYou should have received a copy of the GNU Library General Public
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectLicense along with this library; see the file COPYING.LIB.  If
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnot, write to the Free Software Foundation, Inc., 675 Mass Ave,
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectCambridge, MA 02139, USA.
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   The author may be reached (Email) at the address mike@ai.mit.edu,
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef	_MALLOC_INTERNAL
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define	_MALLOC_INTERNAL
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "./mtrace.h"
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef	__GNU_LIBRARY__
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern char *getenv ();
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic FILE *mallstream;
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char mallenv[]= "MALLOC_TRACE";
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic char mallbuf[BUFSIZ];	/* Buffer for the output.  */
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Address to breakpoint on accesses to... */
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project__ptr_t mallwatch;
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Old hook values.  */
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void (*tr_old_free_hook) __P ((__ptr_t ptr));
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __ptr_t (*tr_old_malloc_hook) __P ((size_t size));
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __ptr_t (*tr_old_realloc_hook) __P ((__ptr_t ptr, size_t size));
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * Added by TYT, 10/10/93 --- so that we can print
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectFILE *malloc_get_mallstream()
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return mallstream;
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* This function is called when the block being alloc'd, realloc'd, or
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   freed has an address matching the variable "mallwatch".  In a debugger,
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   set "mallwatch" to the address of interest, then put a breakpoint on
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   tr_break.  */
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid tr_break __P ((void));
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttr_break ()
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void tr_freehook __P ((__ptr_t));
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttr_freehook (ptr)
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     __ptr_t ptr;
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  fprintf (mallstream, "- %p\n", ptr);	/* Be sure to print it first.  */
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (ptr == mallwatch)
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    tr_break ();
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __free_hook = tr_old_free_hook;
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  free (ptr);
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __free_hook = tr_freehook;
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __ptr_t tr_mallochook __P ((size_t));
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __ptr_t
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttr_mallochook (size)
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     size_t size;
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __ptr_t hdr;
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __malloc_hook = tr_old_malloc_hook;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  hdr = (__ptr_t) malloc (size);
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __malloc_hook = tr_mallochook;
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* We could be printing a NULL here; that's OK.  */
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  fprintf (mallstream, "+ %p %d\n", hdr, size);
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (hdr == mallwatch)
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    tr_break ();
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return hdr;
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __ptr_t tr_reallochook __P ((__ptr_t, size_t));
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic __ptr_t
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttr_reallochook (ptr, size)
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     __ptr_t ptr;
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     size_t size;
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __ptr_t hdr;
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (ptr == mallwatch)
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    tr_break ();
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __free_hook = tr_old_free_hook;
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __malloc_hook = tr_old_malloc_hook;
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __realloc_hook = tr_old_realloc_hook;
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  hdr = (__ptr_t) realloc (ptr, size);
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __free_hook = tr_freehook;
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __malloc_hook = tr_mallochook;
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  __realloc_hook = tr_reallochook;
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (hdr == NULL)
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    /* Failed realloc.  */
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    fprintf (mallstream, "! %p %d\n", ptr, size);
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  else
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    fprintf (mallstream, "< %p\n> %p %d\n", ptr, hdr, size);
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (hdr == mallwatch)
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    tr_break ();
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return hdr;
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* We enable tracing if either the environment variable MALLOC_TRACE
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   is set, or if the variable mallwatch has been patched to an address
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   that the debugging user wants us to stop on.  When patching mallwatch,
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   don't forget to set a breakpoint on tr_break!  */
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmtrace ()
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  char *mallfile;
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  mallfile = getenv (mallenv);
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (mallfile != NULL || mallwatch != NULL)
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w");
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (mallstream != NULL)
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  /* Be sure it doesn't malloc its buffer!  */
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  setbuf (mallstream, mallbuf);
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  fprintf (mallstream, "= Start\n");
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  tr_old_free_hook = __free_hook;
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  __free_hook = tr_freehook;
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  tr_old_malloc_hook = __malloc_hook;
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  __malloc_hook = tr_mallochook;
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  tr_old_realloc_hook = __realloc_hook;
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  __realloc_hook = tr_reallochook;
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
159