[Mesa-dev] [PATCH 2/4] util: add debug_memory_check_block(), debug_memory_tag()
Jose Fonseca
jfonseca at vmware.com
Thu Apr 4 07:40:21 PDT 2013
----- Original Message -----
> The former just checks that the given block is valid by checking
> the header and footer.
>
> The later sets the memory block's tag. With extra debug code, we
> can use that for monitoring/checking particular allocations.
> ---
> src/gallium/auxiliary/os/os_memory_debug.h | 6 +++
> src/gallium/auxiliary/util/u_debug_memory.c | 55
> +++++++++++++++++++++++++++
> 2 files changed, 61 insertions(+), 0 deletions(-)
>
> diff --git a/src/gallium/auxiliary/os/os_memory_debug.h
> b/src/gallium/auxiliary/os/os_memory_debug.h
> index 36b8fc6..9a487de 100644
> --- a/src/gallium/auxiliary/os/os_memory_debug.h
> +++ b/src/gallium/auxiliary/os/os_memory_debug.h
> @@ -60,6 +60,12 @@ void *
> debug_realloc(const char *file, unsigned line, const char *function,
> void *old_ptr, size_t old_size, size_t new_size );
>
> +void
> +debug_memory_tag(void *ptr, unsigned tag);
> +
> +void
> +debug_memory_check_block(void *ptr);
> +
> void
> debug_memory_check(void);
>
> diff --git a/src/gallium/auxiliary/util/u_debug_memory.c
> b/src/gallium/auxiliary/util/u_debug_memory.c
> index 4bf26a5..4723547 100644
> --- a/src/gallium/auxiliary/util/u_debug_memory.c
> +++ b/src/gallium/auxiliary/util/u_debug_memory.c
> @@ -76,6 +76,7 @@ struct debug_memory_header
> #endif
>
> unsigned magic;
> + unsigned tag;
Long term, I think a "const char * tag" would be handier -- it could be used in the debug messages.
> };
>
> struct debug_memory_footer
> @@ -140,6 +141,7 @@ debug_malloc(const char *file, unsigned line, const char
> *function,
> hdr->function = function;
> hdr->size = size;
> hdr->magic = DEBUG_MEMORY_MAGIC;
> + hdr->tag = 0;
> #if DEBUG_FREED_MEMORY
> hdr->freed = FALSE;
> #endif
> @@ -263,6 +265,7 @@ debug_realloc(const char *file, unsigned line, const char
> *function,
> new_hdr->function = old_hdr->function;
> new_hdr->size = new_size;
> new_hdr->magic = DEBUG_MEMORY_MAGIC;
> + new_hdr->tag = 0;
> #if DEBUG_FREED_MEMORY
> new_hdr->freed = FALSE;
> #endif
> @@ -348,6 +351,58 @@ debug_memory_end(unsigned long start_no)
>
>
> /**
> + * Put a tag (arbitrary integer) on a memory block.
> + * Can be useful for debugging.
> + */
> +void
> +debug_memory_tag(void *ptr, unsigned tag)
> +{
> + struct debug_memory_header *hdr;
> +
> + if (!ptr)
> + return;
> +
> + hdr = header_from_data(ptr);
> + if (hdr->magic != DEBUG_MEMORY_MAGIC) {
> + debug_printf("%s corrupted memory at %p\n", __FUNCTION__, ptr);
> + debug_assert(0);
> + }
> +
> + hdr->tag = tag;
> +}
> +
> +
> +/**
> + * Check the given block of memory for validity/corruption.
> + */
> +void
> +debug_memory_check_block(void *ptr)
> +{
> + struct debug_memory_header *hdr;
> + struct debug_memory_footer *ftr;
> +
> + if (!ptr)
> + return;
> +
> + hdr = header_from_data(ptr);
> + ftr = footer_from_header(hdr);
> +
> + if (hdr->magic != DEBUG_MEMORY_MAGIC) {
> + debug_printf("%s:%u:%s: bad or corrupted memory %p\n",
> + hdr->file, hdr->line, hdr->function, ptr);
> + debug_assert(0);
> + }
> +
> + if (ftr->magic != DEBUG_MEMORY_MAGIC) {
> + debug_printf("%s:%u:%s: buffer overflow %p\n",
> + hdr->file, hdr->line, hdr->function, ptr);
> + debug_assert(0);
> + }
> +}
> +
> +
> +
> +/**
> * We can periodically call this from elsewhere to do a basic sanity
> * check of the heap memory we've allocated.
> */
>
Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
More information about the mesa-dev
mailing list