rtems_region_create, and starting_memory address.
Chris Johns
chrisj at rtems.org
Thu Feb 5 02:29:58 UTC 2009
Nick Thomas wrote:
> This is getting more frustrating by the minute.
>
> Whatever I do, it just makes it worse.
>
> Now, I seem to have an infinite loop in _Heap_Allocate.
> It looks like it is calling _Workspace_Allocate, with a size of 96.
>
> But, when I break into the code, it is spinning in a for() loop in
> _Heap_Allocate function.
> Probably trying to find a big enough free block.
>
> From gdb 'info locals'
> I see:
> The_size=100
> Search_count = 5293661
> The_block = (Heap_Block *)0x0
> Ptr = (void *) 0x0
> Stats = (Heap_Statistics * const) 0x7dc428
> Tail = (Heap_Block * const) 0x7dc400
>
>
> Now, 0x7dc400 corresponds with my _Workspace_Area from the .num file.
>
> I just don't have a clue to what is going wrong, is it stack, heap,
> something else???
>
> Please help, RTEMS is driving me mad.
>
This type of bug can be frustrating but a couple of deep breaths helps. You
are receiving generic and non-specific answers because we are getting snippets
light in detail of what is happening. For example is this custom hardware and
a custom BSP.
I think we can agree you have a memory corruption bug. That is memory is being
written to that should not be. These bug can be simple or difficult to find so
lets start with the simple reasons.
A common memory corruption bug in a real-time environment like RTEMS is stack
corruption. The stack is set and does not change in size using VM tricks like
you get on Unix type system. Check your code for local variables that are
large. This can be arrays or a structure that contains an array. It could also
be an alloc call. The stack overflow may occur in another task, not the
faulting task or interrupt. The overflowing task could be happily sleeping
unaware of the damage it has left. The context switcher switches tasks or
dispatches an interrupt only to find the task woken is a mess. Check any
recursive functions. These maybe overflowing the stack. If you are happy the
stack based local variable are all small see if you can increase the stack
size of your tasks. If you have the memory make them large. If this stops the
corruption you will know the source but not the location. I then use the stack
check command in the shell to tell me the stack usage and so the task which is
using far more stack than I thought. Often a look or a stepping code in the
task show the problem. The interrupt stack is a little harder. It can be
configured via the rtems_configuration_table. See:
http://www.rtems.org/onlinedocs/releases/rtemsdocs-4.9.1/share/rtems/html/c_user/c_user00411.html
One last comment on stack corruption bugs. Often the back trace command in the
debugger does not work as the stack is corrupted.
Check any dynamic memory allocation calls. Make sure you are handling the
pointers carefully. Also check any pointer addition to make sure you are not
accessing past the end of the allocated data. A common bug is adding what you
think is a number of bytes to a struct pointer. A simple way to check that can
sometimes work if you have the memory is to increase the size of the memory
allocated at the malloc call by a large amount. For example:
p = malloc (sizeof(struct foo) + 10000);
If the pointer could be underrunning the buffer allocate more space and move
the pointer up the buffer. Remember to observer alignment constraints.
A more difficult memory corruption problem is a memory map error. Here you
need to check the linker map to make sure the memory is set out as it should
be. This also extends into the workspace configuration. Make sure it matches
the how the memory is set out. These sorts of errors usually appear soon after
initialisation.
After this memory corruption bugs start to get harder to find. If you can find
a location that is changing note it. If your debugger has hardware watchpoint
support get it to watch that location for write accesses.
I hope this helps.
Regards
Chris
More information about the users
mailing list