【问题标题】:How to isolate a fault on arm device?如何隔离arm设备上的故障?
【发布时间】:2015-10-22 15:21:49
【问题描述】:

我在 Arm 设备上使用 rapidjson,运行此代码时出现奇怪的行为。

    #include <document.h>
    using namespace std;

int main()
{
    const char json []="[{\"Type\":\"float\",\"val_param\" : 12.025 }]";

    rapidjson::Document d;

    if( d.Parse<0>( json ).HasParseError() ) {
     //ErrorCase
    }else{
        rapidjson:: Value& val_param    = d[0]["val_param"];
        double tmp_double1  = val_param.GetDouble(); 
        cout << tmp_double1 <<endl; // -9.2559641157289301e+61 instead of 12.025
    }

    return 0;
}

在否决这个问题之前。您还需要什么信息?我真的不知道如何隔离这个故障。如果是因为嵌入式设备而出现,或者rapidjson。以及如何解决。

===========================更新==================== =====================

什么是设备? http://www.keith-koep.com/de/produkte/produkte-trizeps/trizeps-iv-m-eigenschaften/

它有硬件 FPU 吗?它是 ARMv5,所以我不这么认为。

您正在使用哪些编译器和库(版本号/特定版本)? 您将哪些选项传递给编译器和链接器?

arm-linux-gnueabi-g++ -march=armv5te -marm -mthumb-interwork --sysroot=/usr/local/oecore-x86_64/sysroots/armv5te-linux-gnueabi

【问题讨论】:

  • 应该是d
  • 毁灭……........
  • 你的设备上没有调试器吗?
  • 按字符串索引数组? O.o [c] 标签在这里显然不合适......无论如何,这闻起来像一个浮点 ABI 问题,所以首先:设备是什么?它有硬件FPU吗?您正在使用哪些编译器和库(版本号/特定版本)?您将哪些选项传递给编译器和链接器?对于您传递的选项,它们的默认值是如何配置的?
  • 你在其他设备上试过了吗?

标签: c++ arm rapidjson


【解决方案1】:

这看起来可能是 RapidJSON 中的未定义行为类型错误。

由于您的目标是 ARMv5,因此您可能正在使用使用旧版 ARM FPA 格式的软件浮点库(与使用 IEEE754 格式的后来的 VFP 相反)。至关重要的是,FPA 以一种奇怪的中间端格式存储内容,其中 64 位双精度值存储为两个小端字,但最重要的字在前。

(是的,大端 ARM 是另一个复杂的问题,但我在这里故意忽略它,因为我在任何地方都看不到 armeb-* 三元组或 -mbig-endian 选项)

将 12.025 视为 IEEE754 双精度:

64-bit value:             0x40280ccccccccccd.
little-endian byte order: cd cc cc cc cc 0c 28 40
as little-endian words:   0xcccccccd 0x40280ccc

现在采用 FPA 格式:

as little-endian words:   0x40280ccc 0xcccccccd
byte order:               cc 0c 28 40 cd cc cc cc

试图将其解释为纯 little-endian 64 位值会产生 0xcccccccd40280ccc,这恰好是 -9.255965e+61 的 IEEE754 表示。太棒了!


快速浏览一下代码,严格来说,它可能更多的是不兼容而不是错误,因为 RapidJSON 似乎确实明确假定浮点值采用 IEEE754 格式。值得称赞的是,尽管 the parsing code 看起来很毛茸茸,但我确实看到了 unions 而不是类型双关语指针。然而,即使它不依赖 undefined 行为,它仍然依赖于 implementation-defined 行为(浮点类型的格式),不幸的是这个编译器的实现没有不符合预期。

【讨论】:

  • 非常感谢您的全面回答。所以我宁愿使用我猜的其他 json-parser。还是还有机会让它发挥作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多