Как проверить кучу и стек приложения 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 Мб памяти для стека, и диапазон адресов там будет сохраняться меняется по мере того, как вы компилируете его снова и снова. Так что вам нужно знать, где он хранится, в смежном стеке или в стеке, где блоки чередуются с блоками кучи в памяти.