4

1.症状

Qt Creatorでのデバッグセッションは、ランダムな方法で予期せず終了します(つまり、正常に終了する場合があります)。次のいずれかのエラーが発生します。

  • PCレジスタが利用できません(最も一般的なエラー、通常は「内部エラー:psymtabでは読み取り中のpc0×0ですがsymtabではありません」)
  • SIGSEV
  • シギル

これが発生する最初の兆候は、コードの行を踏むと、アセンブラウィンドウ、NTDLL(通常はntdll!LdrFindResource_U+60953)に移動するときです。

Win764でQTCreatorのMinGW(32ビット)を使用して、Qt5.0.1でQtCreator 2.6.2を実行しています。その後、Win732ビットを使用する別のマシンでテストしましたが、動作は同じです。

Qtフォーラムで受け取った回答に続いて、RebuildまたはClean+Buildはこの問題に目立った影響を与えません。

2.最初の分析

最初のエラーが最も一般的だったので、私はそれをWebで検索し、それが私をこれに導きました。それは的を射ているように見えました–間違いなくSIGTRAPがあり、それがそのエラーにつながりました。

ただし、保存したすべてのデバッガログを再確認したところ、そのエラーが発生しなかったことが何度か見つかりました(SIGTRAPは常に存在していましたが)。

3.パターン

WinMergeとある程度の忍耐力で武装して、私は最終的にすべてのエラーケースでパターンを認識することができました。すべてのログ(エラーと成功の両方)には、次のようなものがありました。

>=thread-created,id="2",group-id="i1"
sThread 2 created

これは、私のアプリ(スレッドid =“ 1”で実行されていた)に加えて、2番目のスレッドを作成しました。ただし、すべての成功ログには次のようなものがありました。

>=thread-exited,id="2",group-id="i1"
sThread 2 in group i1 exited

そこで、さらにいくつかのデバッグセッションを実行し、最初のブレークポイントに到達したときに実行中のスレッドを確認しました。すべてのエラーケースで、私は次のようなものを取得していました:

<455info threads
>&"info threads\n"
>~"  Id   Target Id         Frame \n"
>~"  2    Thread 7160.0x33ec 0x76f1fd71 in ntdll!RtlFindSetBits () from C:\\Windows\\system32\\ntdll.dll\n"
>~"* 1    Thread 7160.0x128c main (argc=1, argv=0xbb30d8) at ..\\Exeample\\main.cpp:10\n"
>455^done

Process Explorerを使用すると、この2番目のスレッドが実行可能ファイルにアタッチされていることがわかりました(スレッドを作成していなくても、使用されているコードはここで確認できます)。

また、すべてのエラーケースには、その2番目のスレッドにSIGTRAPがありました。

>~"[Switching to Thread 7160.0x33ec]\n"
>*stopped,reason="signal-received",signal-name="SIGTRAP",signal-meaning="Trace/breakpoint trap",frame={addr="0x76f1000d",func="ntdll!LdrFindResource_U",args=[],from="C:\\\\Windows\\\\system32\\\\ntdll.dll"},thread-id="2",stopped-threads="all"
dNOTE: INFERIOR SPONTANEOUS STOP

4.GDBを再確認します

これがGDBの問題であるかどうかを判断するために、「-i mi」を使用する場合と使用しない場合の両方で、いくつかのコマンドラインデバッグセッションを実行しました。2番目のスレッドへの参照はなく、デバッグセッションが予期せず終了することもありませんでした。そのため、この問題の原因はQtCreatorにあると考えられます。

5.ヘルプのリクエスト

Qt Creatorのソースをダウンロードし、そこで手がかりを探しましたが、それほど遠くはありませんでした。

gdbengine.cppは「ストッパースレッド」について言及していますが、私が見つけた唯一の言及はここにあります。

誰かが私が次に何をチェックすべきかについて何か考え/指針を持っていますか?

御時間ありがとうございます。

編集:

この原因はまだわかりませんが、Process Monitorで調べたところ、さらにデータがあります。

2番目のスレッドは、アプリの実行可能ファイルとそれに必要なDLLを読み込むために作成されます。この2番目のスレッドは、QtCreatorIDEからアプリをデバッグするときにのみ作成されることを確認しました。IDEから実行する場合(つまり、「debug」の代わりに「run」を使用する場合)、コマンドラインからデバッグする場合(コマンドラインからgdbを起動する場合)、またはコマンドラインから実行する場合は、 2番目のスレッドは作成されず、実行可能ファイル+ DLLイメージはアプリのメイン(および唯一の)スレッドによってロードされます。

上記の「サクセスケース」と呼ばれるもの、つまり、この2番目のスレッドが終了すると、最後のDLLをロードした直後に終了します。そのため、この2番目のスレッドはこのロード専用に作成されていると思います。

4

2 に答える 2

0

http://www.efnetcpp.org/wiki/Heap_Corruption

何かを2回解放/削除していますか、または削除された変数を参照していますか?

前回、かなりランダムな方法でマップ全体にエラーが発生したのは、ヒープの破損が原因でした。

Qt は、削除する必要があるものとそうでないものを追跡するために、一種のスマート ポインターをよく使用します。(開いて保存された参照の数と、それらの参照がいつ削除されたかを追跡します。) 複数のオブジェクトによって共有される変数を調べます。

デバッグ用のその他の Qt リソースを次に示します。

http://qt-project.org/doc/qt-4.8/debug.html

http://qt-project.org/doc/qt-4.8/qobject.html#dumpObjectInfo

http://qt-project.org/doc/qt-4.8/qobject.html#dumpObjectTree

Qt オブジェクト モデルを正しく理解して使用し、オブジェクトを正しくペアレント化することも、奇妙なバグを追跡するのに役立ちます。

http://qt-project.org/doc/qt-4.8/object.html

バグを絞り込むもう 1 つの方法は、バグが消えるまでコードのセクションをブロック コメントアウトしてから、逆方向に作業してコードを追加し直すことです。

最後に、このようなバグを見つけるもう 1 つの方法は、定期的に使用しているバージョン管理ツールを利用することです (そうですか?)。バグのないバージョンに戻してから、現在のバージョンとの差分を作成し、まずそれらの差分から始めます。

それが役立つことを願っています。

于 2013-03-21T15:56:43.877 に答える
0

これは、メモリ管理とは関係ありませんが、デバッガーが Windows でプロセスを中断する方法に関係しています。これこのURLを確認してください

于 2014-03-29T21:15:16.240 に答える