Расширение PHP: ошибка сегментации при возврате из функции

0

Я разрабатываю расширение php и сталкиваюсь с проблемой. В моем расширении я определил функцию, которая анализирует параметры из пользовательского пространства и передает их в другую функцию в статической библиотеке.

Но когда мои функции заканчиваются, он выдает следующую ошибку: "Не удается получить доступ к памяти по адресу 0x5 Ошибка сегментации (сбрасывание ядра)"

Я попытался решить эту проблему с помощью gdb и распечатать следующую информацию о кадре:

0x0852dbe3 in zend_do_fcall_common_helper_SPEC (
    execute_data=<error reading variable: Cannot access memory at address 0xffffffc5>, 
    tsrm_ls=<error reading variable: Cannot access memory at address 0xffffffc1>) at /home/ted/php-5.5.6/Zend/zend_vm_execute.h:550

После ввода команды "info frame" введите следующую информацию:

Stack level 0, frame at 0x9:
 eip = 0x852dbe3 in zend_do_fcall_common_helper_SPEC
    (/home/ted/php-5.5.6/Zend/zend_vm_execute.h:550); saved eip Cannot access memory at address 0x5

Я застрял в этом на один день. Может ли кто-нибудь помочь?

  • 2
    Сбои при возврате из функции обычно означают, что вы перезаписали свой адрес возврата в стеке, что в основном вызвано записью в недопустимый индекс массива, который был объявлен как локальная переменная. Запустите отладчик, дайте вашей программе работать до запуска вашей функции, проверьте обратную трассировку. продолжайте до конца вашей функции и снова проверьте обратную трассировку. Если есть разница, то вы перезаписали свой стек; выгрузка памяти вокруг адреса ss: esp может дать вам подсказку.
  • 0
    другая возможность отладки. Закомментируйте все строки в функции, выполните ее, в это время вы не должны получить ошибку. Введите первую строку, проверьте, воспроизводится ли ошибка. Постепенно добавляйте все больше и больше строк, пока не сможете воспроизвести эту ошибку. С помощью этой процедуры вы сможете точно определить линию, которая вызывает эту ошибку.
Показать ещё 2 комментария
Теги:
gdb
php-extension

1 ответ

1

Я решил эту проблему. Это вызвано ошибкой (возможно), которую я не совсем понимаю. В моем php-коде я вызываю такую функцию:

$object->object_function($a,$b,$c,1);

В моем расширении php я разбираю все эти параметры:

if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sral",&string1,&strlen1,&resource,&array1 ,&intVal)     == FAILURE)

Проблема в том, что я не могу использовать 1 в php-коде. Вместо этого я должен использовать:

$d = 1; 
$object->object_function($a,$b,$c,$d);

Полагаю, это из-за моего плохого понимания ядра php. Непосредственная передача 1 в функцию расширения фактически не даст значения, которое я хочу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню