123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- In the first B::C debugging article we saw how to use the perl level debugger
- stepping into compiling code with <b>Od</b>.
- However we found no error in the compiler at a first glance.
- Inspecting the generated c code we see for the perl code
- <tt>
- 'package dummy;sub meth{print "ok"};package main;dummy->meth'
- </tt>
- parts of the optree as
- <pre>
- listop_list[0].op_ppaddr = PL_ppaddr[OP_LEAVE];
- op_list[0].op_ppaddr = PL_ppaddr[OP_ENTER];
- cop_list[0].op_ppaddr = PL_ppaddr[OP_NEXTSTATE];
- cop_list[0].cop_warnings = pWARN_STD;
- unop_list[0].op_ppaddr = PL_ppaddr[OP_ENTERSUB];
- op_list[1].op_ppaddr = PL_ppaddr[OP_PUSHMARK];
- sv_list[0].sv_u.svu_pv = savepvn("dummy", 5);
- svop_list[0].op_ppaddr = PL_ppaddr[OP_CONST];
- sv_list[1].sv_u.svu_pv = savepvn("meth", 4);
- svop_list[1].op_ppaddr = PL_ppaddr[OP_METHOD_NAMED];
- ..
- </pre>
- Check the optree with Concise:
- <pre>
- $ perl -MO=Concise -e'package dummy;sub meth{print "ok"};
- package main;dummy->meth'
- 7 <@> leave[1 ref] vKP/REFC ->(end)
- 1 <0> enter ->2
- 2 <;> nextstate(main 2 -e:1) v:{ ->3
- 6 <1> entersub[t1] vKS/TARG ->7
- 3 <0> pushmark s ->4
- 4 <$> const[PV "dummy"] sM/BARE ->5
- 5 <$> method_named[PV "meth"] ->6
- </pre>
- Lets debug into that live. Maybe method_named is wrong. You need a DEBUGGING perl,
- and I always prefer -g3 to expand macros.
- <em>I generated that as testcase 35 with <tt>t/testc.sh 35</tt>,
- so I get a ccode35.c and exe.</em>
- <pre>
- $ gdb ccode35
- (gdb) start
- main (argc=1, argv=0x1499a60, env=0x14880e0) at ccode35.c:240
- 240 {
- (gdb) b Perl_pp_method_named
- Breakpoint 2 at 0x5212b7b9: file pp_hot.c, line 3023.
- (gdb) c
- Breakpoint 2, Perl_pp_method_named () at pp_hot.c:3023
- 3023 dVAR; dSP;
- (gdb) bt
- #0 Perl_pp_method_named () at pp_hot.c:3023
- #1 0x520d95d1 in Perl_runops_debug () at dump.c:1968
- #2 0x52027747 in S_run_body (oldscope=1) at perl.c:2431
- #3 0x52026ce7 in perl_run (my_perl=0x1499b60) at perl.c:2349
- #4 0x00401e00 in _fu25__PL_compcv () at ccode35.c:307
- (gdb) n
- 3024 SV* const sv = cSVOP_sv;
- (gdb) n
- 3025 U32 hash = SvSHARED_HASH(sv);
- (gdb) p *sv
- $1 = {sv_any = 0x403390, sv_refcnt = 1, sv_flags = 151012357, sv_u = {
- svu_iv = 21808872, svu_uv = 21808872, svu_rv = 0x14cc6e8,
- svu_pv = 0x14cc6e8 "meth", svu_array = 0x14cc6e8, svu_hash = 0x14cc6e8,
- svu_gp = 0x14cc6e8}}
- </pre>
- So we are in the method named "meth", which should be in the "dummy" package.
- Since the error is
- Can't locate object method "meth" via package "dummy" (perhaps you forgot
- to load "dummy"?) at ccode35 line 1.
- we trust that the stash for meth is correctly assigned as "dummy", but we believe
- that the cv optree for <b>dummy::meth</b> is not stored.
- Indeed inspecting the c code shows us:
- <pre>
- svop_list[1].op_ppaddr = PL_ppaddr[OP_METHOD_NAMED];
-
- /* done main optree, extra subs which might be unused */
- /* done extras */
- </pre>
- There's only the optree for main, but no further subs.
- we miss &dummy::meth.
- Back to the B::Debugger <b>Od</b>.
- why is this sub not stored?
|