Я запускаю многопроцессорное приложение, которое всегда дает сбой при выполнении функции, но я мог видеть, что стек этой функции был поврежден, он становится поврежденным, когда он возвращается из вызова функции внутри этой функции. Но когда я попытался распечатать, где изменился стек родительских функций внутри вызываемой функции, он не изменился нигде внутри вызываемой функции, но изменился сразу после возврата из вызываемой функции. Есть идеи, почему стек повреждается только тогда, когда он возвращается из функции? Поскольку я работаю на целевом поле mips, я попытался увидеть, кто пишет в этот стек, используя точку останова адреса через gbdserver. Но есть некоторая проблема с gdbserver: он не отслеживает дочерний процесс, который меня интересует. Есть идеи, как мы можем поймать, кто повреждает стек каким-либо другим способом?
2 ответа
Используйте Valgrind. Он показывает вам недопустимые операции чтения / записи в память и где они находятся.
Проверьте память, выделенную в функции. Вполне возможно переполнение буфера. Когда функция возвращается, она освобождает всю память, и в случае незаконной перезаписи памяти существует вероятность сбоя.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
alloca
-fsanitize=address
на вашем MIPS.