#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
соответствующим образом. И вам следует взглянуть на исходный код части XDRlibc
.