加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:25:34 所属栏目:大数据 来源:网络整理
导读:我有一个运行的Perl进程,卡住了,我想戳一个调试器,看看有什么问题。我无法重新启动过程。我可以将调试器附加到正在运行的进程吗?我知道我可以做gdb -p,但gdb不帮助我。我试过 Enbugger,但失败: $ perl -e 'while (1) {}'[1] 86836$ gdb -p 86836…Att
我有一个运行的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和堆栈指针。可能是因为你在一个糟糕的环境中启动它。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读