Montag, Januar 27, 2020

Wie kann ich einen debugger anfügen an einen Laufenden Perl-Prozess?

Ich ein Perl-Prozess, der stecken geblieben ist, möchte ich stecken im inneren mit einem debugger, um zu sehen, was falsch ist. Ich kann nicht den Prozess starten. Kann ich den debugger an den Laufenden Prozess? Ich wissen Sie, ich kann tun gdb -p, aber gdb mir nicht weiterhelfen. Ich habe versucht Enbugger, aber gescheitert:

$ perl -e 'while (1) {}'&
[1] 86836
$ gdb -p 86836

Attaching to process 86836.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ............................. done
Reading symbols for shared libraries + done
0x000000010c1694c6 in Perl_pp_stub ()
(gdb) call (void*)Perl_eval_pv("require Enbugger;Enbugger->stop;",0)
perl(86836) malloc: *** error for object 0x3: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug

Program received signal SIGABRT, Aborted.
0x00007fff8269d82a in __kill ()
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on"
Evaluation of the expression containing the function (Perl_eval_pv) will be abandoned.
(gdb) 

Mache ich es falsch? Gibt es andere Möglichkeiten?


P. S. Wenn Sie denken, Sie könnten profitieren von einem debugger an einen Laufenden Prozess an sich selbst, können Sie einen debugger Hintertür ausgelöst durch SIGUSR1:

use Enbugger::OnError 'USR1';

Dann können Sie einfach kill -USR1 pid und Ihr Prozess-Sprung in den debugger.

InformationsquelleAutor zoul | 2012-01-12

3 Kommentare

  1. 11

    Erste, verwenden Sie bitte eine DEBUGGING perl, wenn Sie wollen, um zu überprüfen es mit gdb.

    Bitte definieren Sie „stecken“. Besetzt oder nicht-busy waiting (high oder low CPU), Essen Speicher oder nicht?
    Mit, während 1 es ist busy waiting. Ich in der Regel get busy waiting (endlos-Zyklen) auf HV Korruption in Perl_hfree_next_entry() seit 5.15. Non-busy waiting ist in der Regel wartet auf eine blocking-IO Lesen.

    Bekomme ich die richtige:

    `0x00007fba15ab35c1 in Perl_runops_debug () at dump.c:2266`
    `2266       } while ((PL_op = PL_op->op_ppaddr(aTHX)));`

    können und inspizieren alles, viel mehr, als mit einem einfachen perl-debugger. Mit einem non-threaded perl-Sie müssen weniger Tippen.

    `(gdb) p Perl_op_dump(PL_op)`

    und so weiter.

    Wenn du mit perl zu tun haben: im Inneren der pp_stub Funktion ist es nicht eine gute Idee, geben Sie das Enbugger runloop, sollten Sie in die wichtigsten runloop im dump.c. Legen Sie einen Haltepunkt auf die gezeigte Linie.

    „Fehler für die Objekt-0x3“ auf eval Klang wie interne Korruption in den Kontext, so sollten Sie sich die cx-und stack-Pointer. Wahrscheinlich, weil Sie begann, ihn in einem schlechten Zusammenhang.

  2. 6

    Habe ich noch nie verwendet, gdb, aber vielleicht könnten Sie sich etwas nützliches aus der strace?

    strace -f -s512 -p <PID>

Kostenlose Online-Tests