【发布时间】:2015-03-18 17:59:08
【问题描述】:
我试图找出我在 c++ poco 代码中的错误所在。在 Ubuntu 14 上运行时,程序运行正常,但通过 gnueabi 为 arm 重新编译时,它只是与 sigsegv 崩溃:
这是来自堆栈跟踪的报告(它所在的位置):
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(8888), sin_addr=inet_addr("192.168.2.101")}, 16) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x6502a8c4} ---
+++ killed by SIGSEGV +++
这是它所在的代码(它应该连接到 tcp 服务器):
this->address = SocketAddress(this->host, (uint16_t)this->port);
this->socket = StreamSocket(this->address); // !HERE
请注意,我正在捕获任何异常(例如 econnrefused),并且在无法连接时正确死亡。当它连接到服务器端时,它就掉了。
尝试启动 valgrind 时,它会因错误而中止。不知道影子内存范围是什么意思
==4929== Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly. ABORTING.
http://pastebin.com/Ky4RynQc这里是完整的日志
谢谢
【问题讨论】:
-
地址类型是什么?您是否检查过
SocketAddress()正在返回一个有效地址 -
它正确连接到服务器,但不是保持连接,而是失败。所以我想地址是好的,我会再检查一次。
-
使用 -fsanitize=address 编译代码并在 valgrind 下运行(在 ARM 和 Ubuntu PC 上)。很可能这是您的代码中的一个错误,恰好在 PC 上未触发。可能是在释放后使用,但这是一个非常疯狂的猜测。
-
嗯,免费后就不能用了。我的方法只有两行可以运行。两者都像示例一样构建和使用。
-
可能是结构对齐问题。你知道
&this->socket是否在正确对齐的地址上(如果是 32 位值,则为 4 的倍数)?
标签: c++ network-programming arm poco