@@ -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