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 line_t line = PL_curcop ? CopLINE(PL_curcop) : NOLINE;
94 PERL_ARGS_ASSERT_VDEB;
97 PerlIO_printf(Perl_debug_log, "(%ld:%s:%" LINE_Tf ")\t",
98 (long)PerlProc_getpid(), display_file, line);
100 PerlIO_printf(Perl_debug_log, "(%s:%" LINE_Tf ")\t",
102 (void) PerlIO_vprintf(Perl_debug_log, pat, *args);
105 PERL_UNUSED_ARG(pat);
106 PERL_UNUSED_ARG(args);
107 #endif /* DEBUGGING */
111 Perl_debstackptrs(pTHX) /* Currently unused in cpan and core */
114 PerlIO_printf(Perl_debug_log,
115 "%8" UVxf " %8" UVxf " %8" IVdf " %8" IVdf " %8" IVdf "\n",
116 PTR2UV(PL_curstack), PTR2UV(PL_stack_base),
117 (IV)*PL_markstack_ptr, (IV)(PL_stack_sp-PL_stack_base),
118 (IV)(PL_stack_max-PL_stack_base));
119 PerlIO_printf(Perl_debug_log,
120 "%8" UVxf " %8" UVxf " %8" UVuf " %8" UVuf " %8" UVuf "\n",
121 PTR2UV(PL_mainstack), PTR2UV(AvARRAY(PL_curstack)),
122 PTR2UV(PL_mainstack), PTR2UV(AvFILLp(PL_curstack)),
123 PTR2UV(AvMAX(PL_curstack)));
126 #endif /* DEBUGGING */
131 /* dump the contents of a particular stack
132 * Display stack_base[stack_min+1 .. stack_max],
133 * and display the marks whose offsets are contained in addresses
134 * PL_markstack[mark_min+1 .. mark_max] and whose values are in the range
135 * of the stack values being displayed
137 * Only displays top 30 max
141 S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max,
142 I32 mark_min, I32 mark_max)
145 I32 i = stack_max - 30;
146 const I32 *markscan = PL_markstack + mark_min;
148 PERL_ARGS_ASSERT_DEB_STACK_N;
153 while (++markscan <= PL_markstack + mark_max)
158 PerlIO_printf(Perl_debug_log, "... ");
160 if (stack_base[0] != &PL_sv_undef || stack_max < 0)
161 PerlIO_printf(Perl_debug_log, " [STACK UNDERFLOW!!!]\n");
164 if (markscan <= PL_markstack + mark_max && *markscan < i) {
167 (void)PerlIO_putc(Perl_debug_log, '*');
169 while (markscan <= PL_markstack + mark_max && *markscan < i);
170 PerlIO_printf(Perl_debug_log, " ");
174 PerlIO_printf(Perl_debug_log, "%-4s ", SvPEEK(stack_base[i]));
177 PerlIO_printf(Perl_debug_log, "\n");
180 PERL_UNUSED_ARG(stack_base);
181 PERL_UNUSED_ARG(stack_min);
182 PERL_UNUSED_ARG(stack_max);
183 PERL_UNUSED_ARG(mark_min);
184 PERL_UNUSED_ARG(mark_max);
185 #endif /* DEBUGGING */
192 Dump the current stack
200 #ifndef SKIP_DEBUGGING
201 if (CopSTASH_eq(PL_curcop, PL_debstash) && !DEBUG_J_TEST_)
204 PerlIO_printf(Perl_debug_log, " => ");
205 deb_stack_n(PL_stack_base,
207 PL_stack_sp - PL_stack_base,
208 PL_curstackinfo->si_markoff,
209 PL_markstack_ptr - PL_markstack);
212 #endif /* SKIP_DEBUGGING */
218 static const char * const si_names[] = {
234 /* display all stacks */
238 Perl_deb_stack_all(pTHX)
244 /* rewind to start of chain */
245 si = PL_curstackinfo;
252 const size_t si_name_ix = si->si_type+1; /* -1 is a valid index */
253 const char * const si_name =
254 si_name_ix < C_ARRAY_LENGTH(si_names) ?
255 si_names[si_name_ix] : "????";
257 PerlIO_printf(Perl_debug_log, "STACK %" IVdf ": %s\n",
260 for (ix=0; ix<=si->si_cxix; ix++) {
262 const PERL_CONTEXT * const cx = &(si->si_cxstack[ix]);
263 PerlIO_printf(Perl_debug_log,
264 " CX %" IVdf ": %-6s => ",
265 (IV)ix, PL_block_type[CxTYPE(cx)]
267 /* substitution contexts don't save stack pointers etc) */
268 if (CxTYPE(cx) == CXt_SUBST)
269 PerlIO_printf(Perl_debug_log, "\n");
272 /* Find the current context's stack range by searching
273 * forward for any higher contexts using this stack; failing
274 * that, it will be equal to the size of the stack for old
275 * stacks, or PL_stack_sp for the current stack
278 I32 i, stack_min, stack_max, mark_min, mark_max;
279 const PERL_CONTEXT *cx_n = NULL;
282 /* there's a separate argument stack per SI, so only
285 for (i=ix+1; i<=si->si_cxix; i++) {
286 const PERL_CONTEXT *this_cx = &(si->si_cxstack[i]);
287 if (CxTYPE(this_cx) == CXt_SUBST)
293 stack_min = cx->blk_oldsp;
296 stack_max = cx_n->blk_oldsp;
298 else if (si == PL_curstackinfo) {
299 stack_max = PL_stack_sp - AvARRAY(si->si_stack);
302 stack_max = AvFILLp(si->si_stack);
305 /* for the markstack, there's only one stack shared
313 if (i > si_n->si_cxix) {
314 if (si_n == PL_curstackinfo)
317 si_n = si_n->si_next;
321 if (CxTYPE(&(si_n->si_cxstack[i])) == CXt_SUBST)
323 cx_n = &(si_n->si_cxstack[i]);
327 mark_min = cx->blk_oldmarksp;
329 mark_max = cx_n->blk_oldmarksp;
332 mark_max = PL_markstack_ptr - PL_markstack;
335 deb_stack_n(AvARRAY(si->si_stack),
336 stack_min, stack_max, mark_min, mark_max);
338 if (CxTYPE(cx) == CXt_EVAL || CxTYPE(cx) == CXt_SUB
339 || CxTYPE(cx) == CXt_FORMAT)
341 const OP * const retop = cx->blk_sub.retop;
343 PerlIO_printf(Perl_debug_log, " retop=%s\n",
344 retop ? OP_NAME(retop) : "(null)"
351 if (si == PL_curstackinfo)
356 break; /* shouldn't happen, but just in case.. */
357 } /* next stackinfo */
359 PerlIO_printf(Perl_debug_log, "\n");
362 #endif /* DEBUGGING */
366 * ex: set ts=8 sts=4 sw=4 et: