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メンバは出力のスレッドアドレスと同じですが、この事実をプログラム的に利用する方法は実際にはありません。
誰もがこれを行う方法を知っていますか?
あなたは、個々のスレッドのスタックのベースのメモリアドレスを見つけて、そこからオフセットを利用することができますか? – JAB
'すべてのBtをフルに適用する'は役に立ちませんか? –
@ニコライ - いいえ!目標は、70スレッド分のバックトレースを解析する必要がないことです。 – Nathan