Как проверить кучу и стек приложения RTEMS с помощью GDB?

Есть ли способ точно узнать диапазон адресов кучи и стека в приложении RTEMS с помощью gdb? Я знаю, что есть info proc mappings в Linux, но я не думаю, что RTEMS имеет / proc для начала. С помощью x проверить память было бы здорово, но мне нужно знать диапазон адресов обоих.

Я знаю, что в http://www.rtems.org/wiki/index.php/Debugging есть несколько советов, но сами они признают, что это действительно грубые оценки.

2 ответа

Решение

Для кучи вы можете исследовать Heap_Control структура (определенная в cpukit/score/include/rtems/score/heap.h) и две переменные, RTEMS_Malloc_Heap а также _Workspace_Area, В частности, вы, кажется, заинтересованы в Heap_Control.area_begin а также Heap_Control.area_end поля. _Workspace_Area может быть частью кучи или отдельной области памяти, и он содержит структуры данных ядра. RTEMS_Malloc_Heap указывает на Heap_Control, описывающий традиционную кучу программ на Си.

Что касается стека, вы можете посмотреть на Thread_Start_information структура (определенная в cpukit/score/include/rtems/score/thread.h), содержащаяся в Thread_Control связан с потоком, стек которого вы хотите исследовать. Вы можете получить указатель на исполняющий поток с помощью _Thread_Executing макро.

Я также устал выяснять то же самое неделю назад. Но я пришел к выводу, что это полностью зависит от ОС и реализации кода. Поскольку компилятор gcc занимает 8 Мб памяти для стека, и диапазон адресов там будет сохраняться меняется по мере того, как вы компилируете его снова и снова. Так что вам нужно знать, где он хранится, в смежном стеке или в стеке, где блоки чередуются с блоками кучи в памяти.

http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

Другие вопросы по тегам