【问题标题】:Sigsegv when recompiled for arm architecture为 arm 架构重新编译时的 Sigsegv
【发布时间】:2015-03-18 17:59:08
【问题描述】:

我试图找出我在 c++ poco 代码中的错误所在。在 Ubuntu 14 上运行时,程序运行正常,但通过 gnueabiarm 重新编译时,它只是与 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


【解决方案1】:

不知道为什么,这在 ubuntu 上编译得很糟糕,但是当在 fedora 上编译时(相同的脚本,相同的构建设置,相同的 gnu),它可以工作。

谢谢你们的cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多