2016-09-23 7 views
0

Есть ли способ получить максимальное «использование стека» кода проекта vxworks C
скомпилировано для архитектуры PPC с использованием ccppc на WindRiver Workbench?Максимальное использование стека из файла elf

+2

Использование стека может варьироваться в зависимости от пробега (подумайте о рекурсии с переменной глубиной). Нет, нет. Вы можете получить его для определенного запуска. –

+0

@EugeneSh. Такие инструменты, как https://www.absint.com/stackanalyzer/index.htm, могут дать вам наихудший вариант, и он скажет вам, есть ли какая-то конкретная причина, по которой он не может его определить (например, вы используете рекурсию с неограниченным количество вызовов). – nos

ответ

0

Мне не известно о способе статического анализа использования стека без использования какого-либо кода. Однако есть, вероятно, два способа, которые я знаю, которые могут дать хороший совет:

1) Заполните стек некоторым известным рисунком (например, 0xAA). Выполните код в течение разумного промежутка времени. Затем снова проанализируйте стек, чтобы увидеть самую высокую точку, до которой было изменено содержимое стека. У этого метода уже есть проблема, как в том, как долго «разумное количество времени»?

2) Измените значение указателя стека во время выполнения программы, а затем сделайте статистическую оценку количества использования стека.

As @Eugene Sh. указал, что, вероятно, нет способа фактически получить использование стека без запуска какого-либо кода.

1

По различным очевидным причинам нет практического способа получить это от статического анализа - нетривиально предсказать поток программы. Возможно, для простой программы, но любая полезная система с сетевыми интерфейсами, конфигурационными файлами и т. Д. И т. Д. Практически невозможна. Рекурсия, в частности, вызовет серьезные проблемы.

Больше использования будет фактическое использование стека в запущенной системе, и, к счастью, есть инструмент для этого - команда оболочки checkStack.

Это зависит от того, что стек был проиндексирован с известным рисунком (я думаю, 0xEE), и checkStack затем ищет верхнюю отметку использования - то есть первое место, которое не содержит этого известного значения.