2012-01-13 2 views
0

ОС: Ubuntu 11,10 вебсервер: Apache Код: PHPошибка сегментации при инициализации программы C помощью PHP

Привет Я пытаюсь «EXEC» код C через веб-страницы PHP. Когда я запускаю тот же C-код непосредственно на терминале, он работает нормально, но когда я «исполняю» его через PHP, я получаю ошибку сегментации.

Любая идея, почему такое поведение? Мой C-код делает небольшие «malloc» в нескольких местах. Код, тем не менее, отлично работает при прямом выполнении через терминал с использованием ./a.out

Есть ли способ для меня использовать gdb кода C, когда PHP пытается его выполнить?

Thanks

+0

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

+0

@Joachim, если у вас возникли проблемы с программой, когда вы можете прикрепить отладчик, и это относительно просто, просто создайте переменную локального флага, явно установленную в 1, затем поставьте что-то вроде времени (var) sleep (1); spinloop. Когда вы присоедините отладчик, вы можете установить переменную в 0, и программа продолжит работу. – bearda

ответ

0

Трудно сказать, фактически не видя код. Вы уверены, что ваша программа не течет? Можете ли вы добавить отладочный вывод консоли, чтобы увидеть, когда/где он сбой? Ваша программа пытается получить доступ к любым ресурсам (например, к файлам, портам и т. Д.)? Имеются ли достаточные права для пользователя веб-сервера (или того, кто запускает скрипт php), чтобы фактически выполнить его правильно?

+0

Да, я пытаюсь открыть файл в своем C-коде. Любые указатели на то, как я могу позволить пользователю веб-сервера открывать файлы и т. Д.? – user940154

+0

Для этого может быть несколько причин. Веб-сервер (или более простой интерпретатор php) может вызывать ваш исполняемый файл из другого каталога, используя абсолютный или относительный путь. Например. ваш исполняемый файл может находиться в '/ home /', но он будет запускаться из '/ usr/bin /' (или где угодно). Кроме того, в отношении прав пользователя, если ваш веб-сервер находится в одной группе, chmod файл равен 550. Если он находится в другой группе, установите его на 555 (файл данных, а не программу, программа должна быть 770 или 777). – Mario

+0

Кроме того, как добавленная мера безопасности: не помещайте исполняемый файл (и данные, возможно, тоже) в путь, доступный из Интернета, чтобы не допустить, чтобы кто-то выполнял или открывал файлы напрямую. – Mario

1

Скорее всего это ошибка разрешения пользователей. Ваш веб-сервер будет работать как другой пользователь (никто, wwwrun или аналогичный). Попробуйте выполнить su для пользователя веб-сервера и запустите программу C в качестве этого пользователя.

+0

Запуск веб-сервера как суперпользователя может быть плохой идеей, по крайней мере, если это не просто для тестирования. Просто хочу добавить, что это не постоянное решение. – Mario

+0

Не было и моего предложения! su пользователю веб-сервера, чтобы вы могли видеть, как программа ведет себя как этот пользователь. – asc99c

0

Что вы можете сделать, это включить создание файла дампа ядра и прочитать дамп ядра в gdb после сбоя exe. Чтобы включить создание дампа ядра, посмотрите, что делает 'ulimit'.

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

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