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 opcocde, 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>.
143 #include "../compilers/imcc/imc.h"
144 #include "../compilers/imcc/parser.h"
145 #include "parrot/embed.h"
146 #include "parrot/debugger.h"
147 #include "parrot/runcore_api.h"
149 static void PDB_printwelcome(void);
150 static void PDB_run_code(PARROT_INTERP
, int argc
, const char *argv
[]);
154 =item C<int main(int argc, const char *argv[])>
156 Reads the PIR, PASM or PBC file from argv[1], loads it, and then calls
164 main(int argc
, const char *argv
[])
167 Parrot_Interp interp
;
169 const char *scriptname
= NULL
;
171 Parrot_set_config_hash();
173 interp
= Parrot_new(NULL
);
175 Parrot_set_executable_name(interp
, Parrot_str_new(interp
, argv
[0], 0));
177 Parrot_debugger_init(interp
);
181 /*Parrot_set_config_hash(); TODO link with cfg */
183 pdb
->state
= PDB_ENTER
;
185 Parrot_block_GC_mark(interp
);
186 Parrot_block_GC_sweep(interp
);
189 if (argv
[nextarg
] && strcmp(argv
[nextarg
], "--script") == 0)
191 scriptname
= argv
[++nextarg
];
196 const char *filename
= argv
[nextarg
];
197 const char *ext
= strrchr(filename
, '.');
199 if (ext
&& STREQ(ext
, ".pbc")) {
200 Parrot_PackFile pf
= Parrot_pbc_read(interp
, filename
, 0);
205 Parrot_pbc_load(interp
, pf
);
206 PackFile_fixup_subs(interp
, PBC_MAIN
, NULL
);
210 Parrot_PackFile pf
= PackFile_new(interp
, 0);
213 do_yylex_init(interp
, &yyscanner
);
215 Parrot_pbc_load(interp
, pf
);
217 IMCC_push_parser_state(interp
);
218 IMCC_INFO(interp
)->state
->file
= mem_sys_strdup(filename
);
220 if (!(imc_yyin_set(fopen(filename
, "r"), yyscanner
))) {
221 IMCC_fatal_standalone(interp
, EXCEPTION_PIO_ERROR
,
222 "Error reading source file %s.\n",
226 if (ext
&& STREQ(ext
, ".pasm"))
229 emit_open(interp
, 1, NULL
);
230 IMCC_INFO(interp
)->state
->pasm_file
= pasm_file
;
231 yyparse(yyscanner
, interp
);
232 imc_compile_all_units(interp
);
234 imc_cleanup(interp
, yyscanner
);
236 fclose(imc_yyin_get(yyscanner
));
237 PackFile_fixup_subs(interp
, PBC_POSTCOMP
, NULL
);
239 /* load the source for debugger list */
240 PDB_load_source(interp
, filename
);
242 PackFile_fixup_subs(interp
, PBC_MAIN
, NULL
);
247 /* Generate some code to be able to enter into runloop */
249 STRING
*compiler
= Parrot_str_new_constant(interp
, "PIR");
250 STRING
*errstr
= NULL
;
251 const char source
[]= ".sub aux :main\nexit 0\n.end\n";
252 Parrot_compile_string(interp
, compiler
, source
, &errstr
);
254 if (!Parrot_str_is_null(interp
, errstr
))
255 Parrot_io_eprintf(interp
, "%Ss\n", errstr
);
258 Parrot_unblock_GC_mark(interp
);
259 Parrot_unblock_GC_sweep(interp
);
262 PDB_script_file(interp
, scriptname
);
266 Parrot_runcore_switch(interp
, Parrot_str_new_constant(interp
, "debugger"));
267 PDB_run_code(interp
, argc
- nextarg
, argv
+ nextarg
);
269 Parrot_exit(interp
, 0);
274 =item C<static void PDB_run_code(PARROT_INTERP, int argc, const char *argv[])>
276 Run the code, catching exceptions if they are left unhandled.
283 PDB_run_code(PARROT_INTERP
, int argc
, const char *argv
[])
285 new_runloop_jump_point(interp
);
286 if (setjmp(interp
->current_runloop
->resume
)) {
287 free_runloop_jump_point(interp
);
288 fprintf(stderr
, "Caught exception\n");
292 /* Loop to avoid exiting at program end */
294 Parrot_runcode(interp
, argc
, argv
);
295 interp
->pdb
->state
|= PDB_STOPPED
;
296 } while (! (interp
->pdb
->state
& PDB_EXIT
));
297 free_runloop_jump_point(interp
);
302 =item C<static void PDB_printwelcome(void)>
304 Prints out the welcome string.
311 PDB_printwelcome(void)
314 "Parrot " PARROT_VERSION
" Debugger\n"
315 "\nPlease note: the debugger is currently under reconstruction\n");
324 F<src/debug.c>, F<include/parrot/debug.h>.
330 =item * Initial version by Daniel Grunblatt on 2002.5.19.
332 =item * Start of rewrite - leo 2005.02.16
334 The debugger now uses it's own interpreter. User code is run in
335 Interp* debugee. We have:
337 debug_interp->pdb->debugee->debugger
340 +------------- := -----------+
342 Debug commands are mostly run inside the C<debugger>. User code
343 runs of course in the C<debugee>.
351 =item * Check the user input for bad commands, it's quite easy to make
352 it bang now, try listing the source before loading or disassembling it.
354 =item * Print the interpreter info.
356 =item * Make the user interface better (add comands
359 =item * Some other things I don't remember now because it's late.
366 Renamed from F<pdb.c> on 2008.7.15
375 * c-file-style: "parrot"
377 * vim: expandtab shiftwidth=4: