remove deprecation notice for TT #449
[parrot.git] / src / parrot_debugger.c
blob0d98101f9e293722a97262813bf63dd3d261e186
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 opcocde, 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 #include <stdio.h>
140 #include <stdlib.h>
141 #include <string.h>
142 #include <ctype.h>
143 #include "parrot/parrot.h"
144 #include "parrot/embed.h"
145 #include "parrot/debugger.h"
146 #include "parrot/runcore_api.h"
148 static void PDB_printwelcome(void);
149 static void PDB_run_code(PARROT_INTERP, int argc, const char *argv[]);
153 =item C<int main(int argc, const char *argv[])>
155 Reads the PIR, PASM or PBC file from argv[1], loads it, and then calls
156 Parrot_debug().
158 =cut
163 main(int argc, const char *argv[])
165 int nextarg;
166 Parrot_Interp interp;
167 PDB_t *pdb;
168 const char *scriptname = NULL;
170 Parrot_set_config_hash();
172 interp = Parrot_new(NULL);
174 Parrot_set_executable_name(interp, Parrot_str_new(interp, argv[0], 0));
176 Parrot_debugger_init(interp);
178 pdb = interp->pdb;
180 /*Parrot_set_config_hash(); TODO link with cfg */
182 pdb->state = PDB_ENTER;
184 Parrot_block_GC_mark(interp);
185 Parrot_block_GC_sweep(interp);
187 nextarg = 1;
188 if (argv[nextarg] && strcmp(argv[nextarg], "--script") == 0)
190 scriptname = argv [++nextarg];
191 ++nextarg;
194 if (argv[nextarg]) {
195 const char *filename = argv[nextarg];
196 const char *ext = strrchr(filename, '.');
198 if (ext && STREQ(ext, ".pbc")) {
199 Parrot_PackFile pf = Parrot_pbc_read(interp, filename, 0);
201 if (!pf)
202 return 1;
204 Parrot_pbc_load(interp, pf);
205 PackFile_fixup_subs(interp, PBC_MAIN, NULL);
207 else {
208 STRING *errmsg = NULL;
209 Parrot_PackFile pf = PackFile_new(interp, 0);
211 Parrot_pbc_load(interp, pf);
212 Parrot_compile_file(interp, filename, &errmsg);
213 if (errmsg)
214 Parrot_ex_throw_from_c_args(interp, NULL, 1, "%S", errmsg);
215 PackFile_fixup_subs(interp, PBC_POSTCOMP, NULL);
217 /* load the source for debugger list */
218 PDB_load_source(interp, filename);
220 PackFile_fixup_subs(interp, PBC_MAIN, NULL);
224 else {
225 /* Generate some code to be able to enter into runloop */
227 STRING *compiler = Parrot_str_new_constant(interp, "PIR");
228 STRING *errstr = NULL;
229 const char source []= ".sub aux :main\nexit 0\n.end\n";
230 Parrot_compile_string(interp, compiler, source, &errstr);
232 if (!Parrot_str_is_null(interp, errstr))
233 Parrot_io_eprintf(interp, "%Ss\n", errstr);
236 Parrot_unblock_GC_mark(interp);
237 Parrot_unblock_GC_sweep(interp);
239 if (scriptname)
240 PDB_script_file(interp, scriptname);
241 else
242 PDB_printwelcome();
244 Parrot_runcore_switch(interp, Parrot_str_new_constant(interp, "debugger"));
245 PDB_run_code(interp, argc - nextarg, argv + nextarg);
247 Parrot_exit(interp, 0);
252 =item C<static void PDB_run_code(PARROT_INTERP, int argc, const char *argv[])>
254 Run the code, catching exceptions if they are left unhandled.
256 =cut
260 static void
261 PDB_run_code(PARROT_INTERP, int argc, const char *argv[])
263 new_runloop_jump_point(interp);
264 if (setjmp(interp->current_runloop->resume)) {
265 free_runloop_jump_point(interp);
266 fprintf(stderr, "Caught exception\n");
267 return;
270 /* Loop to avoid exiting at program end */
271 do {
272 Parrot_runcode(interp, argc, argv);
273 interp->pdb->state |= PDB_STOPPED;
274 } while (! (interp->pdb->state & PDB_EXIT));
275 free_runloop_jump_point(interp);
280 =item C<static void PDB_printwelcome(void)>
282 Prints out the welcome string.
284 =cut
288 static void
289 PDB_printwelcome(void)
291 fprintf(stderr,
292 "Parrot " PARROT_VERSION " Debugger\n"
293 "\nPlease note: the debugger is currently under reconstruction\n");
298 =back
300 =head1 SEE ALSO
302 F<src/debug.c>, F<include/parrot/debug.h>.
304 =head1 HISTORY
306 =over 4
308 =item * Initial version by Daniel Grunblatt on 2002.5.19.
310 =item * Start of rewrite - leo 2005.02.16
312 The debugger now uses its own interpreter. User code is run in
313 Interp* debugee. We have:
315 debug_interp->pdb->debugee->debugger
318 +------------- := -----------+
320 Debug commands are mostly run inside the C<debugger>. User code
321 runs of course in the C<debugee>.
323 =back
325 =head1 TODO
327 =over 4
329 =item * Check the user input for bad commands, it's quite easy to make
330 it bang now, try listing the source before loading or disassembling it.
332 =item * Print the interpreter info.
334 =item * Make the user interface better (add comands
335 history/completion).
337 =item * Some other things I don't remember now because it's late.
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: