Как я могу посчитать количество кадров callstack? - PullRequest
0 голосов
/ 26 марта 2009

Для приложения отладки C ++ я хочу иметь возможность легко подсчитывать количество фреймов стека вызовов. Есть ли функция ОС для этого?

Мне это нужно для Windows и Posix, то есть для кроссплатформенности. Решения для одной или обеих платформ будут отличными.

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2009

Нет, потому что это вещь компилятора.

Компилятор может определять свой собственный ABI. Это определяет, как определяется стек вызовов (если есть). Если вы не используете чистый "C", это не тривиально и будет отличаться для каждого компилятора.

Также я слышал (но не проверял), что MS использует новую схему, в которой кадры стека размещаются случайным образом вокруг памяти, чтобы предотвратить (усложнить) атаки переполнения буфера, которые влияют на возвратный переход. Не совсем актуально, но забавный факт.

0 голосов
/ 07 апреля 2009

Если вы используете glibc (Linux), вы можете использовать следующие функции для получения трассировки стека:

#include <execinfo.h> 
int backtrace(void **buffer, int size); 
char **backtrace_symbols(void *const *buffer, int size); 
void backtrace_symbols_fd(void *const *buffer, int size, int fd);

Для получения дополнительной информации см. Справочную страницу для backtrace.

...