2011-07-12 9 views
3

gdbを使用して、 'info threads'または 'thread apply all backtrace'と入力して、すべてのスレッドのリストとその処理内容を取得できます。gdbとpthreadsを使用してスレッドに関するプログラム情報を取得

実行中のスレッドをすべて一覧表示するgdbマクロを作成したいと思います。このマクロはスレッド番号(つまり、gdb 'thread'コマンドの引数)を取得して、スレッドローカルストレージに定義して格納しているスレッドの名前を取得します。擬似コードで

、これは次のようになります。

for each thread in threads 
    t thread 
    f 1 
    set $name = my_name 
    f top 
    printf "Thread %d has name %s and is currently doing %s\n", thread, $name, curr_frame 
next 

ありcurr_frameのための文字列を取得して周りのいくつかの小さな複雑であることが、私は良いを得ることができれば、私は今のためにそれをElideのために喜んだことフレームワークはこのビットの残りの部分に進んでいます。

私は私のプログラム内のスレッドのリストを持って、そしてそれのために私が「情報スレッドの出力の一部として表示スレッドポインタに対応がpthread_t得ることができます、あなたが見ることができるように

(gdb) info thread 
.... 
30 Thread 0x5221c940 (LWP 25304) 0x00000031c5a0aee9 in [email protected]@GLIBC_2.3.2() from /lib64/libpthread.so.0 
.... 
(gdb) p *(_thread_t*)my_threads[0].pid 
$4 = { 
    t_id = 0x5221c940, 

をt_idメンバは出力のスレッドアドレスと同じですが、この事実をプログラム的に利用する方法は実際にはありません。

誰もがこれを行う方法を知っていますか?

+0

あなたは、個々のスレッドのスタックのベースのメモリアドレスを見つけて、そこからオフセットを利用することができますか? – JAB

+0

'すべてのBtをフルに適用する'は役に立ちませんか? –

+0

@ニコライ - いいえ!目標は、70スレッド分のバックトレースを解析する必要がないことです。 – Nathan

答えて

2

バージョン7.0からは、GDBはPythonでスクリプト化可能ですので、擬似コードをそのまま実装することができます。スレッドhereにアクセスし、スタックフレームを取得するためのドキュメントhereを参照してください。

私は、最も簡単にはsource.pyファイルでプログラムを書き、その後、GDBで実行することだと思う:

source source.py 
+0

それは最終的な答えです、はい。残念ながら、私たちはまだgdb 7にいません。 – Nathan

+2

PythonスクリプトはGDB 7.0で追加されましたが、PythonスレッドのサポートはGDB 7.2でのみ追加されました。 Linux上でGDB 7.3を使用すると、 'info thread'がスレッド名を自動的に表示します(アプリケーションがPR_SET_NAME prctl()呼び出しで設定した場合) –

関連する問題