Общие процедуры XDR и указатель на раздел .rodata

#pointers #segmentation-fault #xdr

#указатели #сегментация-ошибка #xdr #ошибка сегментации

Вопрос:

Я использовал rpcgen для создания заглушки клиента и сервера для программы, которую я разрабатываю. Таким образом, заглушки используют XDR для инкапсуляции данных и отправки их через сеть. Когда я выполняю этот фрагмент кода, возникает ошибка сегментации:

 char *str = "Hello!";
my_remote_call(str, strlen(str));
  

Вместо этого никаких проблем, если я изменю его таким образом:

 char *str = "Hello!";
char *str2 = (char*) malloc(strlen(str));
memcpy(str2, str, strlen(str));
my_remote_call(str2, strlen(str2));
  

С помощью GDB я обнаружил, что ошибка сегментации генерируется в функции xdr_u_char(), вызываемой my_remote_call(). Мой вопрос:

в первом случае строка приветствия выделяется компилятором в разделе .rodata, в то время как во втором часть кучи используется для запоминания строки. Может ли ошибка сегментации быть сгенерирована из-за того, что сигнатура xdr_u_char явно требует

 char*
  

и не

 const char*
  

как вы можете видеть здесь? То есть в данном случае это означает, что функция xdr_u_char() изменяет мои данные?

Ответ №1:

Я считаю, что это изменяет данные, когда они получают, а не отправляют их. Вы уверены, что ваш удаленный вызов действительно использует XDR с XDR_ENCODE режимом?

Комментарии:

1. Я так думаю, потому что сервер должен печатать некоторую информацию при вызове соответствующей серверной функции. И информация не печатается.

Ответ №2:

Для передачи строки в XDR вы должны использовать xdr_string не xdr_u_char ; покажите нам *.x файл для rpcgen

Комментарии:

1. Я знаю, я знаю, вы правы, но это был только пример. Проблема в том, что строка, которую я обрабатываю, не завершается нулем. Я просто хотел понять причину ошибки сегментации. Извините, я не смог показать файл .x, это для моей диссертации, и на это есть некоторые юридические ограничения. 🙁

2. Вы могли бы выполнять отладку, используя отладочный вариант libc ; в системе Debian или Ubuntu установите libc6-dbg пакет и установите LD_LIBRARY_PATH соответствующим образом. И вам следует взглянуть на исходный код части XDR libc .