3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
4 * 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * 'Didst thou think that the eyes of the White Tower were blind? Nay,
13 * I have seen more than thou knowest, Grey Fool.' --Denethor
15 * [p.853 of _The Lord of the Rings_, V/vii: "The Pyre of Denethor"]
19 * This file contains various utilities for producing debugging output
20 * (mainly related to displaying the stack)
27 #if defined(MULTIPLICITY)
29 Perl_deb_nocontext(const char *pat, ...)
34 PERL_ARGS_ASSERT_DEB_NOCONTEXT;
40 #endif /* DEBUGGING */
46 =for apidoc_item deb_nocontext
48 When perl is compiled with C<-DDEBUGGING>, this prints to STDERR the
49 information given by the arguments, prefaced by the name of the file containing
50 the script causing the call, and the line number within that file.
52 If the C<v> (verbose) debugging option is in effect, the process id is also
55 The two forms differ only in that C<deb_nocontext> does not take a thread
56 context (C<aTHX>) parameter, so is used in situations where the caller doesn't
57 already have the thread context.
63 Perl_deb(pTHX_ const char *pat, ...)
72 #endif /* DEBUGGING */
79 This is like C<L</deb>>, but C<args> are an encapsulated argument list.
85 Perl_vdeb(pTHX_ const char *pat, va_list *args)
88 const char* const file = PL_curcop ? OutCopFILE(PL_curcop) : "<null>";
89 const char* const display_file = file ? file : "<free>";
90 long line = PL_curcop ? (long)CopLINE(PL_curcop) : NOLINE;
94 PERL_ARGS_ASSERT_VDEB;
97 PerlIO_printf(Perl_debug_log, "(%ld:%s:%ld)\t",
98 (long)PerlProc_getpid(), display_file, line);
100 PerlIO_printf(Perl_debug_log, "(%s:%ld)\t", display_file, line);
101 (void) PerlIO_vprintf(Perl_debug_log, pat, *args);
104 PERL_UNUSED_ARG(pat);
105 PERL_UNUSED_ARG(args);
106 #endif /* DEBUGGING */
110 Perl_debstackptrs(pTHX) /* Currently unused in cpan and core */
113 PerlIO_printf(Perl_debug_log,
114 "%8" UVxf " %8" UVxf " %8" IVdf " %8" IVdf " %8" IVdf "\n",
115 PTR2UV(PL_curstack), PTR2UV(PL_stack_base),
116 (IV)*PL_markstack_ptr, (IV)(PL_stack_sp-PL_stack_base),
117 (IV)(PL_stack_max-PL_stack_base));
118 PerlIO_printf(Perl_debug_log,
119 "%8" UVxf " %8" UVxf " %8" UVuf " %8" UVuf " %8" UVuf "\n",
120 PTR2UV(PL_mainstack), PTR2UV(AvARRAY(PL_curstack)),
121 PTR2UV(PL_mainstack), PTR2UV(AvFILLp(PL_curstack)),
122 PTR2UV(AvMAX(PL_curstack)));
125 #endif /* DEBUGGING */
130 /* dump the contents of a particular stack
131 * Display stack_base[stack_min+1 .. stack_max],
132 * and display the marks whose offsets are contained in addresses
133 * PL_markstack[mark_min+1 .. mark_max] and whose values are in the range
134 * of the stack values being displayed
136 * Only displays top 30 max
140 S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max,
141 I32 mark_min, I32 mark_max)
144 I32 i = stack_max - 30;
145 const I32 *markscan = PL_markstack + mark_min;
147 PERL_ARGS_ASSERT_DEB_STACK_N;
152 while (++markscan <= PL_markstack + mark_max)
157 PerlIO_printf(Perl_debug_log, "... ");
159 if (stack_base[0] != &PL_sv_undef || stack_max < 0)
160 PerlIO_printf(Perl_debug_log, " [STACK UNDERFLOW!!!]\n");
163 if (markscan <= PL_markstack + mark_max && *markscan < i) {
166 (void)PerlIO_putc(Perl_debug_log, '*');
168 while (markscan <= PL_markstack + mark_max && *markscan < i);
169 PerlIO_printf(Perl_debug_log, " ");
173 PerlIO_printf(Perl_debug_log, "%-4s ", SvPEEK(stack_base[i]));
176 PerlIO_printf(Perl_debug_log, "\n");
179 PERL_UNUSED_ARG(stack_base);
180 PERL_UNUSED_ARG(stack_min);
181 PERL_UNUSED_ARG(stack_max);
182 PERL_UNUSED_ARG(mark_min);
183 PERL_UNUSED_ARG(mark_max);
184 #endif /* DEBUGGING */
191 Dump the current stack
199 #ifndef SKIP_DEBUGGING
200 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
203 PerlIO_printf(Perl_debug_log, " => ");
204 deb_stack_n(PL_stack_base,
206 PL_stack_sp - PL_stack_base,
207 PL_curstackinfo->si_markoff,
208 PL_markstack_ptr - PL_markstack);
211 #endif /* SKIP_DEBUGGING */
217 static const char * const si_names[] = {
233 /* display all stacks */
237 Perl_deb_stack_all(pTHX)
243 /* rewind to start of chain */
244 si = PL_curstackinfo;
251 const size_t si_name_ix = si->si_type+1; /* -1 is a valid index */
252 const char * const si_name =
253 si_name_ix < C_ARRAY_LENGTH(si_names) ?
254 si_names[si_name_ix] : "????";
256 PerlIO_printf(Perl_debug_log, "STACK %" IVdf ": %s\n",
259 for (ix=0; ix<=si->si_cxix; ix++) {
261 const PERL_CONTEXT * const cx = &(si->si_cxstack[ix]);
262 PerlIO_printf(Perl_debug_log,
263 " CX %" IVdf ": %-6s => ",
264 (IV)ix, PL_block_type[CxTYPE(cx)]
266 /* substitution contexts don't save stack pointers etc) */
267 if (CxTYPE(cx) == CXt_SUBST)
268 PerlIO_printf(Perl_debug_log, "\n");
271 /* Find the current context's stack range by searching
272 * forward for any higher contexts using this stack; failing
273 * that, it will be equal to the size of the stack for old
274 * stacks, or PL_stack_sp for the current stack
277 I32 i, stack_min, stack_max, mark_min, mark_max;
278 const PERL_CONTEXT *cx_n = NULL;
281 /* there's a separate argument stack per SI, so only
284 for (i=ix+1; i<=si->si_cxix; i++) {
285 const PERL_CONTEXT *this_cx = &(si->si_cxstack[i]);
286 if (CxTYPE(this_cx) == CXt_SUBST)
292 stack_min = cx->blk_oldsp;
295 stack_max = cx_n->blk_oldsp;
297 else if (si == PL_curstackinfo) {
298 stack_max = PL_stack_sp - AvARRAY(si->si_stack);
301 stack_max = AvFILLp(si->si_stack);
304 /* for the markstack, there's only one stack shared
312 if (i > si_n->si_cxix) {
313 if (si_n == PL_curstackinfo)
316 si_n = si_n->si_next;
320 if (CxTYPE(&(si_n->si_cxstack[i])) == CXt_SUBST)
322 cx_n = &(si_n->si_cxstack[i]);
326 mark_min = cx->blk_oldmarksp;
328 mark_max = cx_n->blk_oldmarksp;
331 mark_max = PL_markstack_ptr - PL_markstack;
334 deb_stack_n(AvARRAY(si->si_stack),
335 stack_min, stack_max, mark_min, mark_max);
337 if (CxTYPE(cx) == CXt_EVAL || CxTYPE(cx) == CXt_SUB
338 || CxTYPE(cx) == CXt_FORMAT)
340 const OP * const retop = cx->blk_sub.retop;
342 PerlIO_printf(Perl_debug_log, " retop=%s\n",
343 retop ? OP_NAME(retop) : "(null)"
350 if (si == PL_curstackinfo)
355 break; /* shouldn't happen, but just in case.. */
356 } /* next stackinfo */
358 PerlIO_printf(Perl_debug_log, "\n");
361 #endif /* DEBUGGING */
365 * ex: set ts=8 sts=4 sw=4 et: