<div dir="ltr"><div>Hi,</div><div><br></div><div>I've been investigating an interesting but reproducible crash deep in the heap allocator, any help much appreciated.</div><div><br></div><div><br></div><div>This is the callstack..</div><div><br></div><div><div>_Heap_Is_prev_used() at heapimpl.h:510 0x700ebb8e<span style="white-space:pre"> </span></div></div><div><div>_Heap_Is_used() at heapimpl.h:517 0x700ebb8a<span style="white-space:pre">   </span></div></div><div>_Heap_Block_split() at heap.c:336 0x700ebb7c<span style="white-space:pre">      </span></div><div>_Heap_Block_allocate_from_begin() at heap.c:371 0x700ebbf0<span style="white-space:pre">    </span></div><div>_Heap_Block_allocate() at heap.c:461 0x700ebdb6<span style="white-space:pre">       </span></div><div>_Heap_Allocate_aligned_with_boundary() at heapallocate.c:262 0x700ebf0e<span style="white-space:pre">       </span></div><div>_Heap_Allocate() at heapimpl.h:137 0x700ea4a4<span style="white-space:pre"> </span></div><div>_Region_Allocate_segment() at regionimpl.h:108 0x700ea4a4<span style="white-space:pre">     </span></div><div>rtems_region_get_segment() at regiongetsegment.c:79 0x700ea4a4<span style="white-space:pre">        </span></div><div><br></div><div><br></div><div><div>RTEMS_INLINE_ROUTINE bool _Heap_Is_used(</div><div>  const Heap_Block *block</div><div>)</div><div>{</div><div>  const Heap_Block *const next_block =</div><div>    _Heap_Block_at( block, _Heap_Block_size( block ) );</div><div><br></div><div>  return _Heap_Is_prev_used( next_block );</div><div>}</div></div><div><br></div><div>so this is the routine above the crash,. in the debugger i can see that '<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">block' is at a valid address, but 'next_block' is "optimized out" and gdb wont show it (rtems is already re-compiled with -0g)</span></div><div><br></div><div><br></div><div><div>RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )</div><div>{</div><div>  return block->size_and_flag & HEAP_PREV_BLOCK_USED;</div><div>}</div></div><div><br></div><div>i presume that in this crashing routine, block must be invalid.</div><div><br></div><div>There is still 3.4mb left on the heap at this point (from the stats pointer information), its not like this is an early startup crash, from the Heap_Statistics;</div><div><br></div><div>lifetime_allocated 788736</div><div>lifetime_freed 40704</div><div>size 4194048</div><div>free_size 3445504</div><div>min_free_size 3445504</div><div>free_blocks 3</div><div>max_free_blocks 5</div><div>used_blocks 128</div><div>max_search 4</div><div>searches 289</div><div>allocs 267</div><div>failed_allocs 0</div><div>frees 130</div><div>resizes 0</div><div><br></div><div><br></div>-- <br><div class="gmail_signature"><div><br>regards</div><div>---</div><div>Matthew J Fletcher</div><br></div>
</div>