「通常の」アプローチは、環境にコアファイルを生成させ、それらを取得させることです。これがオプションでない場合は、SIGSEGV
少なくともどこかにダンプされたスタックトレースを取得するシグナルハンドラーをインストールしてみてください。もちろん、これはすぐに「スタックトレースを取得する方法」という質問につながりますが、これは他の場所で答えられます。
最も簡単なアプローチは、おそらくコアファイルを入手することです。コアファイルを読み取ることができる同様のマシンがあると仮定すると、コアファイルを生成しgdb program corefile
たプログラムをデバッグするために使用できます。さまざまなスレッド、それらのデータ(ある程度)などを確認できるはずです。適切なマシンがない場合は、実行されたマシンのハードウェアに合わせてクロスコンパイルする必要があります。program
corefile
gdb
コアファイルが空であるというステートメントについて少し混乱していulimit
ます。シェルでを使用してコアファイルの制限を設定できます。コアのサイズがゼロに設定されている場合、コアファイルは生成されません。空のものを作るのは奇妙に思えます。ただし、プログラムの制限を変更できない場合は、シグナルハンドラーをインストールし、問題のあるスレッドからスタックトレースをダンプする必要があります。
そのことを考えると、対応するマシンでデバッガーを実行できると仮定すると、プログラムをシグナルハンドラーでスリープ状態にし、デバッガーを使用してプログラムにアタッチできる可能性があります。プロセスIDを(たとえばを使用してps -elf | grep program
)決定し、次にを使用してそれに接続します
gdb program pid
ただし、プログラム内からプログラムをスリープ状態にする方法がわかりません(おそらく...のハンドラーをインストールSIGSTOP
しSIGSEGV
ます)。
そうは言っても、ローカルマシンでプログラムを実行してみたと思います...?いくつかの問題は、各ノードで実行されている多くのスレッドの分散システムを必要とするよりも根本的なものです。これは明らかに、上記のアプローチに代わるものではありません。