--- src/lib/libast/vmalloc/malloc.c +++ src/lib/libast/vmalloc/malloc.c 2009-08-06 10:27:36.465902620 +0000 @@ -131,13 +131,23 @@ typedef struct ______mstats Mstats_t; #undef valloc #endif +#define DEBUG_LEAK 1 +#if defined(DEBUG_LEAK) && (DEBUG_LEAK > 0) +Void_t* _global_alloc; +Void_t* _global_free; +#endif + #if _WINIX #include #if _UWIN +#if defined(DEBUG_LEAK) && (DEBUG_LEAK > 0) +#define VMRECORD(p) (_global_alloc = _vmrecord(p)) +#else #define VMRECORD(p) _vmrecord(p) +#endif #define VMBLOCK { int _vmblock = _sigblock(); #define VMUNBLOCK _sigunblock(_vmblock); } @@ -173,7 +183,11 @@ lcl_getenv(const char* s) #endif /* _WINIX */ #ifndef VMRECORD +#if defined(DEBUG_LEAK) && (DEBUG_LEAK > 0) +#define VMRECORD(p) (_global_alloc = (p)) +#else #define VMRECORD(p) (p) +#endif #define VMBLOCK #define VMUNBLOCK #endif @@ -496,6 +510,9 @@ extern void free(data) reg Void_t* data; #endif { +#if defined(DEBUG_LEAK) && (DEBUG_LEAK > 0) + _global_free = data; +#endif #if USE_NATIVE #undef free #if __STD_C --- debug +++ debug 2009-08-06 11:13:00.514401978 +0000 @@ -0,0 +1,33 @@ +#!/bin/sh +tmp=$(mktemp gdbrc.XXXXXX) || exit 1 +log=$(mktemp gdblg.XXXXXX) || exit 1 +trap "rm -f $tmp $log" EXIT SIGINT +(cat > $tmp)<<--- + set logging file $log + set logging overwrite on + set logging redirect on + set logging on + watch _global_alloc + commands + silent + printf "\n alloc = %p\n ======================\n", _global_alloc + if sh.subshell >= 1 + bt 12 + end + cont + end + watch _global_free + commands + silent + printf "\n free = %p\n ======================\n", _global_free + cont + end + run + quit +-- +env -i gdb -batch-silent -x $tmp --args ./arch/*/src/cmd/ksh93/ksh $1 +grep -E '^[[:blank:]]+alloc[[:blank:]]+=[[:blank:]]+0x' $log | \ + while read alloc sign val; do + grep -qE "^[[:blank:]]+free[[:blank:]]+=[[:blank:]]+$val" $log && continue + sed -rn "/^[[:blank:]]+alloc[[:blank:]]+=[[:blank:]]+$val/,/^$/p" $log + done