Skip to content

Commit 8ba8608

Browse files
authored
Merge pull request #4391 from cliff-cmc/dev
Add memtrace command for memheap.c
2 parents 4a40ba9 + eea0c3d commit 8ba8608

File tree

2 files changed

+105
-1
lines changed

2 files changed

+105
-1
lines changed

include/rtdef.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,9 @@ struct rt_memheap_item
802802

803803
struct rt_memheap_item *next_free; /**< next free memheap item */
804804
struct rt_memheap_item *prev_free; /**< prev free memheap item */
805+
#ifdef RT_USING_MEMTRACE
806+
rt_uint8_t owner_thread_name[4]; /**< owner thread name */
807+
#endif
805808
};
806809

807810
/**

src/memheap.c

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ rt_err_t rt_memheap_init(struct rt_memheap *memheap,
8585
item->next_free = item;
8686
item->prev_free = item;
8787

88+
#ifdef RT_USING_MEMTRACE
89+
rt_memset(item->owner_thread_name, ' ', sizeof(item->owner_thread_name));
90+
#endif
91+
8892
item->next = (struct rt_memheap_item *)
8993
((rt_uint8_t *)item + memheap->available_size + RT_MEMHEAP_SIZE);
9094
item->prev = item->next;
@@ -206,6 +210,10 @@ void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size)
206210
/* put the pool pointer into the new block. */
207211
new_ptr->pool_ptr = heap;
208212

213+
#ifdef RT_USING_MEMTRACE
214+
rt_memset(new_ptr->owner_thread_name, ' ', sizeof(new_ptr->owner_thread_name));
215+
#endif
216+
209217
/* break down the block list */
210218
new_ptr->prev = header_ptr;
211219
new_ptr->next = header_ptr->next;
@@ -257,6 +265,13 @@ void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size)
257265
/* Mark the allocated block as not available. */
258266
header_ptr->magic |= RT_MEMHEAP_USED;
259267

268+
#ifdef RT_USING_MEMTRACE
269+
if (rt_thread_self())
270+
rt_memcpy(header_ptr->owner_thread_name, rt_thread_self()->name, sizeof(header_ptr->owner_thread_name));
271+
else
272+
rt_memcpy(header_ptr->owner_thread_name, "NONE", sizeof(header_ptr->owner_thread_name));
273+
#endif
274+
260275
/* release lock */
261276
rt_sem_release(&(heap->lock));
262277

@@ -381,6 +396,10 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
381396
/* put the pool pointer into the new block. */
382397
next_ptr->pool_ptr = heap;
383398

399+
#ifdef RT_USING_MEMTRACE
400+
rt_memset(next_ptr->owner_thread_name, ' ', sizeof(next_ptr->owner_thread_name));
401+
#endif
402+
384403
next_ptr->prev = header_ptr;
385404
next_ptr->next = header_ptr->next;
386405
header_ptr->next->prev = next_ptr;
@@ -445,6 +464,10 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
445464
/* put the pool pointer into the new block. */
446465
new_ptr->pool_ptr = heap;
447466

467+
#ifdef RT_USING_MEMTRACE
468+
rt_memset(new_ptr->owner_thread_name, ' ', sizeof(new_ptr->owner_thread_name));
469+
#endif
470+
448471
/* break down the block list */
449472
new_ptr->prev = header_ptr;
450473
new_ptr->next = header_ptr->next;
@@ -590,6 +613,10 @@ void rt_memheap_free(void *ptr)
590613
header_ptr->next_free, header_ptr->prev_free));
591614
}
592615

616+
#ifdef RT_USING_MEMTRACE
617+
rt_memset(header_ptr->owner_thread_name, ' ', sizeof(header_ptr->owner_thread_name));
618+
#endif
619+
593620
/* release lock */
594621
rt_sem_release(&(heap->lock));
595622
}
@@ -728,4 +755,78 @@ void rt_memory_info(rt_uint32_t *total,
728755

729756
#endif
730757

731-
#endif
758+
#ifdef RT_USING_MEMTRACE
759+
760+
void dump_used_memheap(struct rt_memheap *mh)
761+
{
762+
struct rt_memheap_item *header_ptr;
763+
rt_uint32_t block_size;
764+
765+
766+
rt_kprintf("\nmemory heap address:\n");
767+
rt_kprintf("heap_ptr: 0x%08x\n", mh->start_addr);
768+
rt_kprintf("free : 0x%08x\n", mh->available_size);
769+
rt_kprintf("max_used: 0x%08x\n", mh->max_used_size);
770+
rt_kprintf("size : 0x%08x\n", mh->pool_size);
771+
772+
rt_kprintf("\n--memory used information --\n");
773+
774+
header_ptr = mh->block_list;
775+
while (header_ptr->next != mh->block_list)
776+
{
777+
if ((header_ptr->magic & RT_MEMHEAP_MASK) != RT_MEMHEAP_MAGIC)
778+
{
779+
rt_kprintf("[0x%08x - incorrect magic: 0x%08x\n", header_ptr, header_ptr->magic);
780+
break;
781+
}
782+
783+
/* get current memory block size */
784+
block_size = MEMITEM_SIZE(header_ptr);
785+
if (block_size < 0)
786+
break;
787+
788+
if (RT_MEMHEAP_IS_USED(header_ptr))
789+
{
790+
/* dump information */
791+
rt_kprintf("[0x%08x - %d - %c%c%c%c] used\n", header_ptr, block_size,
792+
header_ptr->owner_thread_name[0], header_ptr->owner_thread_name[1],
793+
header_ptr->owner_thread_name[2], header_ptr->owner_thread_name[3]);
794+
}
795+
else
796+
{
797+
/* dump information */
798+
rt_kprintf("[0x%08x - %d - %c%c%c%c] free\n", header_ptr, block_size,
799+
header_ptr->owner_thread_name[0], header_ptr->owner_thread_name[1],
800+
header_ptr->owner_thread_name[2], header_ptr->owner_thread_name[3]);
801+
}
802+
803+
/* move to next used memory block */
804+
header_ptr = header_ptr->next;
805+
}
806+
}
807+
808+
void memtrace_heap()
809+
{
810+
struct rt_object_information *info;
811+
struct rt_list_node *list;
812+
struct rt_memheap *mh;
813+
struct rt_list_node *node;
814+
815+
info = rt_object_get_information(RT_Object_Class_MemHeap);
816+
list = &info->object_list;
817+
818+
for (node = list->next; node != list; node = node->next)
819+
{
820+
mh = (struct rt_memheap *)rt_list_entry(node, struct rt_object, list);
821+
dump_used_memheap(mh);
822+
}
823+
}
824+
825+
#ifdef RT_USING_FINSH
826+
#include <finsh.h>
827+
MSH_CMD_EXPORT(memtrace_heap, dump memory trace for heap);
828+
#endif /* end of RT_USING_FINSH */
829+
830+
#endif /* end of RT_USING_MEMTRACE */
831+
832+
#endif /* end of RT_USING_MEMHEAP */

0 commit comments

Comments
 (0)