2012-01-12 19 views
32

実行中のPerlプロセスがありますが、何が問題なのかをデバッガで突き止めたいと思います。私はプロセスを再開できません。実行中のプロセスにデバッガを接続できますか?私はgdb -pを行うことができますが、gdbは私を助けません。私はEnbuggerを試みたが、失敗しました:実行中のPerlプロセスにデバッガを接続するにはどうすればよいですか?

$ 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'; 

が次にあなたは、単にkill -USR1 pidとあなたのプロセスがデバッガにジャンプしますすることができます。

答えて

6

私はgdbを使ったことがありませんでしたが、多分straceから有用なものを得ることができましたか?

strace -f -s512 -p <PID> 
11

まず、gdbで検査する場合は、DEBUGGING perlを使用してください。

「スタック」を定義してください。ビジー状態または非ビジー状態(高CPUまたは低CPU)、メモリを摂っているかどうか と一緒に待っています。私は通常、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ではlessをタイプする必要があります。

`(gdb) p Perl_op_dump(PL_op)` 

など。

もしあなたがperlと関係があるなら、pp_stub関数の中でEnbugger runloopに入るのは良い考えではありません。dump.c.のメインrunloopに入るはずです。表示されている行にブレークポイントを設定します。

「オブジェクト0x3のエラー」は、コンテキスト内の内部破損のようなevalサウンド上にあるため、cxおよびスタックポインタを参照する必要があります。おそらくあなたが悪い状況でそれを始めたからです。

4

http://metacpan.org/pod/App::Stacktrace "perl-stacktraceは、PerlプロセスのPerlスレッドのPerlスタックトレースを表示します。 Perlフレームごとに、完全なファイル名と行番号が出力されます。 "

関連する問題