Поврежденная проблема стека в программе C / C ++ - PullRequest
5 голосов
/ 14 апреля 2011

Я использую программу C / C ++ на серверах Linux для обслуживания видео.Основная функциональность программы (скажем, с именем «Плагин») заключается в преобразовании видео, и мы разрабатываем отдельный процесс «Плагин» для каждого запроса видео.Но у меня странная проблема, из-за которой иногда средняя загрузка сервера неожиданно становится высокой.На этом этапе из верхней команды я вижу, что есть некоторые процессы, которые работают в течение длительного времени и занимают несколько огромных процессоров.

Когда я отлаживаю эту запущенную программу с помощью стека gdb и backtrace, я обнаружил поврежденный стек: «Предыдущий кадр внутри этого кадра (поврежденный стек?)».Я искал в сети и обнаружил, что это происходит, если программа получает ошибку сегментации.

Но что я знаю, если программа получает ошибку сегментации, программа должна аварийно завершить работу и завершиться в этой точке.Но на удивление программа все еще работает после ошибки сегментации.

Каковы могут быть причины этого?Я знаю, что в программе должны быть какие-то большие проблемы, но я просто не могу понять, с чего начать, чтобы исправить проблему ... Было бы здорово, если бы кто-нибудь из вас смог показать мне несколько лампочек ...

Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 14 апреля 2011

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

Я бы порекомендовал несколько раз запустить pstack на проблемной (это называетсяПрофилирование производительности по методу Монте-Карло "), а также присоедините strace или truss к проблемному объекту и проверьте, какие системные вызовы выполняет процесс при загрузке процессора.

1 голос
/ 14 апреля 2011

Запустите вашу программу под Valgrind и исправьте все недействительные записи памяти, которые она найдет.

0 голосов
/ 14 апреля 2011

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

0 голосов
/ 14 апреля 2011

Если у вас есть код, скомпилируйте программу в режиме отладки и запустите Valgrind.

Если у вас нет кода, обратитесь к автору / поставщику программы.

Поврежденное сообщение стека просто означает, что код делает что-то странное с памятью. Это не означает, что программа имеет ошибку сегментации. Кроме того, программа все еще может работать, если она решит обработать сигнал SIGSEGV.

Если под разветвлением вы имеете в виду, что у вас есть какой-то процесс, который порождает и запускает другие меньшие процессы, просто следите за такими скачками и перезапустите процесс. Это предполагает, что у вас нет доступа к исправлению программы.

0 голосов
/ 14 апреля 2011

Определенные оптимизации, такие как пропуск указателя кадра, могут усложнить отладчику понимание стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...