スレッドのスタックをファイルにダンプするとします。どうすればLinuxでそれを行うことができますか?スタックの開始アドレスとそのサイズはどのようにして見つけることができますか?私はこれをprogammatically同じプロセス(ptrace、gdbなどを使用しない)から実行したいことに注意してください。スレッドスタックをダンプする方法
gdb -p 1234
をそしてバックトレースを取得するためにbt
を入力します。
スレッドのスタックをファイルにダンプするとします。どうすればLinuxでそれを行うことができますか?スタックの開始アドレスとそのサイズはどのようにして見つけることができますか?私はこれをprogammatically同じプロセス(ptrace、gdbなどを使用しない)から実行したいことに注意してください。スレッドスタックをダンプする方法
gdb -p 1234
をそしてバックトレースを取得するためにbt
を入力します。
あなたはGNU C libに使用している場合、あなたはバックトレース()関数
使用pthread_attr_getstack機能を使用することができます。スレッドのスタックアドレスとサイズが得られます。
これは仕事をしない。スレッドがシステムに割り当てられたスタックを使用している場合、 'pthread_attr_getstack'はアドレスとサイズ0を返します。 –
@ denniston.t bout pthread_getattr_np? – MetallicPriest
@ MetallicPriestそれは私が推測することができますが、それは定義上、移植性がありません:-)。それはOPの必要性に応じて重要ではないかもしれません。 –
Glibcには、あなたが望むことをするバックトレースと呼ばれる機能があります。
http://www.delorie.com/gnu/docs/glibc/libc_665.html
http://www.linuxjournal.com/article/6391?page=0,0
私はそれを試してみました前回、結果は完璧未満、やや有用でした。 YMMV。
なぜスレッドのスタックをダンプしますか?
application checkpointingを取得しますか?必要ならば、それを実装しているライブラリがありますが、不完全であっても実際には便利です。
重要なのは、スレッドのスタックをファイルにダンプすることができたとしても、そのファイルで便利なことができるかどうかはわかりません。これらのスタックを使用してアプリケーションを再起動することはできません。同じ構成でもスタックが0桁を書き込まない限り、他の場所にスタックがある可能性があるためです。/proc/sys/kernel/randomize_va_space
実行中のプロセスに、そのプロセスを中断することなくコアファイル(後でgdb
で調べることができる)をダンプするように強制するlinuxライブラリ。
コールスタックは非常に壊れやすいもので、予防策なしで再利用することはできません。
はい、基本的にはチェックポイントです。私が考えていたアイデアは、pthread_attr_setstackを使ってスタックを設定し、プロセスをチェックポイントとしてフォークすることです。しかし、fork以外のスレッドは誰もが死んでしまうので、スレッドを作り直して、スタックをデッドスレッドからコピーしたかったのです。しかし、私はまだ、デッドスレッドに対してCPUレジスタを取得する方法を知る必要があります。 – MetallicPriest
次に、既存のチェックポイント・インフラストラクチャを使用する(そしておそらく改善する)ことをお勧めします。いつものように、悪魔は細部にいる。 –
いくつかのオープンソースのチェックポイントインフラストラクチャに向けて親切に指摘できますか?私は感謝するでしょう。 – MetallicPriest
デバッガの使用を検討しましたか? – sidyll
デバッガを使用せずに、プログラムでそれをやりたい – MetallicPriest
コールスタックを取得するか、すべてのスタックをダンプしますか? –