fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / src / parrot_debugger.c
blob5cbf1e8fc6c7f879a1a39cc09c75d267791786a8
1 /*
2 Copyright (C) 2001-2010, Parrot Foundation.
3 $Id$
5 =head1 NAME
7 parrot_debugger - The Parrot Debugger
9 =head1 DESCRIPTION
11 The Parrot debugger
13 =head1 SYNOPSIS
15 parrot_debugger programfile
16 parrot_debugger --script scriptfile programfile
18 =head1 COMMANDS
20 =over 4
22 =item C<disassemble>
24 Disassemble the bytecode.
26 Use this if you have a PBC file but not the PASM.
28 =item C<load>
30 Load a source code file.
32 =item C<list> or C<l>
34 List the source code file.
36 =item C<run> or C<r>
38 Run the program.
40 =item C<break> or C<b>
42 Add a breakpoint at the line number given or the current line if none is given.
44 (pdb) b
45 Breakpoint 1 at pos 0
47 (pdb) b 10
48 Breakpoint 1 at pos 10
50 =item C<watch> or C<w>
52 Add a watchpoint.
54 =item C<delete> or C<d>
56 Given a number n, deletes the n-th breakpoint. To delete the first breakpoint:
58 (pdb) d 1
59 Breakpoint 1 deleted
61 =item C<disable>
63 Disable a breakpoint.
65 =item C<enable>
67 Reenable a disabled breakpoint.
69 =item C<continue> or C<c>
71 Continue the program execution.
73 =item C<next> or C<n>
75 Run the next instruction
77 =item C<eval> or C<e>
79 Run an 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
89 would look like:
91 (pdb) p I0
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:
97 (pdb) p I
98 I0 = 2
99 I1 = 5
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>
106 Examine the stack.
108 =item C<info>
110 Print interpreter information relating to memory allocation and garbage
111 collection.
113 =item C<gcdebug>
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>
120 Exit the debugger.
122 =item C<help> or C<h>
124 Print the help.
126 =back
128 =head2 Debug Ops
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>.
133 =over 4
135 =cut
139 #define PARROT_IN_EXTENSION
141 #include <stdio.h>
142 #include <stdlib.h>
143 #include <string.h>
144 #include <ctype.h>
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
158 Parrot_debug().
160 =cut
165 main(int argc, const char *argv[])
167 int nextarg;
168 Parrot_Interp interp;
169 PDB_t *pdb;
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);
180 pdb = interp->pdb;
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);
189 nextarg = 1;
190 if (argv[nextarg] && strcmp(argv[nextarg], "--script") == 0)
192 scriptname = argv [++nextarg];
193 ++nextarg;
196 if (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);
203 if (!pf)
204 return 1;
206 Parrot_pbc_load(interp, pf);
207 PackFile_fixup_subs(interp, PBC_MAIN, NULL);
209 else {
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);
215 if (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);
226 else {
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);
241 if (scriptname)
242 PDB_script_file(interp, scriptname);
243 else
244 PDB_printwelcome();
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.
259 =cut
263 static void
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");
270 return;
273 /* Loop to avoid exiting at program end */
274 do {
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.
288 =cut
292 static void
293 PDB_printwelcome(void)
295 fprintf(stderr,
296 "Parrot " PARROT_VERSION " Debugger\n"
297 "(Please note: the debugger is currently under reconstruction)\n");
302 =back
304 =head1 SEE ALSO
306 F<src/debug.c>, F<include/parrot/debug.h>.
308 =head1 HISTORY
310 =over 4
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>.
327 =back
329 =head1 TODO
331 =over 4
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).
340 =back
342 =head1 HISTORY
344 Renamed from F<pdb.c> on 2008.7.15
346 =cut
352 * Local variables:
353 * c-file-style: "parrot"
354 * End:
355 * vim: expandtab shiftwidth=4: