RPC: ошибка сегментации (ядро сброшено) - PullRequest
0 голосов
/ 26 мая 2018

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

Я хочу сделать простой RPC-сервер-клиент, где бытри операции:

  • среднее значение массива X []
  • max и min элементов массива X []
  • , умножая каждый элемент массива X [] начисло с плавающей точкой r

, поэтому я создал свой файл .x и сгенерировал скелеты кода для того, что мне нужно.

struct X_arr
{
    int X <100>;
    int X_size;
};

struct max_min
{
    int max;
    int min;
};

struct X_times_r
{
    int X <100>;
    int X_size;
    float r;
};

struct prod
{
    float prod <100>;
};

program DUM_PROG
{
    version DUM_VERS
    {
        float average(X_arr)=1;
        max_min max_and_min(X_arr)=2;
        prod product(X_times_r)=3;
    }=1;
}=0x23451111;

Затем я исправил 3 удаленных процедуры длясервер и проверил мой клиент с простым жестко закодированным массивом, который работал нормально (хотя я предполагаю, что иногда была ошибка arguments cannot be encoded).

Но затем я попытался создать меню для клиента, спрашиваядлина X [] и получение элементов для каждой необходимой операции:

...


int i;
int flag=1;
int n;
int r;

int choice;

printf("--------------------------------------------------------------------------\n");

do
{

    printf("==========================\n");
    printf("=====Dummy Operations=====\n");
    printf("==========================\n");
    printf("1. average of X[] \n");
    printf("2. max & min of X[] \n");
    printf("3. r*X[] \n");
    printf("4. Exit \n");
    printf("==========================\n");
    printf("Choice: ");
    scanf("%d", &choice);
    printf("==========================\n");




    if(choice==1)
    {
        ///////////////////////////////////////
        //average of X[]
        ///////////////////////////////////////
        printf("Number of elements: ");
        scanf("%d", &n);

        average_1_arg.X.X_len=n;
        average_1_arg.X_size=n;
        average_1_arg.X.X_val=(int *)malloc(n*sizeof(int));

        for(i=0;i<n;i++)
        {
            printf("X[%d] = ", i);
            scanf("%d", &average_1_arg.X.X_val[i]);
        }

        result_1=average_1(&average_1_arg, clnt);

        printf("Average of X[]: %.2f\n", *result_1);
        ///////////////////////////////////////
        ///////////////////////////////////////
    }
    else if(choice==2)
    {
        ///////////////////////////////////////
        //max and min of X[]
        ///////////////////////////////////////
        printf("Number of elements: ");
        scanf("%d", &n);

        max_and_min_1_arg.X.X_len=n;
        max_and_min_1_arg.X_size=n;
        max_and_min_1_arg.X.X_val=(int *)malloc(n*sizeof(int));

        for(i=0;i<n;i++)
        {
            printf("X[%d] = ", i);
            scanf("%d", &max_and_min_1_arg.X.X_val[i]);
        }

        result_2=max_and_min_1(&max_and_min_1_arg, clnt);

        printf("Max of X[]: %d\n", result_2->max);
        printf("Min of X[]: %d\n", result_2->min);
        ///////////////////////////////////////
        ///////////////////////////////////////
    }
    else if(choice==3)
    {
        ///////////////////////////////////////
        //r*X[]
        ///////////////////////////////////////
        printf("Number of elements: ");
        scanf("%d", &n);

        printf("r: ");
        scanf("%d", &r);

        product_1_arg.X.X_len=n;
        product_1_arg.X_size=n;
        product_1_arg.r=r;
        product_1_arg.X.X_val=(int *)malloc(n*sizeof(int));

        for(i=0;i<n;i++)
        {
            printf("X[%d] = ", i);
            scanf("%d", &product_1_arg.X.X_val[i]);
        }

        result_3=product_1(&product_1_arg, clnt);

        for(i=0;i<n;i++)
            printf("%.2f*X[%d]=%.2f\n", product_1_arg.r, i, result_3->prod.prod_val[i]);
        ///////////////////////////////////////
        ///////////////////////////////////////
    }
    else if(choice==4)
    {
        flag=0;
    }
    else
    {
        printf("Invalid Choice. Terminating in 3...2...1...\n");
        exit(1);
    }
}while(flag);

printf("--------------------------------------------------------------------------\n");

...

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

enter image description here

«Ошибка сегментации» дала мне представление о мошенническом указателе или неинициализированной переменной, но, посмотрев на код слишком много времени, я не нашел ничего похожего на это.Я подозревал способ написания моего .x файла, но я тестировал более простую версию этого файла с теми же результатами.

Что пошло не так?

ps: repo для более детального просмотраэтого здесь

Обновление: Я разбираюсь с процедурами на сервере, и кажется, что почти вся структура, которая передается в качестве аргументов, на самом деле непередать что-либо вообще, что приведет к созданию цикла for на основе мусора.

1 Ответ

0 голосов
/ 28 мая 2018

Ах, шаг позора ...

Оказывается I влево все вызовы функций по умолчанию, которые генерируются RPCфайлы передают мне, до Я сделал свое меню и дал свои значения:

result_1 = average_1(&average_1_arg, clnt);
if (result_1 == (float *) NULL) {
clnt_perror (clnt, "call failed");
}

result_2 = max_and_min_1(&max_and_min_1_arg, clnt);
if (result_2 == (max_min *) NULL) {
clnt_perror (clnt, "call failed");
}

result_3 = product_1(&product_1_arg, clnt);
if (result_3 == (prod *) NULL) {
    clnt_perror (clnt, "call failed");
}

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

Исправлено это и слова, как шарм.Вы можете проверить это самостоятельно здесь

enter image description here

...