123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- * heap_show.c
- */
- #include <stdio.h>
- #include "cache.h"
- /*--------------------------------------------------------- */
- static void
- process_free_block(void *block, unsigned index, size_t size, void *arg)
- {
- /* dump the details for this block */
- printf(" %8p[%" SIZE_FMT "]", block, size);
- }
- /*--------------------------------------------------------- */
- static void
- process_segment(void *segment, unsigned index, size_t size, void *arg)
- {
- /* dump the details for this segment */
- printf(" %8p[%" SIZE_FMT "]", segment, size);
- }
- /*--------------------------------------------------------- */
- void lub_heap_show(lub_heap_t * this, bool_t verbose)
- {
- static char *state_names[] = { "DISABLED", "ENABLED" };
- lub_heap_stats_t stats;
- if (BOOL_FALSE == lub_heap_check_memory(this)) {
- printf("*** HEAP CORRUPTED!!! ***\n");
- }
- if (BOOL_TRUE == verbose) {
- printf("HEAP:\n" " %8p\n", (void *)this);
- printf("\nHEAP SEGMENTS:\n");
- lub_heap_foreach_segment(this, process_segment, NULL);
- printf("\n");
- if (this->cache) {
- printf("\nCACHE:\n");
- lub_heap_cache_show(this->cache);
- }
- /* dump each free block's details */
- printf("\nFREE BLOCKS:\n");
- lub_heap_foreach_free_block(this, process_free_block, NULL);
- printf("\n");
- printf("\nSUMMARY:\n");
- }
- {
- /*lint -esym(644,cache_stats) may not have been initialized */
- lub_heap_stats_t cache_stats;
- /* get the stats */
- lub_heap__get_stats(this, &stats);
- /* dump the statistics for this heap */
- printf
- (" status bytes blocks avg block max block overhead\n");
- printf
- (" ------ ---------- --------- ---------- ---------- ----------\n");
- printf("current\n");
- printf(" free %10" SIZE_FMT " %9" SIZE_FMT " %10" SIZE_FMT
- " %10" SIZE_FMT " %10" SIZE_FMT "\n", stats.free_bytes,
- stats.free_blocks,
- stats.free_blocks ? stats.free_bytes /
- stats.free_blocks : 0, lub_heap__get_max_free(this),
- stats.free_overhead + stats.segs_overhead);
- printf(" alloc %10" SIZE_FMT " %9" SIZE_FMT " %10" SIZE_FMT
- " %10s %10" SIZE_FMT "\n", stats.alloc_bytes,
- stats.alloc_blocks,
- stats.alloc_blocks ? stats.alloc_bytes /
- stats.alloc_blocks : 0, "-", stats.alloc_overhead);
- printf(" static %10" SIZE_FMT " %9" SIZE_FMT " %10" SIZE_FMT
- " %10s %10" SIZE_FMT "\n", stats.static_bytes,
- stats.static_blocks,
- stats.static_blocks ? stats.static_bytes /
- stats.static_blocks : 0, "-", stats.static_overhead);
- if (this->cache) {
- printf(" (cache)\n");
- lub_heap_cache__get_stats(this->cache, &cache_stats);
- printf(" free %10" SIZE_FMT " %9" SIZE_FMT " %10"
- SIZE_FMT " %10" SIZE_FMT " %10" SIZE_FMT "\n",
- cache_stats.free_bytes, cache_stats.free_blocks,
- cache_stats.free_blocks ? cache_stats.
- free_bytes / cache_stats.free_blocks : 0,
- lub_heap_cache__get_max_free(this->cache),
- cache_stats.free_overhead);
- printf(" alloc %10" SIZE_FMT " %9" SIZE_FMT " %10"
- SIZE_FMT " %10s %10" SIZE_FMT "\n",
- cache_stats.alloc_bytes,
- cache_stats.alloc_blocks,
- cache_stats.alloc_blocks ? cache_stats.
- alloc_bytes / cache_stats.alloc_blocks : 0, "-",
- cache_stats.alloc_overhead);
- }
- printf("cumulative\n");
- printf(" alloc %10" SIZE_FMT " %9" SIZE_FMT " %10" SIZE_FMT
- " %10s %10s\n", stats.alloc_total_bytes,
- stats.alloc_total_blocks,
- stats.alloc_total_blocks ? stats.alloc_total_bytes /
- stats.alloc_total_blocks : 0, "-", "-");
- if (this->cache) {
- printf(" (cache)\n");
- printf(" alloc %10" SIZE_FMT " %9" SIZE_FMT " %10"
- SIZE_FMT " %10s %10s\n",
- cache_stats.alloc_total_bytes,
- cache_stats.alloc_total_blocks,
- cache_stats.alloc_total_blocks ? cache_stats.
- alloc_total_bytes /
- cache_stats.alloc_total_blocks : 0, "-", "-");
- }
- printf("high-tide\n");
- printf(" free %10" SIZE_FMT " %9" SIZE_FMT " %10" SIZE_FMT
- " %10s %10" SIZE_FMT "\n", stats.free_hightide_bytes,
- stats.free_hightide_blocks,
- stats.free_hightide_blocks ? stats.free_hightide_bytes /
- stats.free_hightide_blocks : 0, "-",
- stats.free_hightide_overhead);
- printf(" alloc %10" SIZE_FMT " %9" SIZE_FMT " %10" SIZE_FMT
- " %10s %10" SIZE_FMT "\n", stats.alloc_hightide_bytes,
- stats.alloc_hightide_blocks,
- stats.alloc_hightide_blocks ? stats.
- alloc_hightide_bytes / stats.alloc_hightide_blocks : 0,
- "-", stats.alloc_hightide_overhead);
- }
- if (BOOL_TRUE == verbose) {
- printf("\nSYSTEM:\n"
- " tainting(%s), full checking(%s), leak detection(%s),\n"
- " native alignment of %d bytes\n",
- state_names[lub_heap_is_tainting()],
- state_names[lub_heap_is_checking()],
- state_names[lub_heap__get_framecount()? 0 : 1],
- LUB_HEAP_ALIGN_NATIVE);
- }
- printf("\n");
- }
|