Я занимаюсь имитацией смешанного языка с помощью modelsim, часть кода написана в SystemC (C++), после чего я получаю переполнение стека при использовании кода SystemC. Я не уверен, как проследить эту проблему. Просто хотите проверить, можно ли сообщить об использовании стека при компиляции кода на C++?Возможно ли сообщить отчет об использовании стека для каждого модуля во время компиляции кода на C++?
ответ
В нерекурсивных функциях да: просто добавьте размеры параметров и локальных переменных и добавьте пару или слова для обратного адреса и указателя базы.
В рекурсивных функциях это вообще невозможно, хотя если рекурсия основана на условиях, которые могут быть оценены во время компиляции, это может быть осуществимо в ограниченных случаях.
Я не знаю каких-либо компиляторов, которые делают это.
компилятор не может точно определить, сколько будет максимального размера стека, поскольку это зависит от многих факторов. если у вас есть рекурсия, компилятор не может предсказать, какие будут входы, если у вас есть потоки, будет больше одного стека и так далее.
как проследить? для каждого кодового блока, это кадр стека: от адреса первой переменной в текущей функции обратите внимание, что первая переменная может быть аргументом по значению (не по ссылке), первым или последним, в зависимости от соглашения о вызове, к последней объявленной переменной в текущем блоке, плюс размер последней переменной. перед кадром есть возвращаемое значение (размер шрифта) и обратный адрес (размер указателя), поэтому вы можете определить, сколько байтов каждая функция занимает стек, текущий кадр можно сравнить с первым основным (или потоком) переменный адрес, чтобы предупредить вас, когда вы приближаетесь к пределу. обратите внимание, что стеки потоков обычно имеют разный размер стека, чем основной поток.
Стек, используемый методом, не имеет ничего общего с размером стека потоков или их количеством, за исключением того, что он, очевидно, должен быть меньше. – EJP
@EJP Все, что я сказал, это потоки, имеющие собственные стеки, методы выполняются в стеке стека, а не в основном стеке, я не знаю, что вы поняли. – SHR
После добавления флага '-Wall' он сообщает о слишком большом размере фрейма функции (1.4K + lines). Но в дозе не так много локальных переменных. Но в нем действительно много вложенных 'if',' case'. Это повлияет на размер стека? –
Предлагаемый дубликат говорит, что gcc может сообщать об использовании стека за каждую функцию. –
Простые рассуждения, основанные на количестве и размере параметров, указателях стека и т. Д., Могут быть неверными, поскольку ничто не мешает реализаторам реализации компилятора реализовать так, как вы никогда не ожидаете. Ручной подсчет, безусловно, будет неправильным в оптимизированных сборках. GCC имеет флаг '-fstack-usage'. – Drop
g ++ Я использую 4.7.4. После добавления флага '-fstack-usage' ничего не произошло. –