2009-03-26 3 views
0

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

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

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

ответ

2

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

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

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

+0

Последнее, что я слышал, они просто помещали случайные «куки» в стек стека, которые вам пришлось бы перезаписать, прежде чем перезаписывать обратный адрес. Затем в функции return cookie проверяется, и если он изменился, приложение завершается. – Eclipse

+0

Чтобы указать на то, что куки-файлы Microsoft, хотя и интересны, уже были побеждены, и поэтому не следует полагаться на безопасность. Кадры стека действительно не помещены случайным образом, потому что это победит всю «стек» вещь. –

+0

Я не имел в виду куки. Я имел в виду фактическое размещение кадра. Что потенциально может быть где угодно в памяти (с небольшим количеством дополнительной проводки от компилятора). Стек - это просто самый простой способ записи информации, которая технически не нужна для стека. –

0

Если вы используете 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); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^