получить отладчик VC, чтобы показать больше кадров в стеке переполнения - PullRequest
2 голосов
/ 14 ноября 2008

Я выполнял удаленную отладку переполнения стека из рекурсивной функции. В Visual Studio IDE были показаны только первые 1000 кадров (все те же функции), но мне нужно было пойти дальше и посмотреть, в чем причина.

Кто-нибудь знает, как заставить VS «двигаться вверх» в листе стека?

Спасибо.

Ответы [ 6 ]

2 голосов
/ 14 ноября 2008

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

Большинство стековых фреймов являются результатом плохой рекурсии. Если это так, вы можете установить условную точку останова для целевой функции. Установите его, чтобы сломать только тогда, когда количество попаданий достигает определенного уровня. Я бы начал со счета около 1000. Возможно, вам придется немного поэкспериментировать, чтобы получить правильный счет, но это не должно занять более нескольких попыток.

1 голос
/ 15 ноября 2008

Время от времени я сталкиваюсь с этим, и я добавляю следующую строку в функцию, которая вызывается рекурсивно:

static int nest; if (++nest == 100) *(char*)0 = 0;

Число 100 произвольно, часто будет работать только 10. Это ограничивает рекурсию, заканчивая ошибкой сегмента. Затем отладчик должен показать вам кадры, которые начали рекурсию.

1 голос
/ 14 ноября 2008

Вы также можете попробовать WinDbg . Это не так дружелюбно, но иногда работает там, где отладчик VC не работает.

1 голос
/ 14 ноября 2008

Я бы предложил заменить ваш метод отладки и использовать ведение журнала для решения такой проблемы. Это может показаться вам более продуктивным, вам просто нужно тщательно выбрать, что и когда печатать.
Любой способ анализа нескольких тысяч строк текста будет намного быстрее, чем несколько тысяч фреймов стека. ИМХО.
И вы можете использовать David's , предлагающий контролировать объем данных для печати (т.е. передавать соответствующую информацию из одного цикла рекурсии в другой)

0 голосов
/ 16 ноября 2008

Вы пытаетесь решить эту проблему неправильно.

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

Другой идеей взлома может быть резкое уменьшение размера вашего стека или искусственное увеличение размера каждого кадра ...

0 голосов
/ 14 ноября 2008

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

void f(int rcount /* = 0 */ )
{
 Assert(rcount < 1000);
 f(count+1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...