RPC:分段错误(核心转储)

时间:2018-05-26 15:38:15

标签: c segmentation-fault rpc

由于我遇到了这个问题并且没有回答here,我决定寻求帮助解决我的情况。

我想制作一个简单的RPC服务器 - 客户端,其中有三个操作:

  • 数组X []
  • 的平均值
  • 数组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");

...
地狱爆发了。 更具体地说,服务器上的分段故障已经消失,在此之后很短的时间内,客户端开始工作了#34;没有连接服务器。

enter image description here

&#34;分段错误&#34;给了我一个流氓指针或一个未初始化的变量的想法,但在看了太多时间的代码之后,我找不到任何接近它的东西。我怀疑我的.x文件的编写方式,但我测试了一个更简单的版本,结果相同。

出了什么问题?

ps:repo更深入了解此here

更新 我搞砸了服务器上的程序,似乎几乎整个结构作为参数传递,实际上根本没有传递任何东西,导致基于垃圾进行for循环。

1 个答案:

答案 0 :(得分:0)

啊,羞耻的行走......

原来 生成的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");
}

因此,每次客户端启动时,都已经调用了所有函数,没有参数初始化,这要归功于您真正的可怕编码技能。

修正了它和像魅力一样的词。您可以自己测试here

enter image description here