我刚刚注意到我无法让函数返回结构。
我在启用了线程的 ARM32/debian docker 映像上运行它。
这是给我运行时错误的函数:
struct CEC_call des_CEC_call(char * buffy){
char request = buffy[0]; // fails here
buffy+=4;
char obligation = buffy[1];
buffy+=4;
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;
return ceccall;
}
但是如果我将返回类型更改为void
,运行没有问题:
void des_CEC_call(char * buffy){
char request = buffy[0]; // doesn't fail here
buffy+=4;
char obligation = buffy[1];
buffy+=4;
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;
}
Return 对于任何标准返回类型都可以正常工作。
定义结构体的标头包含在带有函数的文件中,尽管即使结构体是在同一文件中定义的,它仍然会崩溃。不确定如何继续调试,感谢任何帮助。
EDIT:
根据评论的建议提供更多详细信息:
我已经在我的 Mac 以及其他一些非 Arm 架构上使用 docker 重新运行了相同的程序,并且它运行时没有任何明显的问题。与位移相关的某些方面与预期略有不同,但没有分段错误导致的运行时错误。我尝试以各种优化级别运行它,但无济于事。
我以前使用过 GDB,所以我认为这可能会提供一些见解,遗憾的是我无法让它在这个容器上工作。
我确保 GDB 已安装并重新编译了二进制文件-0g
.
我用 docker 运行--cap-add=SYS_PTRACE
and --security-opt seccomp=unconfined
.
每次我得到:
warning: Could not trace the inferior process.
Error:
warning: ptrace: Function not implemented
During startup program exited with code 127.
我可以将 GDB 与其他非 Arm、非 32 位 docker 映像一起使用,没有任何问题。我认为这对于另一个问题来说已经足够了,因为我花了很长时间试图让 GDB 在该环境下工作。
我不确定如何验证,但我已经打印出了地址buffy
是指向并且持有的值buffy[0]
在前面的函数以及有问题的函数中。
没有结构返回:
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
使用结构返回:
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = (nil)
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Struct CEC_call
没有任何其他字段。
这可能是某个地方的缓冲区溢出,但没有任何缓冲区,至少没有我制作的缓冲区。我以前没有使用过 QEMU IIRC 或 valingrad,但会更详细地研究它们。我目前无法进行本机测试,因为我无法访问预期的嵌入式 Linux。