Изучение стека - PullRequest
       28

Изучение стека

3 голосов
/ 25 мая 2011

У меня проблемы с переполнением стека, и я хотел бы точно узнать, каково содержимое стека.

Как я могу проверить кадр стека с помощью GDB? - это один и тот же вопрос, однако info locals выглядит хорошо (немного переменных, большинство из них std :: vectors и std :: maps) , поэтому я не ожидал бы переполнения стека от этого. Более того, я установил ограничение стека на 32 МБ, поэтому этого должно быть достаточно, и никакие рекурсивные функции не используются.

Есть ли инструмент, который может показать все содержимое стека, возможно, упорядоченный по размеру?

Ответы [ 4 ]

5 голосов
/ 25 мая 2011

Переполнения стека лучше распознаются специальными профилировщиками, чем ручным просмотром переменных в gdb. Более вероятно, что у вас переполнение буфера, а не переполнение стека. В любом случае, вот список некоторых профилировщиков, которые могут помочь вам указать на проблему:

Удачи!

1 голос
/ 25 мая 2011

Даже если у вас нет функций, которые сами себя вызывают, возможно, вы создали ситуацию, в которой две или более функций являются взаимно рекурсивными.

Хорошей отправной точкой будет проверка не текущего кадра стека, а списка кадров стека с использованием команды «backtrace» (или «bt» для краткости). Если вы видите повторяющийся шаблон двух или более функций, вызывающих друг друга, то у вас есть взаимная рекурсия.

0 голосов
/ 25 мая 2011

Вы также можете получить текущий указатель стека в GDB (например, запустив «информационные регистры»), а затем вывести память вокруг этого места с помощью команды exam (или «x»).Просто имейте в виду, что указатель стека указывает ниже стека, поэтому вам нужно начать сброс из указателя стека - N, чтобы увидеть первые N байтов в стеке.

0 голосов
/ 25 мая 2011

Вы можете просмотреть текущий кадр стека с помощью команды backtrace.

...