GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Woher weiß ich, wo ein Programm in Linux hängen bleibt?

Mein erster Schritt wäre, am besten strace für den Prozess auszuführen

 strace -s 99 -ffp 12345

wenn Ihre Prozess-ID 12345 ist. Dies zeigt Ihnen alle Systemaufrufe, die das Programm durchführt. Wie man einen Prozess verfolgt, sagt Ihnen mehr.

Wenn Sie darauf bestehen, einen Stacktrace zu erhalten, sagt mir Google, dass das Äquivalent pstack ist. Aber da ich es nicht installiert habe, verwende ich 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)

Es wurden zwei Antworten gegeben, um den Stack-Trace eines Programms zu finden (denken Sie daran, zuerst Debugging-Symbole zu installieren!). Wenn Sie herausfinden möchten, wo ein Systemaufruf hängen geblieben ist, untersuchen Sie /proc/PID/stack , die den Kernel-Stack auflistet. Beispiel:

$ 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

Auf den meisten Unix-Systemen können Sie GDB verwenden.

gdb -batch -ex bt -p 1234

Es gibt auch pstack (kein Standarddienstprogramm, Sie müssen es wahrscheinlich manuell installieren). Es sieht aus wie ein Äquivalent zu procstack von AIX . Aber auf meinem Debian wheezy amd64 scheint es immer einen Fehler zu geben. Auf i386 gibt es für ein Programm, das ohne Debugging-Symbole kompiliert wurde, keine Symbole aus, nicht einmal aus Bibliotheken, für die Debugging-Symbole verfügbar sind.

Sie können auch strace -p1234 verwenden um die vom Prozess ausgeführten Systemaufrufe anzuzeigen.


Linux
  1. Linux – Woher wissen Sie, wofür Sie in Dmesg grep müssen?

  2. Woher weiß Gcc, wo Boost installiert ist?

  3. Wie kann man einen laufenden Prozess unter Linux neu starten (oder zurücksetzen)?

  4. So erstellen Sie Threads in Linux (mit einem C-Beispielprogramm)

  5. Wie bekomme ich die Thread-ID eines Pthreads im Linux-C-Programm?

So installieren Sie ein Programm von der Quelle unter Linux

Funktionsweise des Ping-Programms unter Linux

Wie man ein C-Programm unter Linux kompiliert und ausführt

Wie man die Gruppen eines Linux-Benutzers kennt

Geniale Möglichkeiten zum Ausführen eines Programms unter Linux

Wie man ein C-Programm unter Linux schreibt und ausführt