2011-10-27 8 views
3

スレッドのスタックをファイルにダンプするとします。どうすればLinuxでそれを行うことができますか?スタックの開始アドレスとそのサイズはどのようにして見つけることができますか?私はこれをprogammatically同じプロセス(ptrace、gdbなどを使用しない)から実行したいことに注意してください。スレッドスタックをダンプする方法

gdb -p 1234 

をそしてバックトレースを取得するためにbtを入力します。

+0

デバッガの使用を検討しましたか? – sidyll

+0

デバッガを使用せずに、プログラムでそれをやりたい – MetallicPriest

+0

コールスタックを取得するか、すべてのスタックをダンプしますか? –

答えて

0

使用gdbは、そのPID(プロセスID)を経由して、実行中のプロセスにアタッチします。

+0

gdbを使いたくない、私のプログラムからやりたい。 – MetallicPriest

1

使用pthread_attr_getstack機能を使用することができます。スレッドのスタックアドレスとサイズが得られます。

+1

これは仕事をしない。スレッドがシステムに割り当てられたスタックを使用している場合、 'pthread_attr_getstack'はアドレスとサイズ0を返します。 –

+0

@ denniston.t bout pthread_getattr_np? – MetallicPriest

+0

@ MetallicPriestそれは私が推測することができますが、それは定義上、移植性がありません:-)。それはOPの必要性に応じて重要ではないかもしれません。 –

0

なぜスレッドのスタックをダンプしますか?

application checkpointingを取得しますか?必要ならば、それを実装しているライブラリがありますが、不完全であっても実際には便利です。

重要なのは、スレッドのスタックをファイルにダンプすることができたとしても、そのファイルで便利なことができるかどうかはわかりません。これらのスタックを使用してアプリケーションを再起動することはできません。同じ構成でもスタックが0桁を書き込まない限り、他の場所にスタックがある可能性があるためです。/proc/sys/kernel/randomize_va_space

実行中のプロセスに、そのプロセスを中断することなくコアファイル(後でgdbで調べることができる)をダンプするように強制するlinuxライブラリ。

コールスタックは非常に壊れやすいもので、予防策なしで再利用することはできません。

+0

はい、基本的にはチェックポイントです。私が考えていたアイデアは、pthread_attr_setstackを使ってスタックを設定し、プロセスをチェックポイントとしてフォークすることです。しかし、fork以外のスレッドは誰もが死んでしまうので、スレッドを作り直して、スタックをデッドスレッドからコピーしたかったのです。しかし、私はまだ、デッドスレッドに対してCPUレジスタを取得する方法を知る必要があります。 – MetallicPriest

+0

次に、既存のチェックポイント・インフラストラクチャを使用する(そしておそらく改善する)ことをお勧めします。いつものように、悪魔は細部にいる。 –

+0

いくつかのオープンソースのチェックポイントインフラストラクチャに向けて親切に指摘できますか?私は感謝するでしょう。 – MetallicPriest

関連する問題