У меня очень сложное кросс-платформенное приложение. Недавно мы с моей командой проводили стресс-тесты и столкнулись с несколькими авариями (а также с основными отвалами, сопровождающими их). Некоторые из этих основных дампов очень точны и показывают мне точное место, где произошел сбой при использовании около 10 или более кадров стека. Другие иногда имеют только один стек кадров с ?? являясь единственным символом!Как увеличить вероятность совпадения символов ядра ядра Linux?
То, что я хотел бы знать:
- Есть ли способ, чтобы увеличить вероятность дампы ядра показывает в правильном направлении?
- Почему количество кадров стека не согласовано?
- Любая рекомендация рекомендуется для управления свалками.
Вот как я скомпилировать двоичные файлы (в режиме выпуска):
- компилятора и платформы: г ++ с glibс-2.3.2-95.50 на CentOS 3.6 x86_64 - Это помогает мне поддерживать совместимость с более старыми версии Linux.
- Все файлы скомпилированы с флагом -g.
- Отладочные символы удаляются из финального двоичного файла и сохраняются в отдельном файле.
- Когда у меня есть дамп ядра, я использую GDB с исполняемым файлом, который создал ядро, и файл символов. GDB никогда не жалуется на несоответствие между ядром/бинарными/символами.
Однако я иногда получаю отвалы ядра без символов вообще! Понятно, что я связываюсь с не-отладочной версией libstdC++ и libgcc, но было бы неплохо, если бы по крайней мере трассировка стека показала мне, где в моем коде произошел неправильный вызов команды (хотя в конечном итоге это может закончиться?). ,
Это весьма вероятно, что проблема - если кадр стека был раздавлен ошибкой, то это пошло. – caf
Upvoted. Если ошибка разбивает стек, тогда нет никакой замены для неудачи рано и громко. assert() - ваш друг. – user47559