【问题标题】:Reading from QDataStream to QVector: application crashes with SIGABRT signal从 QDataStream 读取到 QVector:应用程序因 SIGABRT 信号而崩溃
【发布时间】:2019-01-31 16:58:58
【问题描述】:

此消息导致崩溃:

下级停止了,因为它收到了来自操作系统的信号。

信号名称:SIGABRT

信号含义:中止

发生在这行代码:

// data is QByteArray ...
QByteArray pos0  = data.mid( index, length );
/*
 * Get float from byte-array
 */
QDataStream streamPos0(pos0);
QVector<float> floatPos0;
streamPos0 >> floatPos0; // Crash happens exactly at this line

我无法弄清楚为什么会发生崩溃。我想知道是否有人可以给我一个提示...


更新

当代码正好在崩溃线时,我单步执行了代码并捕获了本地值:

data    "fý¾¾PY\001À\216\224\033ÁµÏ4½\020\233µ½±½~¿f?ÿ¾@Q\001Àî}\033ÁµÏ4½\020\233µ½±½~¿f?ÿ¾ì\007`¿\010 \035ÁµÏ4½\020\233µ½±½~¿z\n~¾\017?`¿´F\035ÁØÙ\000½Ó±µ½\003Ý~¿z\n~¾"... (846288)   QByteArray
index   0   int
length  12  quint64
pos0    "fý¾¾PY\001À\216\224\033Á"  QByteArray
streamPos0  @0x7fffffff7bb0 QDataStream
        byteorder   QDataStream::BigEndian (0x0000) QDataStream::ByteOrder
        d   (null)  QScopedPointer<QDataStreamPrivate>
        dev @0x12f0d60  QIODevice
        noswap  false   bool
        owndev  true    bool
        q_status    QDataStream::Ok (0x0000)    QDataStream::Status
        ver 17  int
floatPos0   <0 items>

崩溃的确切位置在文件qdatastream.h的这一行:

template <typename Container>
QDataStream &readArrayBasedContainer(QDataStream &s, Container &c)
{
    StreamStateSaver stateSaver(&s);

    c.clear();
    quint32 n;
    s >> n;
    c.reserve(n); // crash happens exactly here
    for (quint32 i = 0; i < n; ++i) {
        typename Container::value_type t;
        s >> t;
        if (s.status() != QDataStream::Ok) {
            c.clear();
            break;
        }
        c.append(t);
    }

    return s;
}

我尝试通过.reserve().resize() 方法为我的QVector&lt;float&gt; floatPos0 分配大小,但没有帮助。


我使用的是 Qt 5.9.4

【问题讨论】:

  • 当我尝试这段代码时它不会崩溃。请问您提供更多的细节,例如data的实际内容,以及indexlength
  • @scopchanov 对。相信我会。我现在无法访问我的电脑。我会尽快发布详细信息。谢谢☺
  • 我很期待。祝你有美好的一天!
  • @scopchanov 我用更多调试细节更新了帖子。谢谢:)

标签: qt sigabrt qvector qdatastream


【解决方案1】:

我通过更改将字节数组转换为float 数字的过程来避免 SIGABRT 崩溃。我用以下方法替换了不那​​么冗长但抛出 SIGABRT 信号的 QDataStream 方法。现在代码运行良好:

// Extracting chunks of float out of byte-array
QByteArray pos0x = data.mid( index                      , sizeof(float) );
QByteArray pos0y = data.mid( index + 1 * sizeof(float)  , sizeof(float) );
QByteArray pos0z = data.mid( index + 2 * sizeof(float)  , sizeof(float) );

// Converting to float
float floatPos0x;
if ( pos0x.size() >= sizeof(floatPos0x) ) {
    floatPos0x = *reinterpret_cast<const float *>( pos0x.data() );
}
float floatPos0y;
if ( pos0y.size() >= sizeof(floatPos0y) ) {
    floatPos0y = *reinterpret_cast<const float *>( pos0y.data() );
}
float floatPos0z;
if ( pos0z.size() >= sizeof(floatPos0z) ) {
    floatPos0z = *reinterpret_cast<const float *>( pos0z.data() );
}

This post 很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多