Как определить, где мое приложение рухнуло в Linux - PullRequest
4 голосов
/ 28 января 2010

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

Ответы [ 4 ]

4 голосов
/ 28 января 2010

Перед запуском программы включите дампы ядра:

ulimit -c unlimited

(и убедитесь, что рабочий каталог процесса доступен для записи процессом)

После сбоя процесса он должен оставить файл core, который затем можно просмотреть с помощью gdb:

gdb /some/bin/executable core

В качестве альтернативы, вы можете запустить процесс в gdb при его запуске - gdb проснется при сбое процесса.

3 голосов
/ 28 января 2010

Вы также можете запустить gdb в gdb-many-windows, если вы используете emacs. которые предоставляют вам лучшие варианты отладки, которые позволяют вам исследовать такие вещи, как стек и т. д. Это очень похоже на Visual Studio IDE.

Вот полезная ссылка

http://emacs-fu.blogspot.com/2009/02/fancy-debugging-with-gdb.html
1 голос
/ 28 января 2010

Valgrind - это то, куда вам нужно идти дальше.Скорее всего, у вас есть проблема со злоупотреблением памятью, которая является мягкой, пока ее нет.Запустите программы под Valgrind и посмотрите, что он говорит.

0 голосов
/ 28 января 2010

Я согласен с bmargulies - Valgrind - абсолютно лучший инструмент для автоматического обнаружения неправильного использования памяти. Почти все дистрибутивы Linux должны иметь его, так что просто emerge valgrind или apt-get install valgrind или что-то еще, что использует ваш дистрибутив.

Тем не менее, Valgrind вряд ли является наименее загадочной вещью из существующих, и обычно она только помогает вам определить, где программа в конечном итоге получила неправильный доступ к памяти - если вы сохранили неверный индекс массива в переменной и затем получили к нему доступ позже, вам все равно придется это понять. Однако, особенно в сочетании с мощным отладчиком, таким как GDB (команда backtrace или bt - ваш друг), Valgrind является невероятно полезным инструментом.

Просто не забудьте скомпилировать с флагом -g (если вы используете GCC, по крайней мере), или Valgrind и GDB не смогут сказать вам, где в источнике произошло злоупотребление памятью.

...