【问题标题】:Shared XDR routines and pointer to .rodata section共享 XDR 例程和指向 .rodata 部分的指针
【发布时间】:2011-11-06 19:35:34
【问题描述】:

我使用 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,我发现分段错误是在 my_remote_call() 调用的 xdr_u_char() 函数中生成的。我的问题是:

在第一种情况下,Hello 字符串由编译器在 .rodata 部分中分配,而在第二种情况下,堆的一部分用于记忆字符串。可能会因为 xdr_u_char 签名明确要求而生成分段错误

char*

不是一个

const char*

如您所见here?那么在这种情况下意味着 xdr_u_char() 函数更改了我的数据?

【问题讨论】:

    标签: pointers segmentation-fault xdr


    【解决方案1】:

    我相信它在接收而不是发送数据时正在更改数据。您确定您的远程呼叫确实在使用带有XDR_ENCODE 模式的 XDR?

    【讨论】:

    • 我认为是因为在调用相应的服务器端函数时服务器应该打印一些信息。并且不打印任何信息。
    【解决方案2】:

    要将字符串传输到 XDR,您应该使用 xdr_string 而不是 xdr_u_char;向我们展示rpcgen*.x 文件...

    【讨论】:

    • 我知道,我知道,你是对的,但这只是一个例子。问题是我正在处理的字符串不是以 NULL 结尾的。我只是想了解分段错误的原因。抱歉,我无法为我的论文展示 .x 文件,并且有一些法律限制。 :(
    • 您可以使用libc 的可调试变体进行调试;在 Debian 或 Ubuntu 系统上,安装 libc6-dbg 软件包并适当设置 LD_LIBRARY_PATH。你应该看看libc的XDR部分的源代码。
    猜你喜欢
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多