我有一个运行的Perl进程,卡住了,我想戳一个调试器,看看有什么问题。我无法重新启动过程。我可以将调试器附加到正在运行的进程吗?我知道我可以做gdb -p,但gdb不帮助我。我试过
Enbugger,但失败:
$ 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)
我做错了吗?还有其他选择吗?
P.S。如果您认为自己可以从连接到正在运行的进程的调试器中获益,则可以插入由SIGUSR1触发的调试器后门:
use Enbugger::OnError 'USR1';
然后你可以简单地杀死-USR1 pid,你的进程将跳转到调试器。
解决方法
首先,请使用DEBUGGING perl,如果你想用gdb检查它。
请定义“卡住”。忙或非忙等待(高或低cpu),吃记忆还是不行?
与1同时正在等待。我通常会在Perl_hfree_next_entry()中自从5.15以来对HV腐败的等待(无休止循环)。非忙等待通常等待阻塞IO读。
我得到正确:
`0x00007fba15ab35c1 in Perl_runops_debug () at dump.c:2266` `2266 } while ((PL_op = PL_op->op_ppaddr(aTHX)));`
并且可以检查一切,比使用一个简单的perl调试器更多。使用非线程perl你必须键入较少。
`(gdb) p Perl_op_dump(PL_op)`
等等。
如果你需要做的perl:在pp_stub函数内,这不是一个好主意进入Enbugger runloop,你应该在dump.c中的主runloop。设置断点到显示的行。
“对象0x3的错误”对eval声音就像上下文中的内部损坏,所以你应该看看cx和堆栈指针。可能是因为你在一个糟糕的环境中启动它。