2016-08-27 11 views
0

マルチスレッドプロセスがあり、gdbコマンドを使用してattachコマンドを使用してトレースする場合は、どのスレッドに接続しますか(現在実行中かメインなど)?私はinfo threadsでそれを発見できると知っていますが、デフォルトで選択するスレッドを知りたいと思います。スレッドgdbがデフォルトで接続します

答えて

1

Linuxの場合、gdbが接続されると、すべてのスレッドがptraceコマンドで停止します。

gdbのデフォルトはC/C++アプリケーションのメインスレッドです。プロセスにアタッチして 'bt'を実行すると、 'main'のスタックがリストされます。

ただし、すべてのスレッドで利用可能です。 gdbは/procファイルシステム内のスレッド情報を見ることができます。 procにはtasksエリアの各スレッドに関する情報が含まれています。スタックアドレスの詳細はstatファイルとmapsファイルにあります。各スレッドのレジスタ値に関する詳細も利用できます。

私はしばしば、マルチスレッドアプリケーションを実行するとgdbがスレッドからスレッドにジャンプする原因が疑問に思っていました。私は、gdbはまだカーネルスケジューラの恩恵を受けていると思うので、スレッド上のステップが、CPUリソースとブレークポイントを起動させる別のスレッドにつながる可能性があります。

+0

はい、私はそれも常にメインスレッドに接続していることに気付きましたが、それを保証する正式な文書があるのだろうかと思います。 – PepeHands

+1

スレッドからスレッドへのステップについては、gdbのドキュメントにいくつかの注意事項があります:https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_39.html#SEC40 _特に、GDBはシングルステップできませんすべてのスレッドはロックステップにあります。スレッドスケジューリングはデバッグターゲットのオペレーティングシステム(GDBによって制御されない)までであるため、現在のスレッドが1つのステップを完了している間に、他のスレッドが複数のステートメントを実行することがあります。さらに、一般に、他のスレッドは、クリーンな文境界ではなく、文の途中で停止します。 – PepeHands

関連する問題