The nature of the data driven perl compiler is hitting the perl
debuggers recursion limit, even on one-liners.
Consider this bug: <a href="https://rt.cpan.org/Ticket/Display.html?id=53889"><em>[CPAN #53889]</em></a>
<pre>
package dummy;sub meth{print "ok"};package main;dummy->meth
=>
ok
</pre>
The compiler does not detect the meth sub in the dummy package.
<pre>
$ perl -MO=C,-DcOACMSGpo,-v,-oa.c -e 'package dummy;
sub meth{print "ok"};package main;dummy->meth'
$ cc_harness a.c
$ ./a
</pre>
Can't locate object method "meth" via package "dummy" (perhaps you forgot to load "dummy"?) at -e line 1.
<em>BTW: Easier tested in the distro with
<pre>$ <b>t/testc.sh 35</b></pre>
</em>
First if you don't see the error in the generated c file, always turn on all debugging options and save it into a log file.
$ perl -Mblib -MO=C,-DcOACMSGpoW,-v,-occode35.c ccode35.pl 2>&1 | tee methodcall.log
"-DcOACMSGpoW,-v" is all debugging info you get.
Now let's debug it.
<pre>
$ cpan B::Debugger
$ perl -Mblib <strong>-d -MOd</strong>=C,-DcOACMSGpo,-v -e 'package dummy;sub meth{print "ok"};package main;dummy->meth'
</pre>
The code in question is in &should_save.
<pre>
Od::CODE(0x1870d30)((eval 9)[/cygdrive/f/prog/Perl/B-C/blib/lib/Od.pm:12]:11):
11: &$compile();
DB<1> <strong>s</strong>
B::C::CODE(0x1453910)(/cygdrive/f/prog/Perl/B-C/blib/lib/B/C.pm:3295):
3295: return sub { save_main() };
DB<1> <strong>s</strong>
B::C::save_main(/cygdrive/f/prog/Perl/B-C/blib/lib/B/C.pm:3005):
3005: my $warner = $SIG{__WARN__};
DB<1> <strong>c should_save</strong>
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
</pre>
Oops. Not stopping there. Od is not perfect yet.
Next attempt with line number.
<pre>
<strong>s
s
b 2908</strong>
B::C::should_save(/cygdrive/f/prog/Perl/B-C/blib/lib/B/C.pm:2908):
2908: foreach my $m (qw(new DESTROY TIESCALAR TIEARRAY TIEHASH TIEHANDLE)) {
</pre>
better attempt. <br>
we are enhancing the recursion limit (deep) from 100 to 500,
and set a conditional breakpoint which only breaks when considering the "dummy" package
<pre>
<strong>x $DB::deep = 500
b 2908 $package eq 'dummy'
c
x \%unused_sub_packages</strong>
</pre>
and so on. This is pretty deep in the symbol walker, which tries to detect all possible used subs in possible used packages. Undetected packages will cause such errors,
<pre>Can't locate object method "meth" via package "dummy" (perhaps you forgot to load "dummy"?) at -e line 1.</pre>
Lets continue:
<pre>
DB<2> <strong>n</strong>
2915: delete_unsaved_hashINC($package);
DB<2>
2916: return $unused_sub_packages{$package} = 0;
DB<2>
2959: walkpackages( \%{"main::"}, sub { should_save( $_[0] ); return 1 } );
DB<2> <strong>s</strong>
2942: walkpackages( \%glob, $recurse, $sym );
DB<3> <strong>x \%glob</strong>
0 HASH(0x14ab450)
'DESTROY' => *dummy::DESTROY
'TIEARRAY' => *dummy::TIEARRAY
'TIEHANDLE' => *dummy::TIEHANDLE
'TIEHASH' => *dummy::TIEHASH
'TIESCALAR' => *dummy::TIESCALAR
'meth' => *dummy::meth
'new' => *dummy::new
</pre>
Aha, the meth symbol is there. The error is probably somewhere else in the method_named() op.
To be continued at <a href="http://blogs.perl.org/users/rurban/2010/01/debugging-bc-gdb-into-it-part-2.html">part 2 Debugging B::C, gdb into it</a>.