2 Copyright (C) 2001-2010, Parrot Foundation.
7 parrot_debugger - The Parrot Debugger
15 parrot_debugger programfile
16 parrot_debugger --script scriptfile programfile
24 Disassemble the bytecode.
26 Use this if you have a PBC file but not the PASM.
30 Load a source code file.
34 List the source code file.
40 =item C<break> or C<b>
42 Add a breakpoint at the line number given or the current line if none is given.
48 Breakpoint 1 at pos 10
50 =item C<watch> or C<w>
54 =item C<delete> or C<d>
56 Given a number n, deletes the n-th breakpoint. To delete the first breakpoint:
67 Reenable a disabled breakpoint.
69 =item C<continue> or C<c>
71 Continue the program execution.
75 Run the next instruction
81 =item C<trace> or C<t>
83 Trace the next instruction. This is equivalent to printing the source of the
84 next instruction and then executing it.
86 =item C<print> or C<p>
88 Print an interpreter register. If a register I0 has been used, this
94 If no register number is given then all registers of that type will be printed.
95 If the two registers I0 and I1 have been used, then this would look like:
101 It would be nice if "p" with no arguments printed all registers, but this is
102 currently not the case.
104 =item C<stack> or C<s>
110 Print interpreter information relating to memory allocation and garbage
115 Toggle garbage collection debugging mode. In gcdebug mode a garbage collection
116 cycle is run before each opcode, which is the same as using the gcdebug core.
118 =item C<quit> or C<q>
122 =item C<help> or C<h>
130 You can also debug Parrot code by using the C<debug_init>, C<debug_load>
131 and C<debug_break> ops in F<ops/debug.ops>.
139 #define PARROT_IN_EXTENSION
145 #include "parrot/parrot.h"
146 #include "parrot/embed.h"
147 #include "parrot/debugger.h"
148 #include "parrot/runcore_api.h"
150 static void PDB_printwelcome(void);
151 static void PDB_run_code(PARROT_INTERP
, int argc
, const char *argv
[]);
155 =item C<int main(int argc, const char *argv[])>
157 Reads the PIR, PASM, or PBC file from argv[1], loads it, and then calls
165 main(int argc
, const char *argv
[])
168 Parrot_Interp interp
;
170 const char *scriptname
= NULL
;
172 Parrot_set_config_hash();
174 interp
= Parrot_new(NULL
);
176 Parrot_set_executable_name(interp
, Parrot_str_new(interp
, argv
[0], 0));
178 Parrot_debugger_init(interp
);
182 /*Parrot_set_config_hash(); TODO link with cfg */
184 pdb
->state
= PDB_ENTER
;
186 Parrot_block_GC_mark(interp
);
187 Parrot_block_GC_sweep(interp
);
190 if (argv
[nextarg
] && strcmp(argv
[nextarg
], "--script") == 0)
192 scriptname
= argv
[++nextarg
];
197 const char *filename
= argv
[nextarg
];
198 const char *ext
= strrchr(filename
, '.');
200 if (ext
&& STREQ(ext
, ".pbc")) {
201 Parrot_PackFile pf
= Parrot_pbc_read(interp
, filename
, 0);
206 Parrot_pbc_load(interp
, pf
);
207 PackFile_fixup_subs(interp
, PBC_MAIN
, NULL
);
210 STRING
*errmsg
= NULL
;
211 Parrot_PackFile pf
= PackFile_new(interp
, 0);
213 Parrot_pbc_load(interp
, pf
);
214 Parrot_compile_file(interp
, filename
, &errmsg
);
216 Parrot_ex_throw_from_c_args(interp
, NULL
, 1, "%S", errmsg
);
217 PackFile_fixup_subs(interp
, PBC_POSTCOMP
, NULL
);
219 /* load the source for debugger list */
220 PDB_load_source(interp
, filename
);
222 PackFile_fixup_subs(interp
, PBC_MAIN
, NULL
);
227 /* Generate some code to be able to enter into runloop */
229 STRING
*compiler
= Parrot_str_new_constant(interp
, "PIR");
230 STRING
*errstr
= NULL
;
231 const char source
[]= ".sub aux :main\nexit 0\n.end\n";
232 Parrot_compile_string(interp
, compiler
, source
, &errstr
);
234 if (!STRING_IS_NULL(errstr
))
235 Parrot_io_eprintf(interp
, "%Ss\n", errstr
);
238 Parrot_unblock_GC_mark(interp
);
239 Parrot_unblock_GC_sweep(interp
);
242 PDB_script_file(interp
, scriptname
);
246 Parrot_runcore_switch(interp
, Parrot_str_new_constant(interp
, "debugger"));
247 PDB_run_code(interp
, argc
- nextarg
, argv
+ nextarg
);
249 Parrot_exit(interp
, 0);
255 =item C<static void PDB_run_code(PARROT_INTERP, int argc, const char *argv[])>
257 Runs the code, catching exceptions if they are left unhandled.
264 PDB_run_code(PARROT_INTERP
, int argc
, const char *argv
[])
266 new_runloop_jump_point(interp
);
267 if (setjmp(interp
->current_runloop
->resume
)) {
268 free_runloop_jump_point(interp
);
269 fprintf(stderr
, "Caught exception\n");
273 /* Loop to avoid exiting at program end */
275 Parrot_runcode(interp
, argc
, argv
);
276 interp
->pdb
->state
|= PDB_STOPPED
;
277 } while (! (interp
->pdb
->state
& PDB_EXIT
));
278 free_runloop_jump_point(interp
);
284 =item C<static void PDB_printwelcome(void)>
286 Prints out the welcome string.
293 PDB_printwelcome(void)
296 "Parrot " PARROT_VERSION
" Debugger\n"
297 "(Please note: the debugger is currently under reconstruction)\n");
306 F<src/debug.c>, F<include/parrot/debug.h>.
312 =item * Initial version by Daniel Grunblatt on 2002.5.19.
314 =item * Start of rewrite - leo 2005.02.16
316 The debugger now uses its own interpreter. User code is run in
317 Interp* debugee. We have:
319 debug_interp->pdb->debugee->debugger
322 +------------- := -----------+
324 Debug commands are mostly run inside the C<debugger>. User code
325 runs of course in the C<debugee>.
333 =item * Check the user input for bad commands, it's quite easy to make
334 it bang now, try listing the source before loading or disassembling it.
336 =item * Print the interpreter info.
338 =item * Make the user interface better (add command history/completion).
344 Renamed from F<pdb.c> on 2008.7.15
353 * c-file-style: "parrot"
355 * vim: expandtab shiftwidth=4: