Почему я получаю эту ошибку сегментации в этом сценарии командной строки PHP? - PullRequest
6 голосов
/ 10 июля 2009

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

#!/usr/bin/php 
<?php 

    $mental_log_file = "/home/ali/mental-log"; 
    array_shift($argv);      //get rid of the initial arg (name of the command) 
    $log_entry = date('j-n-y H:i') . ' ' . implode(' ', $argv) . "\n";

    file_put_contents($mental_log_file, $log_entry, FILE_APPEND);

Вот что я получаю за несколько пробежек:

ali@oem-desktop:~$ mlog blah
ali@oem-desktop:~$ mlog blah
Segmentation fault
ali@oem-desktop:~$ mlog blah
ali@oem-desktop:~$ mlog blah
Segmentation fault
ali@oem-desktop:~$ mlog blah
ali@oem-desktop:~$ mlog blah
ali@oem-desktop:~$ mlog blah
Segmentation fault
ali@oem-desktop:~$ mlog blah
ali@oem-desktop:~$ mlog blah
Segmentation fault
ali@oem-desktop:~$ mlog blah
Segmentation fault

Есть идеи, что я могу здесь делать неправильно? Кажется, файл корректно обновляется, как и ожидалось, даже в тех прогонах, которые вызывают ошибки сегментации. Я использую Ubuntu 9.04 Jaunty.

ali@oem-desktop:~$ php --version
PHP 5.2.6-3ubuntu4.1 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 23 2009 14:37:14) 
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

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

Ответы [ 8 ]

9 голосов
/ 10 июля 2009

Попробуйте

strace mlog blah

и посмотрим, дает ли это какие-то подсказки о том, что он делает, когда умирает. Что бы это ни стоило, я не смог воспроизвести это на 64-битной установке Jaunty с той же сборкой php, о которой вы сообщали.

4 голосов
/ 10 июля 2009

Очень вероятно, что у вас есть расширение, которое каким-то образом портится. Это может произойти, если расширение было создано для другой версии php или внешней библиотеки. Попробуйте отключить все расширения в php.ini и посмотрите, решит ли это проблему. Если это так, то включите каждое добавление по одному, пока не найдете преступника.

3 голосов
/ 07 сентября 2009

Вероятно, из-за этой ошибки, которая затрагивает как Ubuntu, так и Debian ... https://bugs.launchpad.net/ubuntu/+source/php5/+bug/343870

2 голосов
/ 20 июля 2009

Похоже, Ошибка Ubuntu # 343870 в php5-mysql. Я больше не получаю ошибку сегментации с отключенными модулями PHP mysql и mysqli.

1 голос
/ 02 декабря 2010

Попробуйте изменить порядок загрузки расширения. Мне пришлось передвинуть pgsql перед curl, чтобы избавиться от segfault, который у меня был. Я попробовал это после прочтения этого:

http://linux.m2osw.com/php_cli_segmentation_fault_with_pgsql

1 голос
/ 10 июля 2009

Я видел точно такие же вещи, и обычно это просто индикатор ошибки PHP.

Я бы обновился до последней версии, если проблема не исчезнет .. подайте отчет об ошибке. Если вы привязаны к версиям Ubuntu, вы можете вместо этого опубликовать отчет об ошибках в трекере Ubuntu.

0 голосов
/ 28 февраля 2013

Я получил эту ошибку из-за простого переполнения стека. Почему я не получил другую ошибку, кроме ошибки сегментации, это хороший вопрос, но с помощью strace и die() я отследил проблему.

Сервер

Debian 6.0 (сжатие)

Linux domain.com 2.6.32-5-amd64 # 1 SMP Sun 23 сентября 10:07:46 UTC 2012 x86_64 GNU / Linux

PHP

PHP 5.3.3-7 + squeeze14 с патчем Suhosin-Patch (cli) (построено: 6 августа 2012 г. 14:18:06)

Copyright (c) 1997-2009 The PHP Group

Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

с Suhosin v0.9.32.1, Copyright (c) 2007-2010, SektionEins GmbH

Код для воспроизведения проблемы

<?php   
    function Bar() {
        return Bar();
    }
    Bar();
?>

выход

php5 overflowtest.php

Ошибка сегментации

Вывод Strace (если кто-то может использовать его для чего угодно):

PASTEBIN LINK

0 голосов
/ 10 июля 2009

Невозможно воспроизвести, что неудивительно. Экспериментально я бы попытался добавить файл, используя fopen() вместо file_put_contents().

...