gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:41:51 26 4
gpt4 key购买 nike

我有一个正在运行的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)

我做错了吗?还有其他选择吗?

附言如果您认为自己可以从运行程序的调试器中受益,则可以插入由SIGUSR1触发的调试器后门:
use Enbugger::OnError 'USR1';

然后,您可以简单地添加 kill -USR1 pid,您的进程将跳入调试器。

最佳答案

首先,如果要使用gdb进行检查,请使用DEBUGGING perl。

请定义“卡住”。忙或不忙的等待(高或低CPU),是否正在消耗内存?
在1时,它正忙于等待。从5.15开始,我通常在Perl_hfree_next_entry()中忙于等待(无尽循环)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运行循环不是一个好主意,您应该位于dump.c的主运行循环中。在显示的行上设置一个断点。

eval上的“对象0x3错误”听起来像上下文中的内部损坏,因此您应该查看cx和堆栈指针。可能是因为您是在不良环境中启动它的。

关于perl - 如何将调试器附加到正在运行的Perl进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com