Если вы хотите потратить значительные средства, вы можете использовать коммерческий инструмент статического анализа, такой как Klocwork. Хотя Klocwork в первую очередь нацелен на обнаружение дефектов программного обеспечения и уязвимостей безопасности. Тем не менее, он также имеет инструмент под названием «kwstackoverflow», который можно использовать для обнаружения переполнения стека в задаче или потоке. Я использую для встроенного проекта, над которым я работаю, и у меня были положительные результаты. Я не думаю, что какой-либо инструмент, подобный этому, идеален, но я считаю, что эти коммерческие инструменты очень хороши. Большинство инструментов, с которыми мне приходилось сталкиваться, борются с указателями функций. Я также знаю, что многие производители компиляторов, такие как Green Hills, теперь встраивают аналогичную функциональность прямо в свои компиляторы. Возможно, это лучшее решение, потому что компилятор хорошо знает все детали, необходимые для принятия точных решений о размере стека.
Если у вас есть время, я уверен, что вы можете использовать язык сценариев для создания собственного инструмента анализа переполнения стека. Сценарий должен будет определить точку входа в задачу или поток, сгенерировать полное дерево вызовов функций, а затем вычислить объем стекового пространства, которое использует каждая функция. Я подозреваю, что, вероятно, есть бесплатные инструменты, которые могут генерировать полное дерево вызовов функций, чтобы облегчить его. Если вы знаете специфику вашей платформы, генерирующей пространство стека, то каждая функция может быть очень простой. Например, первой инструкцией по сборке функции PowerPC часто является слово сохранения с инструкцией обновления, которая корректирует указатель стека на величину, необходимую для функции. Вы можете взять размер в байтах прямо из первой инструкции, что делает определение общего используемого пространства стека относительно простым.
Все эти виды анализа дадут вам приблизительную верхнюю границу для использования стека, что именно то, что вы хотите знать. Конечно, эксперты (как и те, с кем я работаю) могут жаловаться, что вы выделяете слишком много стекового пространства, но они - динозавры, которым не важно хорошее качество программного обеспечения:)
Еще одна возможность, хотя она не рассчитывает использование стека, заключается в использовании блока управления памятью (MMU) вашего процессора (если он есть) для обнаружения переполнения стека. Я сделал это на VxWorks 5.4 с помощью PowerPC. Идея проста, просто поместите страницу памяти с защитой от записи в самый верх вашего стека. В случае переполнения произойдет освобождение процессора, и вы быстро получите предупреждение о проблеме переполнения стека. Конечно, это не говорит вам о том, насколько вам нужно увеличить размер стека, но если вы хорошо справляетесь с отладкой файлов исключений / ядра, вы можете, по крайней мере, выяснить последовательность вызовов, которая переполнила стек. Затем вы можете использовать эту информацию, чтобы соответствующим образом увеличить размер вашего стека.
-djhaus