2016-06-06 2 views
6

Я использую web.py для создания веб-сервера Python. Этот сервер вызывается для решения задач линейного программирования, и для этого он использует библиотеку CBC.Python server «Aborted (Core dumped)»

Каждый раз в то время, сервер выходит из строя с бревном, который выглядит так:

78.243.184.3:56271 - - [03/Jun/2016 04:35:54] "HTTP/1.1 GET /optimization" - 200 OK 
Aborted (core dumped) 

Я верю «Отменено (ядро сбрасывали)» ошибка C, поэтому он приходит от любого web.py или CBC.

Есть ли способ отследить источник ошибки?

+1

Может быть, вы можете найти основной файл. –

+0

Вы знаете, как это сделать? – Arnaud

+0

Зависит от системы. Может быть «find/-name» core «-ls' работает. –

ответ

4

Дамп ядра вызван ошибкой в ​​собственном коде вашего веб-сервера. В наши дни Python довольно прочный, поэтому такие ошибки почти всегда вызваны ошибками в расширениях C по моему опыту.

У вас поэтому есть 3 проблемы.

  1. Вам необходимо найти файл дампа ядра. Обычно это находится в текущем рабочем каталоге процесса, который сбрасывается. Однако есть configation options that can change this.

  2. Вам необходимо отладить стек вызовов из-за сбоя. Это описано в StackOverflow - см. How to analyze a program's core dump file with gdb?

  3. Возможно, вам понадобится связать стек интерпретатора Python с кодом Python, который вы использовали. Для этого вам нужно будет установить символы отладки Python и расширения Python для gdb. Вики Python имеет хороший совет, как это сделать here.

+0

Спасибо за этот ответ, завтра я проверю gdb. У меня есть несколько вопросов: 1. Как вы знаете, проблема возникает с веб-сервера, а не с CBC? 2. Вы признаете, что проблема исходит из библиотеки web.py, а не из моего кода? 3. Я не могу найти файл дампа ядра в каталоге server.py. Где можно найти параметры конфигурации web.py? 4. Как отладить его, если он находится в коде web.py? 5. Как вы думаете, лучший вариант - изменить web.py для другой библиотеки? Спасибо за вашу помощь! – Arnaud

+1

Я гениально не могу ответить на ваши вопросы. У вас есть дамп ядра и работает gdb, который скажет вам, где ошибка. Вот почему существуют основные файлы - для анализа post mortem. Чтобы получить дополнительную помощь от кого-либо, вам нужно извлечь стек вызовов, используя описанные мной методы и обновить свой вопрос. –

+0

Но ошибка появляется juste каждый раз в то время (раз в 2 или 3 недели), и я не могу воспроизвести ее ... – Arnaud

0

Основная причина возникновения дампа ядра - получить доступ к адресу памяти вне пределов досягаемости (память, не принадлежащая вашей программе). Операционная система прерывает программу с прерыванием, называемым SegFault или BusError, в зависимости от того, как программа пыталась получить доступ к недопустимому адресу памяти. Затем программа будет принудительно закрыта ядром. Если ядро ​​настроено на создание дампа ядра (дамп памяти и стек программы), то он будет сохранен на диск. Как указано в другом ответе, вы можете загрузить ядро-дамп в GDB или другой отладчик и показать, что программа делала в момент его срыва. Это может или не может дать вам проблему. Обычно для опытного программиста сложно использовать эти инструменты, поэтому имейте в виду. Если вы хотите, чтобы попытаться использовать GDB, попробуйте следующее:

$ GDB/путь/к/сбой/программа/двоичный/путь/к/ядро ​​

(GDB) BT

'Ы' будет отображать «обратные трассы», иначе известные как StackTraces, и могут быть полезны программисту для отслеживания ошибки.

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

Смежные вопросы