Любой способ получить размер стека всех функций в файле или проекта на языке Си? - PullRequest
1 голос
/ 20 августа 2011

Я хочу получить все функции, размер стека которых больше назначенного размера, есть ли простой способ предложить?

Получить файл .obj, разобрать его и затем проанализировать выходной файл?

Ответы [ 2 ]

1 голос
/ 20 августа 2011

За пределами встроенных вычислений бесконечная рекурсия является гораздо более вероятной причиной переполнения стека, чем любой конкретный вызов.

При этом в первом приближении ищите локально распределенные массивы:

void foo() {
    ...
    char buffer[1024] = "";
    ...
}

Кроме того, не забудьте alloca() вызов - он динамически распределяет пространство в стеке так же, как malloc() выделяет его в куче.

1 голос
/ 20 августа 2011

Вы можете посмотреть дамп сборки для каждой функции.В gcc вы используете опцию -S.

Допустим, вас интересует функция foo.Затем gcc изменяет имя функции на _foo.Если вы посмотрите на сборку, в верхней части функции вы увидите инструкцию по перемещению указателя стека.Например, в OSX у вас есть что-то вроде:

_foo:
    ...
    movq %rsp, %rbp
    ...
    subq $48, %rsp

Это число, $48, является размером стека.

В качестве альтернативы, вы можете искать эквивалентную команду, используя nmчтобы найти адрес, с которого начинается функция, ndisasm, чтобы получить удобочитаемый дамп, а затем сканировать, куда перемещен указатель стека.

...