|
|
1.1 root 1: /* Everything about breakpoints, for GDB.
2: Copyright (C) 1986, 1987 Free Software Foundation, Inc.
3:
4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
5: WARRANTY. No author or distributor accepts responsibility to anyone
6: for the consequences of using it or for whether it serves any
7: particular purpose or works at all, unless he says so in writing.
8: Refer to the GDB General Public License for full details.
9:
10: Everyone is granted permission to copy, modify and redistribute GDB,
11: but only under the conditions described in the GDB General Public
12: License. A copy of this license is supposed to have been given to you
13: along with GDB so you can know your rights and responsibilities. It
14: should be in a file named COPYING. Among other things, the copyright
15: notice and this notice must be preserved on all copies.
16:
17: In other words, go ahead and share GDB, but don't try to stop
18: anyone else from sharing it farther. Help stamp out software hoarding!
19: */
20:
21: #include "defs.h"
22: #include "initialize.h"
23: #include "param.h"
24: #include "symtab.h"
25: #include "frame.h"
26:
27: #include <stdio.h>
28:
29: /* This is the sequence of bytes we insert for a breakpoint. */
30:
31: static char break_insn[] = BREAKPOINT;
32:
33: /* States of enablement of breakpoint.
34: `temporary' means disable when hit.
35: `once' means delete when hit. */
36:
37: enum enable { disabled, enabled, temporary, delete};
38:
39: struct breakpoint
40: {
41: struct breakpoint *next;
42: /* Number assigned to distinguish breakpoints. */
43: int number;
44: /* Address to break at. */
45: CORE_ADDR address;
46: /* Line number of this address. Redundant. */
47: int line_number;
48: /* Symtab of file of this address. Redundant. */
49: struct symtab *symtab;
50: /* Zero means disabled; remember the info but don't break here. */
51: enum enable enable;
52: /* Number of stops at this breakpoint that should
53: be continued automatically before really stopping. */
54: int ignore_count;
55: /* "Real" contents of byte where breakpoint has been inserted.
56: Valid only when breakpoints are in the program. */
57: char shadow_contents[sizeof break_insn];
58: /* Nonzero if this breakpoint is now inserted. */
59: char inserted;
60: /* Nonzero if this is not the first breakpoint in the list
61: for the given address. */
62: char duplicate;
63: /* Chain of command lines to execute when this breakpoint is hit. */
64: struct command_line *commands;
65: /* Stack depth (frame). If nonzero, break only if fp equals this. */
66: FRAME frame;
67: /* Conditional. Break only if this expression's value is nonzero. */
68: struct expression *cond;
69: };
70:
71: #define ALL_BREAKPOINTS(b) for (b = breakpoint_chain; b; b = b->next)
72:
73: /* Chain of all breakpoints defined. */
74:
75: struct breakpoint *breakpoint_chain;
76:
77: /* Number of last breakpoint made. */
78:
79: static int breakpoint_count;
80:
81: /* Default address, symtab and line to put a breakpoint at
82: for "break" command with no arg.
83: if default_breakpoint_valid is zero, the other three are
84: not valid, and "break" with no arg is an error.
85:
86: This set by print_stack_frame, which calls set_default_breakpoint. */
87:
88: int default_breakpoint_valid;
89: CORE_ADDR default_breakpoint_address;
90: struct symtab *default_breakpoint_symtab;
91: int default_breakpoint_line;
92:
93: /* Remaining commands (not yet executed)
94: of last breakpoint hit. */
95:
96: struct command_line *breakpoint_commands;
97:
98: START_FILE
99:
100: extern char *read_line ();
101:
102: static void delete_breakpoint ();
103: void clear_momentary_breakpoints ();
104: void breakpoint_auto_delete ();
105:
106: /* condition N EXP -- set break condition of breakpoint N to EXP. */
107:
108: static void
109: condition_command (arg, from_tty)
110: char *arg;
111: int from_tty;
112: {
113: register struct breakpoint *b;
114: register char *p;
115: register int bnum;
116: register struct expression *expr;
117:
118: if (arg == 0)
119: error_no_arg ("breakpoint number");
120:
121: p = arg;
122: while (*p >= '0' && *p <= '9') p++;
123: bnum = atoi (arg);
124:
125: ALL_BREAKPOINTS (b)
126: if (b->number == bnum)
127: {
128: if (b->cond)
129: free (b->cond);
130: if (*p == 0)
131: {
132: b->cond = 0;
133: if (from_tty)
134: printf ("Breakpoint %d now unconditional.\n", bnum);
135: }
136: else
137: {
138: if (*p != ' ' && *p != '\t')
139: error ("Arguments must be an integer (breakpoint number) and an expression.");
140:
141: /* Find start of expression */
142: while (*p == ' ' || *p == '\t') p++;
143:
144: arg = p;
145: b->cond = (struct expression *) parse_c_1 (&arg, block_for_pc (b->address));
146: }
147: return;
148: }
149:
150: error ("No breakpoint number %d.", bnum);
151: }
152:
153: static void
154: commands_command (arg)
155: char *arg;
156: {
157: register struct breakpoint *b;
158: register char *p, *p1;
159: register int bnum;
160: struct command_line *l;
161:
162: if (arg == 0)
163: error_no_arg ("breakpoint number");
164:
165: /* If we allowed this, we would have problems with when to
166: free the storage, if we change the commands currently
167: being read from. */
168:
169: if (breakpoint_commands)
170: error ("Can't use the \"commands\" command among a breakpoint's commands.");
171:
172: p = arg;
173: if (! (*p >= '0' && *p <= '9'))
174: error ("Argument must be integer (a breakpoint number).");
175:
176: while (*p >= '0' && *p <= '9') p++;
177: if (*p)
178: error ("Unexpected extra arguments following breakpoint number.");
179:
180: bnum = atoi (arg);
181:
182: ALL_BREAKPOINTS (b)
183: if (b->number == bnum)
184: {
185: if (input_from_terminal_p ())
186: printf ("Type commands for when breakpoint %d is hit, one per line.\n\
187: End with a line saying just \"end\".\n", bnum);
188: l = read_command_lines ();
189: free_command_lines (&b->commands);
190: b->commands = l;
191: return;
192: }
193: error ("No breakpoint number %d.", bnum);
194: }
195:
196: /* Called from command loop to execute the commands
197: associated with the breakpoint we just stopped at. */
198:
199: void
200: do_breakpoint_commands ()
201: {
202: while (breakpoint_commands)
203: {
204: execute_command (breakpoint_commands->line, 0);
205: /* If command was "cont", breakpoint_commands is 0 now. */
206: if (breakpoint_commands)
207: breakpoint_commands = breakpoint_commands->next;
208: }
209: clear_momentary_breakpoints ();
210: }
211:
212: /* Used when the program is proceeded, to eliminate any remaining
213: commands attached to the previous breakpoint we stopped at. */
214:
215: void
216: clear_breakpoint_commands ()
217: {
218: breakpoint_commands = 0;
219: breakpoint_auto_delete (0);
220: }
221:
222: /* insert_breakpoints is used when starting or continuing the program.
223: remove_breakpoints is used when the program stops.
224: Both return zero if successful, 1 if could not write the inferior. */
225:
226: int
227: insert_breakpoints ()
228: {
229: register struct breakpoint *b;
230:
231: /* printf ("Inserting breakpoints.\n"); */
232: ALL_BREAKPOINTS (b)
233: if (b->enable != disabled && ! b->inserted && ! b->duplicate)
234: {
235: read_memory (b->address, b->shadow_contents, sizeof break_insn);
236: if (write_memory (b->address, break_insn, sizeof break_insn))
237: return 1;
238: /* printf ("Inserted breakpoint at 0x%x, shadow 0x%x, 0x%x.\n",
239: b->address, b->shadow_contents[0], b->shadow_contents[1]); */
240: b->inserted = 1;
241: }
242: return 0;
243: }
244:
245: int
246: remove_breakpoints ()
247: {
248: register struct breakpoint *b;
249:
250: /* printf ("Removing breakpoints.\n"); */
251: ALL_BREAKPOINTS (b)
252: if (b->inserted)
253: {
254: if (write_memory (b->address, b->shadow_contents, sizeof break_insn))
255: return 1;
256: b->inserted = 0;
257: /* printf ("Removed breakpoint at 0x%x, shadow 0x%x, 0x%x.\n",
258: b->address, b->shadow_contents[0], b->shadow_contents[1]); */
259: }
260:
261: return 0;
262: }
263:
264: /* Clear the "inserted" flag in all breakpoints.
265: This is done when the inferior is loaded. */
266:
267: int
268: mark_breakpoints_out ()
269: {
270: register struct breakpoint *b;
271:
272: ALL_BREAKPOINTS (b)
273: b->inserted = 0;
274: }
275:
276: /* breakpoint_here_p (PC) returns 1 if an enabled breakpoint exists at PC.
277: When continuing from a location with a breakpoint,
278: we actually single step once before calling insert_breakpoints. */
279:
280: int
281: breakpoint_here_p (pc)
282: CORE_ADDR pc;
283: {
284: register struct breakpoint *b;
285:
286: ALL_BREAKPOINTS (b)
287: if (b->enable != disabled && b->address == pc)
288: return 1;
289:
290: return 0;
291: }
292:
293: /* Return 0 if PC is not the address just after a breakpoint,
294: or -1 if breakpoint says do not stop now,
295: or -2 if breakpoint says it has deleted itself and don't stop,
296: or -3 if hit a breakpoint number -3 (delete when program stops),
297: or else the number of the breakpoint,
298: with 0x1000000 added for a silent breakpoint. */
299:
300: int
301: breakpoint_stop_status (pc, frame)
302: CORE_ADDR pc;
303: FRAME frame;
304: {
305: register struct breakpoint *b;
306: register int cont = 0;
307:
308: /* Get the address where the breakpoint would have been. */
309: pc -= DECR_PC_AFTER_BREAK;
310:
311: ALL_BREAKPOINTS (b)
312: if (b->enable != disabled && b->address == pc)
313: {
314: if (b->frame && b->frame != frame)
315: cont = -1;
316: else
317: {
318: int value_zero;
319: if (b->cond)
320: {
321: value_zero = value_zerop (evaluate_expression (b->cond));
322: free_all_values ();
323: }
324: if (b->cond && value_zero)
325: {
326: cont = -1;
327: }
328: else if (b->ignore_count > 0)
329: {
330: b->ignore_count--;
331: cont = -1;
332: }
333: else
334: {
335: if (b->enable == temporary)
336: b->enable = disabled;
337: breakpoint_commands = b->commands;
338: if (breakpoint_commands
339: && !strcmp ("silent", breakpoint_commands->line))
340: {
341: breakpoint_commands = breakpoint_commands->next;
342: return 0x1000000 + b->number;
343: }
344: return b->number;
345: }
346: }
347: }
348:
349: return cont;
350: }
351:
352: static void
353: breakpoint_1 (bnum)
354: int bnum;
355: {
356: register struct breakpoint *b;
357: register struct command_line *l;
358: register struct symbol *sym;
359: CORE_ADDR last_addr = -1;
360:
361: ALL_BREAKPOINTS (b)
362: if (bnum == -1 || bnum == b->number)
363: {
364: printf ("#%-3d %c 0x%08x ", b->number,
365: "nyod"[(int) b->enable],
366: b->address);
367: last_addr = b->address;
368: if (b->symtab)
369: {
370: sym = find_pc_function (b->address);
371: if (sym)
372: printf (" in %s (%s line %d)", SYMBOL_NAME (sym),
373: b->symtab->filename, b->line_number);
374: else
375: printf ("%s line %d", b->symtab->filename, b->line_number);
376: }
377: printf ("\n");
378:
379: if (b->ignore_count)
380: printf ("\tignore next %d hits\n", b->ignore_count);
381: if (b->frame)
382: printf ("\tstop only in stack frame at 0x%x\n", b->frame);
383: if (b->cond)
384: {
385: printf ("\tbreak only if ");
386: print_expression (b->cond, stdout);
387: printf ("\n");
388: }
389: if (l = b->commands)
390: while (l)
391: {
392: printf ("\t%s\n", l->line);
393: l = l->next;
394: }
395: }
396:
397: if (last_addr != -1)
398: set_next_address (last_addr);
399: }
400:
401: static void
402: breakpoints_info (bnum_exp)
403: char *bnum_exp;
404: {
405: int bnum = -1;
406:
407: if (bnum_exp)
408: bnum = parse_and_eval_address (bnum_exp);
409: else if (breakpoint_chain == 0)
410: printf ("No breakpoints.\n");
411: else
412: printf ("Breakpoints:\n\
413: Num Enb Address Where\n");
414:
415: breakpoint_1 (bnum);
416: }
417:
418: void
419: set_default_breakpoint (valid, addr, symtab, line)
420: int valid;
421: CORE_ADDR addr;
422: struct symtab *symtab;
423: int line;
424: {
425: default_breakpoint_valid = valid;
426: default_breakpoint_address = addr;
427: default_breakpoint_symtab = symtab;
428: default_breakpoint_line = line;
429: }
430:
431: /* Rescan breakpoints at address ADDRESS,
432: marking the first one as "first" and any others as "duplicates".
433: This is so that the bpt instruction is only inserted once. */
434:
435: static void
436: check_duplicates (address)
437: CORE_ADDR address;
438: {
439: register struct breakpoint *b;
440: register int count = 0;
441:
442: ALL_BREAKPOINTS (b)
443: if (b->enable != disabled && b->address == address)
444: {
445: count++;
446: b->duplicate = count > 1;
447: }
448: }
449:
450: /* Low level routine to set a breakpoint.
451: Takes as args the three things that every breakpoint must have.
452: Returns the breakpoint object so caller can set other things.
453: Does not set the breakpoint number!
454: Does not print anything. */
455:
456: static struct breakpoint *
457: set_raw_breakpoint (sal)
458: struct symtab_and_line sal;
459: {
460: register struct breakpoint *b, *b1;
461:
462: b = (struct breakpoint *) xmalloc (sizeof (struct breakpoint));
463: bzero (b, sizeof *b);
464: b->address = sal.pc;
465: b->symtab = sal.symtab;
466: b->line_number = sal.line;
467: b->enable = enabled;
468: b->next = 0;
469:
470: /* Add this breakpoint to the end of the chain
471: so that a list of breakpoints will come out in order
472: of increasing numbers. */
473:
474: b1 = breakpoint_chain;
475: if (b1 == 0)
476: breakpoint_chain = b;
477: else
478: {
479: while (b1->next)
480: b1 = b1->next;
481: b1->next = b;
482: }
483:
484: check_duplicates (sal.pc);
485:
486: return b;
487: }
488:
489: /* Set a breakpoint that will evaporate an end of command
490: at address specified by SAL.
491: Restrict it to frame FRAME if FRAME is nonzero. */
492:
493: void
494: set_momentary_breakpoint (sal, frame)
495: struct symtab_and_line sal;
496: FRAME frame;
497: {
498: register struct breakpoint *b;
499: b = set_raw_breakpoint (sal);
500: b->number = -3;
501: b->enable = delete;
502: b->frame = frame;
503: }
504:
505: void
506: clear_momentary_breakpoints ()
507: {
508: register struct breakpoint *b;
509: ALL_BREAKPOINTS (b)
510: if (b->number == -3)
511: {
512: delete_breakpoint (b);
513: break;
514: }
515: }
516:
517: /* Set a breakpoint according to ARG (function, linenum or *address)
518: and make it temporary if TEMPFLAG is nonzero. */
519:
520: static void
521: break_command_1 (arg, tempflag, from_tty)
522: char *arg;
523: int tempflag, from_tty;
524: {
525: struct symtab_and_line sal;
526: register struct expression *cond = 0;
527: register struct breakpoint *b;
528:
529: sal.pc = 0;
530:
531: if (arg)
532: {
533: sal = decode_line_1 (&arg, 1, 0, 0);
534:
535: if (sal.pc == 0 && sal.symtab != 0)
536: {
537: sal.pc = find_line_pc (sal.symtab, sal.line);
538: if (sal.pc == 0)
539: error ("No line %d in file \"%s\".",
540: sal.line, sal.symtab->filename);
541: }
542:
543: while (*arg)
544: {
545: if (arg[0] == 'i' && arg[1] == 'f'
546: && (arg[2] == ' ' || arg[2] == '\t'))
547: cond = (struct expression *) parse_c_1 ((arg += 2, &arg),
548: block_for_pc (sal.pc));
549: else
550: error ("Junk at end of arguments.");
551: }
552: }
553: else if (default_breakpoint_valid)
554: {
555: sal.pc = default_breakpoint_address;
556: sal.line = default_breakpoint_line;
557: sal.symtab = default_breakpoint_symtab;
558: }
559: else
560: error ("No default breakpoint address now.");
561:
562: b = set_raw_breakpoint (sal);
563: b->number = ++breakpoint_count;
564: b->cond = cond;
565: if (tempflag)
566: b->enable = temporary;
567:
568: printf ("Breakpoint %d at 0x%x", b->number, b->address);
569: if (b->symtab)
570: printf (": file %s, line %d.", b->symtab->filename, b->line_number);
571: printf ("\n");
572:
573: if (from_tty)
574: {
575: int others = 0;
576: ALL_BREAKPOINTS (b)
577: if (b->address == sal.pc && b->number != breakpoint_count)
578: others++;
579: if (others > 0)
580: {
581: printf ("Note: breakpoint%s ", (others > 1) ? "s" : "");
582: ALL_BREAKPOINTS (b)
583: if (b->address == sal.pc && b->number != breakpoint_count)
584: {
585: others--;
586: printf ("%d%s%s ",
587: b->number,
588: (b->enable == disabled) ? " (disabled)" : "",
589: (others > 1) ? "," : ((others == 1) ? " and" : ""));
590: }
591: printf (" also set at pc 0x%x\n", sal.pc);
592: }
593: }
594: }
595:
596: static void
597: break_command (arg, from_tty)
598: char *arg;
599: int from_tty;
600: {
601: break_command_1 (arg, 0, from_tty);
602: }
603:
604: static void
605: tbreak_command (arg, from_tty)
606: char *arg;
607: int from_tty;
608: {
609: break_command_1 (arg, 1, from_tty);
610: }
611:
612: static void
613: clear_command (arg, from_tty)
614: char *arg;
615: int from_tty;
616: {
617: register struct breakpoint *b, *b1;
618: struct symtab_and_line sal;
619: register struct breakpoint *found;
620:
621: if (arg)
622: sal = decode_line_spec (arg, 1);
623: else
624: {
625: sal.line = default_breakpoint_line;
626: sal.symtab = default_breakpoint_symtab;
627: sal.pc = 0;
628: if (sal.symtab == 0)
629: error ("No source file specified.");
630: }
631:
632: /* If exact pc given, clear bpts at that pc.
633: But if sal.pc is zero, clear all bpts on specified line. */
634:
635: found = (struct breakpoint *) 0;
636: while (breakpoint_chain
637: && (sal.pc ? breakpoint_chain->address == sal.pc
638: : (breakpoint_chain->symtab == sal.symtab
639: && breakpoint_chain->line_number == sal.line)))
640: {
641: b1 = breakpoint_chain;
642: breakpoint_chain = b1->next;
643: b1->next = found;
644: found = b1;
645: }
646:
647: ALL_BREAKPOINTS (b)
648: while (b->next
649: && (sal.pc ? b->next->address == sal.pc
650: : (b->next->symtab == sal.symtab
651: && b->next->line_number == sal.line)))
652: {
653: b1 = b->next;
654: b->next = b1->next;
655: b1->next = found;
656: found = b1;
657: }
658:
659: if (found == 0)
660: error ("No breakpoint at %s.", arg);
661:
662: if (found->next) from_tty = 1; /* Alwats report if deleted more than one */
663: if (from_tty) printf ("Deleted breakpoint%s ", found->next ? "s" : "");
664: while (found)
665: {
666: if (from_tty) printf ("%d ", found->number);
667: b1 = found->next;
668: delete_breakpoint (found);
669: found = b1;
670: }
671: if (from_tty) putchar ('\n');
672: }
673:
674: /* Delete breakpoint number BNUM if it is a `delete' breakpoint.
675: This is called after breakpoint BNUM has been hit.
676: Also delete any breakpoint numbered -3 unless there are breakpoint
677: commands to be executed. */
678:
679: void
680: breakpoint_auto_delete (bnum)
681: int bnum;
682: {
683: register struct breakpoint *b;
684: if (bnum != 0)
685: ALL_BREAKPOINTS (b)
686: if (b->number == bnum)
687: {
688: if (b->enable == delete)
689: delete_breakpoint (b);
690: break;
691: }
692: if (breakpoint_commands == 0)
693: clear_momentary_breakpoints ();
694: }
695:
696: static void
697: delete_breakpoint (bpt)
698: struct breakpoint *bpt;
699: {
700: register struct breakpoint *b;
701:
702: if (bpt->inserted)
703: write_memory (bpt->address, bpt->shadow_contents, sizeof break_insn);
704:
705: if (breakpoint_chain == bpt)
706: breakpoint_chain = bpt->next;
707:
708: ALL_BREAKPOINTS (b)
709: if (b->next == bpt)
710: {
711: b->next = bpt->next;
712: break;
713: }
714:
715: check_duplicates (bpt->address);
716:
717: free_command_lines (&bpt->commands);
718: if (bpt->cond)
719: free (bpt->cond);
720: free (bpt);
721: }
722:
723: void map_breakpoint_numbers ();
724:
725: static void
726: delete_command (arg, from_tty)
727: char *arg;
728: int from_tty;
729: {
730: register struct breakpoint *b, *b1;
731:
732: if (arg == 0)
733: {
734: if (!from_tty || query ("Delete all breakpoints? "))
735: {
736: /* No arg; clear all breakpoints. */
737: while (breakpoint_chain)
738: delete_breakpoint (breakpoint_chain);
739: }
740: }
741: else
742: map_breakpoint_numbers (arg, delete_breakpoint);
743: }
744:
745: /* Delete all breakpoints.
746: Done when new symtabs are loaded, since the break condition expressions
747: may become invalid, and the breakpoints are probably wrong anyway. */
748:
749: void
750: clear_breakpoints ()
751: {
752: delete_command (0, 0);
753: }
754:
755: /* Set ignore-count of breakpoint number BPTNUM to COUNT.
756: If from_tty is nonzero, it prints a message to that effect,
757: which ends with a period (no newline). */
758:
759: void
760: set_ignore_count (bptnum, count, from_tty)
761: int bptnum, count, from_tty;
762: {
763: register struct breakpoint *b;
764:
765: if (count < 0)
766: count = 0;
767:
768: ALL_BREAKPOINTS (b)
769: if (b->number == bptnum)
770: {
771: b->ignore_count = count;
772: if (!from_tty)
773: return;
774: else if (count == 0)
775: printf ("Will stop next time breakpoint %d is reached.", bptnum);
776: else if (count == 1)
777: printf ("Will ignore next crossing of breakpoint %d.", bptnum);
778: else
779: printf ("Will ignore next %d crossings of breakpoint %d.",
780: count, bptnum);
781: return;
782: }
783:
784: error ("No breakpoint number %d.", bptnum);
785: }
786:
787: /* Command to set ignore-count of breakpoint N to COUNT. */
788:
789: static void
790: ignore_command (args, from_tty)
791: char *args;
792: int from_tty;
793: {
794: register char *p;
795: register int num;
796:
797: p = args;
798: while (*p >= '0' && *p <= '9') p++;
799: if (*p && *p != ' ' && *p != '\t')
800: error ("First argument must be a breakpoint number.");
801:
802: num = atoi (args);
803:
804: if (*p == 0)
805: error ("Second argument (specified ignore-count) is missing.");
806:
807: set_ignore_count (num, parse_and_eval_address (p), from_tty);
808: printf ("\n");
809: }
810:
811: /* Call FUNCTION on each of the breakpoints
812: whose numbers are given in ARGS. */
813:
814: static void
815: map_breakpoint_numbers (args, function)
816: char *args;
817: void (*function) ();
818: {
819: register char *p = args;
820: register char *p1;
821: register int num;
822: register struct breakpoint *b;
823:
824: if (p == 0)
825: error_no_arg ("one or more breakpoint numbers");
826:
827: while (*p)
828: {
829: p1 = p;
830: while (*p1 >= '0' && *p1 <= '9') p1++;
831: if (*p1 && *p1 != ' ' && *p1 != '\t')
832: error ("Arguments must be breakpoint numbers.");
833:
834: num = atoi (p);
835:
836: ALL_BREAKPOINTS (b)
837: if (b->number == num)
838: {
839: function (b);
840: goto win;
841: }
842: printf ("No breakpoint number %d.\n", num);
843: win:
844: p = p1;
845: while (*p == ' ' || *p == '\t') p++;
846: }
847: }
848:
849: static void
850: enable_breakpoint (bpt)
851: struct breakpoint *bpt;
852: {
853: bpt->enable = enabled;
854:
855: check_duplicates (bpt->address);
856: }
857:
858: static void
859: enable_command (args)
860: char *args;
861: {
862: map_breakpoint_numbers (args, enable_breakpoint);
863: }
864:
865: static void
866: disable_breakpoint (bpt)
867: struct breakpoint *bpt;
868: {
869: bpt->enable = disabled;
870:
871: check_duplicates (bpt->address);
872: }
873:
874: static void
875: disable_command (args)
876: char *args;
877: {
878: register struct breakpoint *bpt;
879: if (args == 0)
880: ALL_BREAKPOINTS (bpt)
881: disable_breakpoint (bpt);
882: else
883: map_breakpoint_numbers (args, disable_breakpoint);
884: }
885:
886: static void
887: enable_once_breakpoint (bpt)
888: struct breakpoint *bpt;
889: {
890: bpt->enable = temporary;
891:
892: check_duplicates (bpt->address);
893: }
894:
895: static void
896: enable_once_command (args)
897: char *args;
898: {
899: map_breakpoint_numbers (args, enable_once_breakpoint);
900: }
901:
902: static void
903: enable_delete_breakpoint (bpt)
904: struct breakpoint *bpt;
905: {
906: bpt->enable = delete;
907:
908: check_duplicates (bpt->address);
909: }
910:
911: static void
912: enable_delete_command (args)
913: char *args;
914: {
915: map_breakpoint_numbers (args, enable_delete_breakpoint);
916: }
917:
918:
919: /* Chain containing all defined enable commands. */
920:
921: struct cmd_list_element *enablelist;
922:
923: extern struct cmd_list_element *cmdlist;
924:
925: static
926: initialize ()
927: {
928: breakpoint_chain = 0;
929: breakpoint_count = 0;
930: enablelist = 0;
931:
932: add_com ("ignore", class_breakpoint, ignore_command,
933: "Set ignore-count of breakpoint number N to COUNT.");
934:
935: add_com ("commands", class_breakpoint, commands_command,
936: "Set commands to be executed when a breakpoint is hit.\n\
937: Give breakpoint number as argument after \"commands\".\n\
938: The commands themselves follow starting on the next line.\n\
939: Type a line containing \"end\" to indicate the end of them.\n\
940: Give \"silent\" as the first line to make the breakpoint silent;\n\
941: then no output is printed when it is hit, except what the commands print.");
942:
943: add_com ("condition", class_breakpoint, condition_command,
944: "Specify breakpoint number N to break only if COND is true.\n\
945: N is an integer; COND is a C expression to be evaluated whenever\n\
946: breakpoint N is reached. Actually break only when COND is nonzero.");
947:
948: add_com ("tbreak", class_breakpoint, tbreak_command,
949: "Set a temporary breakpoint. Args like \"break\" command.\n\
950: Like \"break\" except the breakpoint is only enabled temporarily,\n\
951: so it will be disabled when hit. Equivalent to \"break\" followed\n\
952: by using \"enable once\" on the breakpoint number.");
953:
954: add_prefix_cmd ("enable", class_breakpoint, enable_command,
955: "Enable some breakpoints. Give breakpoint numbers as arguments.\n\
956: With no subcommand, breakpoints are enabled until you command otherwise.\n\
957: This is used to cancel the effect of the \"disable\" command.\n\
958: With a subcommand you can enable temporarily.",
959: &enablelist, "enable ", 1, &cmdlist);
960:
961: add_cmd ("delete", 0, enable_delete_command,
962: "Enable breakpoints and delete when hit. Give breakpoint numbers.\n\
963: If a breakpoint is hit while enabled in this fashion, it is deleted.",
964: &enablelist);
965:
966: add_cmd ("once", 0, enable_once_command,
967: "Enable breakpoints for one hit. Give breakpoint numbers.\n\
968: If a breakpoint is hit while enabled in this fashion, it becomes disabled.\n\
969: See the \"tbreak\" command which sets a breakpoint and enables it once.",
970: &enablelist);
971:
972: add_com ("disable", class_breakpoint, disable_command,
973: "Disable some breakpoints. Give breakpoint numbers as arguments.\n\
974: With no arguments, disable all breakpoints.\n\
975: A disabled breakpoint is not forgotten,\n\
976: but it has no effect until enabled again.");
977: add_com_alias ("dis", "disable", class_breakpoint, 1);
978:
979: add_com ("delete", class_breakpoint, delete_command,
980: "Delete breakpoints, specifying breakpoint numbers; or all breakpoints.\n\
981: Arguments are breakpoint numbers with spaces in between.\n\
982: To delete all breakpoints, give no argument.");
983: add_com_alias ("d", "delete", class_breakpoint, 1);
984:
985: add_com ("clear", class_breakpoint, clear_command,
986: "Clear breakpoint at specified line or function.\n\
987: Argument may be line number, function name, or \"*\" and an address.\n\
988: If line number is specified, all breakpoints in that line are cleared.\n\
989: If function is specified, breakpoints at beginning of function are cleared.\n\
990: If an address is specified, breakpoints at that address are cleared.\n\n\
991: With no argument, clears all breakpoints in the line that the selected frame\n\
992: is executing in.\n\
993: \n\
994: See also the \"delete\" command which clears breakpoints by number.");
995:
996: add_com ("break", class_breakpoint, break_command,
997: "Set breakpoint at specified line or function.\n\
998: Argument may be line number, function name, or \"*\" and an address.\n\
999: If line number is specified, break at start of code for that line.\n\
1000: If function is specified, break at start of code for that function.\n\
1001: If an address is specified, break at that exact address.\n\
1002: With no arg, uses current execution address of selected stack frame.\n\
1003: This is useful for breaking on return to a stack frame.\n\
1004: \n\
1005: Multiple breakpoints at one place are permitted, and useful if conditional.\n\
1006: \n\
1007: Do \"help breakpoints\" for info on other commands dealing with breakpoints.");
1008: add_com_alias ("b", "break", class_run, 1);
1009: add_com_alias ("br", "break", class_run, 1);
1010: add_com_alias ("bre", "break", class_run, 1);
1011: add_com_alias ("brea", "break", class_run, 1);
1012:
1013: add_info ("breakpoints", breakpoints_info,
1014: "Status of all breakpoints, or breakpoint number NUMBER.\n\
1015: Second column is \"y\" for enabled breakpoint, \"d\" for disabled,\n\
1016: \"o\" for enabled once (disable when hit), \"d\" for enable but delete when hit.\n\
1017: Then come the address and the file/line number.\n\n\
1018: Convenience variable \"$_\" and default examine address for \"x\"\n\
1019: are set to the address of the last breakpoint listed.");
1020: }
1021:
1022: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.