如何将调试器附加到正在运行的Perl进程?

前端之家收集整理的这篇文章主要介绍了如何将调试器附加到正在运行的Perl进程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个运行的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和堆栈指针。可能是因为你在一个糟糕的环境中启动它。

原文链接:https://www.f2er.com/Perl/173393.html

猜你在找的Perl相关文章