Xref: utzoo alt.sources:1842 comp.lang.c:28465 Path: utzoo!utgpu!news-server.csri.toronto.edu!mailrus!uwm.edu!zaphod.mps.ohio-state.edu!brutus.cs.uiuc.edu!apple!tolsoft!geoff From: geoff@tolerant.com (Geoffrey Leach) Newsgroups: alt.sources,comp.lang.c Subject: Some help with malloc pointer problems Message-ID: <1990May4.202515.21824@tolerant.com> Date: 4 May 90 20:25:15 GMT Organization: Tolerant Software Lines: 172 Here's a useful little hack to help you track down that nasty little malloc pointer problem. If it seems over-elaborate, it might help to know that my problem was with an X application. X toolkits malloc like there was no tomorrow. What follows is a shar file. Cut at the line and feed to /bin/sh ------------------------------------------------------------------ #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'README_TRACK' <<'END_OF_FILE' XHere's a useful little hack to help you track down that nasty little Xmalloc pointer problem. If this seems over-elaborate, it might help Xto know that my problem was with an X application. X toolkits Xmalloc like there was no tomorrow. X XYou can use this without source to malloc by doing a little creative Xre-naming, but its easier if you have malloc source. A couple of Xgood debugging mallocs have been posted to the net recently. X XHere's how malloc_track works. X XPatch your malloc, free and realloc routines in the appropriate places Xwith calls to malloc_track. The first argument will be -1, -2, ... Xaccording to how the tags array in track_report is set up. Mine is set Xup with two points for realloc, because of the way the one I was working Xwith was set up. X XYou need a special value (-5 here) for flagging the track value for Xtrack_report. X XOnce you've set up your library routines, you patch your code in appropriate Xplaces with calls to malloc_track. The first argument is a non-negative Xinteger that marks where you're tracking, the second is the value that gets Xput in the report. To just report position, use 0. X XNow you're ready to go. At an appropriate point in your program's execution, Xset malloc_track_enable to 1. This opens the file in your cwd and starts Xthe writing of integer pairs. When you know what the pointer Xaddress that is causing you problems is, assign this value to Xmalloc_track_target. Malloc track will report to you every time it sees Xthis address and also provides you with a convenient place to set a breakpoint. X XIn order to see what happens, you run track_report. As arguments, you Xuse tags for the places where you put calls to malloc_track in your own Xcode. The result is a little report with all of the tracked activity. XWhen the address you specified in malloc_track_target appears, its Xspecially marked. X XHope this helps. Happy debugging. X XGeoffrey Leach XTolerant Software Xgeoff@tolerant.com or ... {pyramid | apply | amhdal}!tolsoft!geoff END_OF_FILE if test 2013 -ne `wc -c <'README_TRACK'`; then echo shar: \"'README_TRACK'\" unpacked with wrong size! fi # end of 'README_TRACK' fi if test -f 'malloc_track.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'malloc_track.c'\" else echo shar: Extracting \"'malloc_track.c'\" \(747 characters\) sed "s/^X//" >'malloc_track.c' <<'END_OF_FILE' X#include X Xstatic int trackFD; Xstatic int malloc_track_target_noticed; Xint malloc_track_enable; Xchar *malloc_track_target =(char *) -1; Xstatic int track_target_init = -5; X Xvoid Xmalloc_track(n, v) X int n; X char *v; X{ X if (!malloc_track_enable) X return; X X if (trackFD == 0) X trackFD = open("malloc_track", O_RDWR | O_CREAT, 0644); X if (!malloc_track_target_noticed && (malloc_track_target != (char *) -1)){ X malloc_track_target_noticed = 1; X write(trackFD, &track_target_init, sizeof(int)); X write(trackFD, &malloc_track_target, sizeof(char *)); X } X write(trackFD, &n, sizeof(int)); X write(trackFD, &v, sizeof(char *)); X if (v == malloc_track_target) X write(2, "track target event\n", 19); /* set breakpoint here */ X} END_OF_FILE if test 747 -ne `wc -c <'malloc_track.c'`; then echo shar: \"'malloc_track.c'\" unpacked with wrong size! fi # end of 'malloc_track.c' fi if test -f 'track_report.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'track_report.c'\" else echo shar: Extracting \"'track_report.c'\" \(864 characters\) sed "s/^X//" >'track_report.c' <<'END_OF_FILE' X#include X#include X Xchar *tags[] = {"", "malloc", "free", "realloc request", "realloc result", X "target"}; X Xmain(argc, argv) X int argc; X char *argv[]; X{ X int fd; X int n; X char *target; X char *a; X char *l; X char *tag; X char buf[30]; X X fd = open("malloc_track", O_RDONLY); X while (read(fd, &n, sizeof(int))) { X read(fd, &a, sizeof(char *)); X if (n < 0) { X if (n == -5) { X target = a; X continue; X } X if (a == target) X printf("0x%x - %-8s\t<----\n", a, tags[-n]); X else X printf("0x%x - %s\n", a, tags[-n]); X } X else { X if ((n+1) < argc) X tag = argv[n+1]; X else { X sprintf(buf, "watchpoint %d", n); X tag = buf; X } X if (a > 0) { X if (a == target) X printf("0x%x - %-8s\t<----\n", a, tag); X else X printf("0x%x - %s\n", a, tag); X } X else X printf("\t - %s\n", tag); X } X } X} END_OF_FILE if test 864 -ne `wc -c <'track_report.c'`; then echo shar: \"'track_report.c'\" unpacked with wrong size! fi # end of 'track_report.c' fi echo shar: End of shell archive. exit 0