[c] GDB поврежденный стек кадров - Как отлаживать?



1 Answers

Если ситуация довольно проста, ответ Криса Додда является лучшим. Похоже, что он прыгнул через указатель NULL.

Однако, возможно, программа выстрелила себе в ногу, колено, шею и глаза перед сбоем - переписала стопку, испортила указатель кадра и другие зла. Если это так, то разгадать хэш вряд ли покажет вам картофель и мясо.

Более эффективным решением будет запуск программы под отладчиком и переключение функций до тех пор, пока программа не выйдет из строя. Как только функция сбоя идентифицируется, запустите снова и перейдите в эту функцию и определите, какая функция она вызывает, вызывает сбой. Повторяйте до тех пор, пока не найдете единственную оскорбительную строку кода. 75% времени, исправление будет очевидно.

В других 25% ситуаций так называемая оскорбительная строка кода - это красная селедка. Он будет реагировать на (недействительные) условия, заданные для многих строк раньше, может быть, тысяч строк раньше. Если это так, лучший выбранный курс зависит от многих факторов: в основном ваше понимание кода и опыт с ним:

  • Возможно, установка точки наблюдения отладчика или вставка диагностического printf на критические переменные приведет к необходимости A ha!
  • Возможно, изменение условий тестирования с различными входами обеспечит более глубокое понимание, чем отладка.
  • Возможно, вторая пара глаз заставит вас проверить ваши предположения или собрать недооцененные доказательства.
  • Иногда все, что нужно, идет на обед и думает о собранных доказательствах.

Удачи!

Question

У меня есть следующая трассировка стека. Можно ли извлечь из этого что-нибудь полезное для отладки?

Program received signal SIGSEGV, Segmentation fault.
0x00000002 in ?? ()
(gdb) bt
#0  0x00000002 in ?? ()
#1  0x00000001 in ?? ()
#2  0xbffff284 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) 

Где начать искать код, когда мы получаем Segmentation fault , и трассировка стека не так полезна?

ПРИМЕЧАНИЕ. Если я отправлю код, эксперты SO дадут мне ответ. Я хочу взять руководство от SO и найти ответ сам, поэтому я не размещаю код здесь. Извиняюсь.




Посмотрите на некоторые из ваших других регистров, чтобы увидеть, есть ли в них один из них указатель стека. Оттуда вы сможете получить стек. Кроме того, если это встроено, довольно часто стек определяется по очень определенному адресу. Используя это, вы также можете получить приличный стек. Это все предполагает, что, когда вы прыгали в гиперпространство, ваша программа не пугала всю память по пути ...






Related