Я запускаю многопроцессорное приложение, которое всегда дает сбой при выполнении функции, но я мог видеть, что стек этой функции был поврежден, он становится поврежденным, когда он возвращается из вызова функции внутри этой функции. Но когда я попытался распечатать, где изменился стек родительских функций внутри вызываемой функции, он не изменился нигде внутри вызываемой функции, но изменился сразу после возврата из вызываемой функции. Есть идеи, почему стек повреждается только тогда, когда он возвращается из функции? Поскольку я работаю на целевом поле mips, я попытался увидеть, кто пишет в этот стек, используя точку останова адреса через gbdserver. Но есть некоторая проблема с gdbserver: он не отслеживает дочерний процесс, который меня интересует. Есть идеи, как мы можем поймать, кто повреждает стек каким-либо другим способом?

0
Sivakumar Arumugam 24 Авг 2014 в 16:09
Вы пытались запустить свое приложение в настольной системе x86 Linux?
 – 
Basile Starynkevitch
24 Авг 2014 в 16:11
Это встроенное приложение mips нуждается в определенной аппаратной поддержке, поэтому не может работать в обычной системе x86.
 – 
Sivakumar Arumugam
24 Авг 2014 в 17:01
1
0) добавить утверждения для каждого вычисления индекса/указателя 1) Разделяй и властвуй: замени тела функций пустыми телами и посмотри, исчезнет ли ошибка. 2) то же самое для распределений: молча выделять больше памяти, чем вам нужно; и негабаритные фиксированные массивы. 3) модульное тестирование каждой функции или набора функций.
 – 
wildplasser
24 Авг 2014 в 18:16
Вы могли бы передать указатель на объект стека, который выходит за рамки... в то время как все еще используется... или использует неподходящий alloca
 – 
Grady Player
24 Авг 2014 в 19:20
Возможно, недавний GCC может поддерживать -fsanitize=address на вашем MIPS.
 – 
Basile Starynkevitch
25 Авг 2014 в 10:54

2 ответа

Лучший ответ

Используйте Valgrind. Он показывает вам недопустимые операции чтения / записи в память и где они находятся.

0
Mabus 24 Авг 2014 в 16:21
Я уже использую valgrind, но он показывает, что при возврате вызова происходит только смещение стека, но когда произошло повреждение, оно не отображается. Я думаю, что valgrind не отслеживает память стека.
 – 
Sivakumar Arumugam
24 Авг 2014 в 17:09
Если вы покажете код вызова функции, вызываемой функции и прототипов функций, а также оператор(ы) возврата, тогда у нас будет шанс отладить проблему. Я подозреваю, что существует несоответствие между прототипами, объявлениями функций, оператором вызова функции и оператором возврата.
 – 
user3629249
25 Авг 2014 в 08:03
Я перешел в другую коробку, где больше не мог видеть это повреждение стека. Но использование valgrind было полезно, по крайней мере, чтобы показать, что есть какая-то проблема. Спасибо.
 – 
Sivakumar Arumugam
26 Авг 2014 в 16:36

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

0
Arpit 24 Авг 2014 в 18:00