私はstraceとltraceを理解していますが、これはプロセスが実行されているシステムコールとライブラリコールのみを伝えます。プロセスが実行されているコマンドが何であるかを正確に知りたいです。アセンブリまたはCとアセンブリの間の中間点(可能な場合)。バイナリがデバッグシンボルとしてコンパイルされていないと仮定するため、最初のオプションが優先される可能性が高くなります。
ユースケース:プロセスが中断されたようで、straceまたはltraceから出力がありません。プロセスが「何か」を実行していることを確認します。私はこれが停止問題を解決するのと似ていると思うので、これは正確には理解するのが難しいかもしれません。ただし、有用なデータを収集することは可能です。
2番目のユースケース:好奇心。完全なアセンブリ命令のリストをテキストリストにダンプすることは興味深いでしょう。
私の考えでは、このタスクを実行するためにgdbを使用できると思いますが、これが私が作成したプログラムをデバッグするのではなく、gdbを使用して実行されているプロセスの状態を確認する方法の詳細なので、わかりません。
オペレーティングシステムはCentOS 6です。
答え1
gdb
:コマンドを使用してこれを実行し、ni
一度si
に1つのコマンドを実行できます。ほとんどの「next」値に対して、コマンドはn
次のコード行を実行します。n
(およびそれに対応する)の場合は、s
デバッグシンボルが実行可能ファイルに表示されるようにコンパイルする必要があります。
このstackoverflowの答えこれを視覚的に行うためのいくつかの方法があります。
Command gdb
:display/i $pc
実行前の指示を表示します。display $pc
前のコード行を表示n
またはs
実行します。
答え2
ps -l
プロセスIDを実行しS
(「ステータス」)、列を確認します。状態がある場合、R
プロセスはコードを実行しています。プロセスが状態を維持し、R
システムstrace
コールを実行していないように見える場合、プロセスは非常に長く無限の計算に閉じ込められます。プロセスが状態にあり続けた場合、D
システムコールはブロックされます。プロセスの状態の詳細については、次を参照してください。このプロセスのSTATとはどういう意味ですか?、「中断可能な省電力モード」状態とはどういう意味ですか?そして「kill -9」が動作しない場合はどうなりますか?。
プロセスが長い計算を実行している場合は、Gdb(または他のデバッガ)を使用してプロセスが実行している作業を確認できます。実行可能ファイルにデバッグ情報が不足している場合(通常プログラムを具体的にコンパイルしていない場合)、デバッガーは実行可能ファイルにデバッグ情報が含まれている場合にのみマシン命令を表示して読み取ることができます。スタックトレースなどから。 Gdbをプロセスに接続するには、gdb /path/to/executable 1234
where 1234
is the process IDを実行します。このコマンドを使用すると、s
一度に 1 つのコマンドを実行できます。あなたがプログラマーであり、あなたのプログラムが何をすべきかについてある程度慣れていない場合、この状況でGdbから有用な情報を得ることはほとんど不可能です。