Почему восстановление QPainter вызывает сбой в сегменте? - PullRequest
0 голосов
/ 01 июня 2018

Моя программа иногда (с низкой вероятностью) аварийно завершала работу со следующей обратной трассировкой:

Error: signal 11:
/ri/flamingo_console(_Z7handleri+0x174)[0x884a14]
/lib/libc.so.6(__default_sa_restorer_v2+0x0)[0xb5d3de60]
/lib/libc.so.6(memcpy+0x74)[0xb5d94124]
/ri/Qt5.5/lib/libQt5Core.so.5(_ZN7QString11reallocDataEjb+0x8c) 
[0xb60f2f68]
/ri/Qt5.5/lib/libQt5Gui.so.5(+0x2f2284)[0xb6923284]  
/ri/flamingo_console[0x5f75a8]
/ri/flamingo_console[0x54f6e4]

Я использую инструмент addr2line и нахожу текстовый адрес 0x5f75a8 в следующей функции:

void RElementStyle::drawText( QPainter &painter,
           const QRect &rect,
           const QString &str,
           Qt::AlignmentFlag align )
{
    painter.save();
    painter.setPen( mCommon.getColor( mStatus, str) );
    //! font
    QFont font = qApp->font();
    font.setPointSize( mCommon.mContentFont.mSize );
    painter.setFont( font );
    painter.drawText( rect,
                  align | Qt::AlignVCenter,
                  str );
    painter.restore();  //! this is the crash line 0x54f6e4
}

Я узнаю кое-что о painter.restore () и узнаю, что restore () выдает настройки Painter. Однако я не могу понять, почему восстановление может вызвать ошибку сегмента.Может ли кто-нибудь проанализировать это для меня?Большое спасибо.

...