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番目のスレッドはこのロード専用に作成されていると思います。