2

SceneRect の境界を示す BorderRect と呼ばれるサブクラス化された QGraphicsRectItem を追加する QGraphicsScene があります。BorderRect には、ユーザーがサイズを変更できるグリップがあり、これによりシーンの sceneRect が変更されます。これはすべて機能しますが、たまに次のようなバックトレースでセグフォールトが発生することを除いて:

#0  _int_malloc (av=0x7ffff587e620, bytes=32) at malloc.c:3415
#1  0x00007ffff55592a4 in *__GI___libc_malloc (bytes=32) at malloc.c:2924
#2  0x00007ffff5e4c40d in operator new(unsigned long) () from /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libstdc++.so.6
#3  0x00007ffff723911e in QRegion::QRegion(QRect const&, QRegion::RegionType) () from /usr/lib64/qt4/libQtGui.so.4
#4  0x00007ffff72394de in QRegion::intersect(QRect const&) const () from /usr/lib64/qt4/libQtGui.so.4
#5  0x00007ffff7239509 in QRegion::operator&(QRect const&) const () from /usr/lib64/qt4/libQtGui.so.4
#6  0x00007ffff723952f in QRegion::operator&=(QRect const&) () from /usr/lib64/qt4/libQtGui.so.4
#7  0x00007ffff70e0c6b in QWidgetPrivate::subtractOpaqueSiblings(QRegion&, bool*, bool) const ()
  from /usr/lib64/qt4/libQtGui.so.4
#8  0x00007ffff72b6141 in QWidgetPrivate::scrollRect(QRect const&, int, int) () from /usr/lib64/qt4/libQtGui.so.4
#9  0x00007ffff712fe8a in QWidgetPrivate::scroll_sys(int, int) () from /usr/lib64/qt4/libQtGui.so.4
#10 0x00007ffff70eefe5 in QWidget::scroll(int, int) () from /usr/lib64/qt4/libQtGui.so.4
#11 0x00007ffff76b7fbb in QGraphicsView::scrollContentsBy(int, int) () from /usr/lib64/qt4/libQtGui.so.4
#12 0x00007ffff6b7c0fa in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) ()
  from /usr/lib64/qt4/libQtCore.so.4
#13 0x00007ffff770ec7e in QAbstractSlider::valueChanged(int) () from /usr/lib64/qt4/libQtGui.so.4
#14 0x00007ffff76b0dca in QGraphicsViewPrivate::recalculateContentSize() () from /usr/lib64/qt4/libQtGui.so.4
#15 0x00007ffff76bab39 in ?? () from /usr/lib64/qt4/libQtGui.so.4
#16 0x00007ffff6b7c0fa in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) ()
  from /usr/lib64/qt4/libQtCore.so.4
#17 0x00007ffff7687a45 in QGraphicsScene::sceneRectChanged(QRectF const&) () from /usr/lib64/qt4/libQtGui.so.4
#18 0x000000000042fef0 in BorderRectItem::sceneEventFilter (this=0xfc0070, watched=0xef6e80, event=0x7fffff800590)
    at gui/BorderRectItem.cpp:193
...

さらにいくつかの行がありますが、バック トレースの 18 行目で参照されている行は、BorderRect の新しい寸法に対応する QRectF を使用した setSceneRect の呼び出しに対応しています。この場合:

{xp = 20, yp = -59, w = 563.94193411401511, h = 436.5631806793956}

なぜこれがクラッシュしているのかわかりません。シーンを確認しましたが、ヌルではありません。これをデバッグするのは非常に難しいと思います。私が本当に興味を持っているのは、これを行う方法に関するヒントです。特に、バック トレースを上下に移動するときに Qt コード内の変数の状態を確認すると非常に役立ちますが、その方法がわかりません。Linux を実行しています...デバッグ シンボルなどを使用して Qt を再構築できますか?

4

1 に答える 1

1

ここで推測するだけですが、そのスタック トレースにより、独自のメソッドの一部からローカル スタック QRect への参照を返すか、他のスタック変数への参照を返すか (またはスタック変数への明示的なポインターでさえありますが、偶然に行うのは難しいと思われます) )。

はい、デバッグ シンボルを使用して Qt をコンパイルできます。以下を参照してください。

于 2012-10-25T12:29:16.080 に答える