1 | @c |
---|
2 | @c COPYRIGHT (c) 1988-1998. |
---|
3 | @c On-Line Applications Research Corporation (OAR). |
---|
4 | @c All rights reserved. |
---|
5 | @c |
---|
6 | @c $Id$ |
---|
7 | @c |
---|
8 | |
---|
9 | @chapter Debugging Hints |
---|
10 | |
---|
11 | The questions in this category are hints that can ease debugging. |
---|
12 | |
---|
13 | @section How do I determine how much memory is left? |
---|
14 | |
---|
15 | First there are two types of memory: RTEMS Workspace and Program Heap. |
---|
16 | The RTEMS Workspace is the memory used by RTEMS to allocate control |
---|
17 | structures for system objects like tasks and semaphores, task |
---|
18 | stacks, and some system data structures like the ready chains. |
---|
19 | The Program Heap is where "malloc'ed" memory comes from. |
---|
20 | |
---|
21 | Both are essentially managed as heaps based on the Heap Manager |
---|
22 | in the RTEMS SuperCore. The RTEMS Workspace uses the Heap Manager |
---|
23 | directly while the Program Heap is actually based on an RTEMS Region |
---|
24 | from the Classic API. RTEMS Regions are in turn based on the Heap |
---|
25 | Manager in the SuperCore. |
---|
26 | |
---|
27 | @subsection How much memory is left in the RTEMS Workspace? |
---|
28 | |
---|
29 | An executive workspace overage can be fairly easily spotted with a |
---|
30 | debugger. Look at _Workspace_Area. If first == last, then there is only |
---|
31 | one free block of memory in the workspace (very likely if no task |
---|
32 | deletions). Then do this: |
---|
33 | |
---|
34 | (gdb) p *(Heap_Block *)_Workspace_Area->first |
---|
35 | $3 = @{back_flag = 1, front_flag = 68552, next = 0x1e260, previous = 0x1e25c@} |
---|
36 | |
---|
37 | In this case, I had 68552 bytes left in the workspace. |
---|
38 | |
---|
39 | @subsection How much memory is left in the Heap? |
---|
40 | |
---|
41 | The C heap is a region so this should work: |
---|
42 | |
---|
43 | (gdb) p *((Region_Control *)_Region_Information->local_table[1])->Memory->first |
---|
44 | $9 = @{back_flag = 1, front_flag = 8058280, next = 0x7ea5b4, |
---|
45 | previous = 0x7ea5b0@} |
---|
46 | |
---|
47 | In this case, the first block on the C Heap has 8,058,280 bytes left. |
---|
48 | |
---|