GNU/Linux >> Linux の 問題 >  >> Linux

Linuxでプログラムがスタックしている場所を知る方法は?

私の最初のステップは、プロセスで strace を実行することです.

 strace -s 99 -ffp 12345

プロセスIDが12345の場合。これにより、プログラムが実行しているすべてのsyscallが表示されます。プロセスをたどる方法で詳細がわかります。

スタックトレースを取得することを主張する場合、Google は同等のものは pstack であると教えてくれます。しかし、私はそれをインストールしていないので、gdb を使用します:

 tweedleburg:~ # sleep 3600 &
 [2] 2621
 tweedleburg:~ # gdb
 (gdb) attach 2621
 (gdb) bt
 #0  0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
 #1  0x0000000000403ee7 in ?? ()
 #2  0x0000000000403d70 in ?? ()
 #3  0x000000000040185d in ?? ()
 #4  0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
 #5  0x0000000000401969 in ?? ()
 (gdb)

プログラムのスタック トレースを見つけるための答えが 2 つあります (最初にデバッグ シンボルをインストールすることを忘れないでください!)。システム コールがスタックした場所を見つけたい場合は、/proc/PID/stack を調べます。 、カーネル スタックを一覧表示します。例:

$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

ほとんどの UNIX システムでは、GDB を使用できます。

gdb -batch -ex bt -p 1234

pstack もあります (標準のユーティリティではないため、おそらく手動でインストールする必要があります)。 AIX の procstack に相当するように見えます .しかし、私の Debian wheezy amd64 では、常にエラーになるようです。 i386 では、デバッグ シンボルなしでコンパイルされたプログラムの場合、デバッグ シンボルが利用可能なライブラリからであっても、シンボルは出力されません。

strace -p1234 も使用できます プロセスによって実行されたシステム コールを表示します。


Linux
  1. Linuxのシステム管理者は知りたがっています:私のディスクスペースはどこに行きましたか?

  2. Linux でスレッドを作成する方法 (C サンプル プログラムを使用)

  3. Linux .dts デバイス ツリー ファイルをプログラムする方法は?

  1. Linux – Dmesgで何をgrepするかを知る方法は?

  2. GccはBoostがインストールされている場所をどのように知っていますか?

  3. Linux CプログラムでpthreadのスレッドIDを取得するには?

  1. Linuxで実行中のプロセスを再起動(またはリセット)する方法は?

  2. Linux システムに Java がインストールされていることを確認するにはどうすればよいですか?

  3. AVR - Linux で AVR チップをプログラムする方法