Annotation of gdb/breakpoint.c, revision 1.1.1.4

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;
1.1.1.3   root      145:            b->cond = (struct expression *) parse_c_1 (&arg, block_for_pc (b->address), 0);
                    146:            if (*arg)
                    147:              error ("Junk at end of expression");
1.1       root      148:          }
                    149:        return;
                    150:       }
                    151: 
                    152:   error ("No breakpoint number %d.", bnum);
                    153: }
                    154: 
                    155: static void
                    156: commands_command (arg)
                    157:      char *arg;
                    158: {
                    159:   register struct breakpoint *b;
                    160:   register char *p, *p1;
                    161:   register int bnum;
                    162:   struct command_line *l;
                    163: 
                    164:   if (arg == 0)
                    165:     error_no_arg ("breakpoint number");
                    166: 
                    167:   /* If we allowed this, we would have problems with when to
                    168:      free the storage, if we change the commands currently
                    169:      being read from.  */
                    170: 
                    171:   if (breakpoint_commands)
                    172:     error ("Can't use the \"commands\" command among a breakpoint's commands.");
                    173: 
                    174:   p = arg;
                    175:   if (! (*p >= '0' && *p <= '9'))
                    176:     error ("Argument must be integer (a breakpoint number).");
                    177: 
                    178:   while (*p >= '0' && *p <= '9') p++;
                    179:   if (*p)
                    180:     error ("Unexpected extra arguments following breakpoint number.");
                    181: 
                    182:   bnum = atoi (arg);
                    183: 
                    184:   ALL_BREAKPOINTS (b)
                    185:     if (b->number == bnum)
                    186:       {
                    187:        if (input_from_terminal_p ())
1.1.1.4 ! root      188:          {
        !           189:            printf ("Type commands for when breakpoint %d is hit, one per line.\n\
1.1       root      190: End with a line saying just \"end\".\n", bnum);
1.1.1.4 ! root      191:            fflush (stdout);
        !           192:          }
1.1       root      193:        l = read_command_lines ();
                    194:        free_command_lines (&b->commands);
                    195:        b->commands = l;
                    196:        return;
                    197:       }
                    198:   error ("No breakpoint number %d.", bnum);
                    199: }
                    200: 
                    201: /* Called from command loop to execute the commands
                    202:    associated with the breakpoint we just stopped at.  */
                    203: 
                    204: void
                    205: do_breakpoint_commands ()
                    206: {
                    207:   while (breakpoint_commands)
                    208:     {
1.1.1.2   root      209:       char *line = breakpoint_commands->line;
                    210:       breakpoint_commands = breakpoint_commands->next;
                    211:       execute_command (line, 0);
                    212:       /* If command was "cont", breakpoint_commands is now 0,
                    213:         of if we stopped at yet another breakpoint which has commands,
                    214:         it is now the commands for the new breakpoint.  */
1.1       root      215:     }
                    216:   clear_momentary_breakpoints ();
                    217: }
                    218: 
                    219: /* Used when the program is proceeded, to eliminate any remaining
                    220:    commands attached to the previous breakpoint we stopped at.  */
                    221: 
                    222: void
                    223: clear_breakpoint_commands ()
                    224: {
                    225:   breakpoint_commands = 0;
                    226:   breakpoint_auto_delete (0);
                    227: }
1.1.1.2   root      228: 
                    229: /* Functions to get and set the current list of pending
                    230:    breakpoint commands.  These are used by run_stack_dummy
                    231:    to preserve the commands around a function call.  */
                    232: 
                    233: struct command_line *
                    234: get_breakpoint_commands ()
                    235: {
                    236:   return breakpoint_commands;
                    237: }
                    238: 
                    239: void
                    240: set_breakpoint_commands (cmds)
                    241:      struct command_line *cmds;
                    242: {
                    243:   breakpoint_commands = cmds;
                    244: }
1.1       root      245: 
                    246: /* insert_breakpoints is used when starting or continuing the program.
                    247:    remove_breakpoints is used when the program stops.
1.1.1.2   root      248:    Both return zero if successful,
                    249:    or an `errno' value if could not write the inferior.  */
1.1       root      250: 
                    251: int
                    252: insert_breakpoints ()
                    253: {
                    254:   register struct breakpoint *b;
1.1.1.2   root      255:   int val;
1.1       root      256: 
                    257: /*   printf ("Inserting breakpoints.\n"); */
                    258:   ALL_BREAKPOINTS (b)
                    259:     if (b->enable != disabled && ! b->inserted && ! b->duplicate)
                    260:       {
                    261:        read_memory (b->address, b->shadow_contents, sizeof break_insn);
1.1.1.2   root      262:        val = write_memory (b->address, break_insn, sizeof break_insn);
                    263:        if (val)
                    264:          return val;
1.1       root      265: /*     printf ("Inserted breakpoint at 0x%x, shadow 0x%x, 0x%x.\n",
                    266:                b->address, b->shadow_contents[0], b->shadow_contents[1]); */
                    267:        b->inserted = 1;
                    268:       }
                    269:   return 0;
                    270: }
                    271: 
                    272: int
                    273: remove_breakpoints ()
                    274: {
                    275:   register struct breakpoint *b;
1.1.1.2   root      276:   int val;
1.1       root      277: 
                    278: /*   printf ("Removing breakpoints.\n"); */
                    279:   ALL_BREAKPOINTS (b)
                    280:     if (b->inserted)
                    281:       {
1.1.1.2   root      282:        val = write_memory (b->address, b->shadow_contents, sizeof break_insn);
                    283:        if (val)
                    284:          return val;
1.1       root      285:        b->inserted = 0;
                    286: /*     printf ("Removed breakpoint at 0x%x, shadow 0x%x, 0x%x.\n",
                    287:                b->address, b->shadow_contents[0], b->shadow_contents[1]); */
                    288:       }
                    289: 
                    290:   return 0;
                    291: }
                    292: 
                    293: /* Clear the "inserted" flag in all breakpoints.
                    294:    This is done when the inferior is loaded.  */
                    295: 
                    296: int
                    297: mark_breakpoints_out ()
                    298: {
                    299:   register struct breakpoint *b;
                    300: 
                    301:   ALL_BREAKPOINTS (b)
                    302:     b->inserted = 0;
                    303: }
                    304: 
                    305: /* breakpoint_here_p (PC) returns 1 if an enabled breakpoint exists at PC.
                    306:    When continuing from a location with a breakpoint,
                    307:    we actually single step once before calling insert_breakpoints.  */
                    308: 
                    309: int
                    310: breakpoint_here_p (pc)
                    311:      CORE_ADDR pc;
                    312: {
                    313:   register struct breakpoint *b;
                    314: 
                    315:   ALL_BREAKPOINTS (b)
                    316:     if (b->enable != disabled && b->address == pc)
                    317:       return 1;
                    318: 
                    319:   return 0;
                    320: }
                    321: 
1.1.1.4 ! root      322: /* Evaluate the expression EXP and return 1 if value is zero.
        !           323:    This is used inside a catch_errors to evaluate the breakpoint condition.  */
        !           324: 
        !           325: int
        !           326: breakpoint_cond_eval (exp)
        !           327:      struct expression *exp;
        !           328: {
        !           329:   return value_zerop (evaluate_expression (exp));
        !           330: }
        !           331: 
1.1       root      332: /* Return 0 if PC is not the address just after a breakpoint,
                    333:    or -1 if breakpoint says do not stop now,
                    334:    or -2 if breakpoint says it has deleted itself and don't stop,
                    335:    or -3 if hit a breakpoint number -3 (delete when program stops),
                    336:    or else the number of the breakpoint,
                    337:    with 0x1000000 added for a silent breakpoint.  */
                    338: 
                    339: int
                    340: breakpoint_stop_status (pc, frame)
                    341:      CORE_ADDR pc;
                    342:      FRAME frame;
                    343: {
                    344:   register struct breakpoint *b;
                    345:   register int cont = 0;
                    346: 
                    347:   /* Get the address where the breakpoint would have been.  */
                    348:   pc -= DECR_PC_AFTER_BREAK;
                    349: 
                    350:   ALL_BREAKPOINTS (b)
                    351:     if (b->enable != disabled && b->address == pc)
                    352:       {
                    353:        if (b->frame && b->frame != frame)
                    354:          cont = -1;
                    355:        else
                    356:          {
                    357:            int value_zero;
                    358:            if (b->cond)
                    359:              {
1.1.1.4 ! root      360:                value_zero
        !           361:                  = catch_errors (breakpoint_cond_eval, b->cond,
        !           362:                                  "Error occurred in testing breakpoint condition.");
1.1       root      363:                free_all_values ();
                    364:              }
                    365:            if (b->cond && value_zero)
                    366:              {
                    367:                cont = -1;
                    368:              }
                    369:            else if (b->ignore_count > 0)
                    370:              {
                    371:                b->ignore_count--;
                    372:                cont = -1;
                    373:              }
                    374:            else
                    375:              {
                    376:                if (b->enable == temporary)
                    377:                  b->enable = disabled;
                    378:                breakpoint_commands = b->commands;
                    379:                if (breakpoint_commands
                    380:                    && !strcmp ("silent", breakpoint_commands->line))
                    381:                  {
                    382:                    breakpoint_commands = breakpoint_commands->next;
                    383:                    return 0x1000000 + b->number;
                    384:                  }
                    385:                return b->number;
                    386:              }
                    387:          }
                    388:       }
                    389: 
                    390:   return cont;
                    391: }
                    392: 
                    393: static void
                    394: breakpoint_1 (bnum)
                    395:      int bnum;
                    396: {
                    397:   register struct breakpoint *b;
                    398:   register struct command_line *l;
                    399:   register struct symbol *sym;
                    400:   CORE_ADDR last_addr = -1;
                    401: 
                    402:   ALL_BREAKPOINTS (b)
                    403:     if (bnum == -1 || bnum == b->number)
                    404:       {
                    405:        printf ("#%-3d %c  0x%08x ", b->number,
                    406:                "nyod"[(int) b->enable],
                    407:                b->address);
                    408:        last_addr = b->address;
                    409:        if (b->symtab)
                    410:          {
                    411:            sym = find_pc_function (b->address);
                    412:            if (sym)
                    413:              printf (" in %s (%s line %d)", SYMBOL_NAME (sym),
                    414:                      b->symtab->filename, b->line_number);
                    415:            else
                    416:              printf ("%s line %d", b->symtab->filename, b->line_number);
                    417:          }
                    418:        printf ("\n");
                    419: 
                    420:        if (b->ignore_count)
                    421:          printf ("\tignore next %d hits\n", b->ignore_count);
                    422:        if (b->frame)
                    423:          printf ("\tstop only in stack frame at 0x%x\n", b->frame);
                    424:        if (b->cond)
                    425:          {
                    426:            printf ("\tbreak only if ");
                    427:            print_expression (b->cond, stdout);
                    428:            printf ("\n");
                    429:          }
                    430:        if (l = b->commands)
                    431:          while (l)
                    432:            {
                    433:              printf ("\t%s\n", l->line);
                    434:              l = l->next;
                    435:            }
                    436:       }
                    437: 
                    438:   if (last_addr != -1)
                    439:     set_next_address (last_addr);
                    440: }
                    441: 
                    442: static void
                    443: breakpoints_info (bnum_exp)
                    444:      char *bnum_exp;
                    445: {
                    446:   int bnum = -1;
                    447: 
                    448:   if (bnum_exp)
                    449:     bnum = parse_and_eval_address (bnum_exp);
                    450:   else if (breakpoint_chain == 0)
                    451:     printf ("No breakpoints.\n");
                    452:   else
                    453:     printf ("Breakpoints:\n\
                    454: Num Enb   Address    Where\n");
                    455: 
                    456:   breakpoint_1 (bnum);
                    457: }
1.1.1.2   root      458: 
                    459: /* Print a message describing any breakpoints set at PC.  */
                    460: 
                    461: static void
                    462: describe_other_breakpoints (pc)
                    463:      register CORE_ADDR pc;
                    464: {
                    465:   register int others = 0;
                    466:   register struct breakpoint *b;
                    467: 
                    468:   ALL_BREAKPOINTS (b)
                    469:     if (b->address == pc)
                    470:       others++;
                    471:   if (others > 0)
                    472:     {
                    473:       printf ("Note: breakpoint%s ", (others > 1) ? "s" : "");
                    474:       ALL_BREAKPOINTS (b)
                    475:        if (b->address == pc)
                    476:          {
                    477:            others--;
                    478:            printf ("%d%s%s ",
                    479:                    b->number,
                    480:                    (b->enable == disabled) ? " (disabled)" : "",
                    481:                    (others > 1) ? "," : ((others == 1) ? " and" : ""));
                    482:          }
                    483:       printf (" also set at pc 0x%x\n", pc);
                    484:     }
                    485: }
1.1       root      486: 
1.1.1.2   root      487: /* Set the default place to put a breakpoint
                    488:    for the `break' command with no arguments.  */
                    489: 
1.1       root      490: void
                    491: set_default_breakpoint (valid, addr, symtab, line)
                    492:      int valid;
                    493:      CORE_ADDR addr;
                    494:      struct symtab *symtab;
                    495:      int line;
                    496: {
                    497:   default_breakpoint_valid = valid;
                    498:   default_breakpoint_address = addr;
                    499:   default_breakpoint_symtab = symtab;
                    500:   default_breakpoint_line = line;
                    501: }
                    502: 
                    503: /* Rescan breakpoints at address ADDRESS,
                    504:    marking the first one as "first" and any others as "duplicates".
                    505:    This is so that the bpt instruction is only inserted once.  */
                    506: 
                    507: static void
                    508: check_duplicates (address)
                    509:      CORE_ADDR address;
                    510: {
                    511:   register struct breakpoint *b;
                    512:   register int count = 0;
                    513: 
                    514:   ALL_BREAKPOINTS (b)
                    515:     if (b->enable != disabled && b->address == address)
                    516:       {
                    517:        count++;
                    518:        b->duplicate = count > 1;
                    519:       }
                    520: }
                    521: 
                    522: /* Low level routine to set a breakpoint.
                    523:    Takes as args the three things that every breakpoint must have.
                    524:    Returns the breakpoint object so caller can set other things.
                    525:    Does not set the breakpoint number!
                    526:    Does not print anything.  */
                    527: 
                    528: static struct breakpoint *
                    529: set_raw_breakpoint (sal)
                    530:      struct symtab_and_line sal;
                    531: {
                    532:   register struct breakpoint *b, *b1;
                    533: 
                    534:   b = (struct breakpoint *) xmalloc (sizeof (struct breakpoint));
                    535:   bzero (b, sizeof *b);
                    536:   b->address = sal.pc;
                    537:   b->symtab = sal.symtab;
                    538:   b->line_number = sal.line;
                    539:   b->enable = enabled;
                    540:   b->next = 0;
                    541: 
                    542:   /* Add this breakpoint to the end of the chain
                    543:      so that a list of breakpoints will come out in order
                    544:      of increasing numbers.  */
                    545: 
                    546:   b1 = breakpoint_chain;
                    547:   if (b1 == 0)
                    548:     breakpoint_chain = b;
                    549:   else
                    550:     {
                    551:       while (b1->next)
                    552:        b1 = b1->next;
                    553:       b1->next = b;
                    554:     }
                    555: 
                    556:   check_duplicates (sal.pc);
                    557: 
                    558:   return b;
                    559: }
                    560: 
                    561: /* Set a breakpoint that will evaporate an end of command
                    562:    at address specified by SAL.
                    563:    Restrict it to frame FRAME if FRAME is nonzero.  */
                    564: 
                    565: void
                    566: set_momentary_breakpoint (sal, frame)
                    567:      struct symtab_and_line sal;
                    568:      FRAME frame;
                    569: {
                    570:   register struct breakpoint *b;
                    571:   b = set_raw_breakpoint (sal);
                    572:   b->number = -3;
                    573:   b->enable = delete;
                    574:   b->frame = frame;
                    575: }
                    576: 
                    577: void
                    578: clear_momentary_breakpoints ()
                    579: {
                    580:   register struct breakpoint *b;
                    581:   ALL_BREAKPOINTS (b)
                    582:     if (b->number == -3)
                    583:       {
                    584:        delete_breakpoint (b);
                    585:        break;
                    586:       }
                    587: }
                    588: 
1.1.1.2   root      589: /* Set a breakpoint from a symtab and line.
                    590:    If TEMPFLAG is nonzero, it is a temporary breakpoint.
                    591:    Print the same confirmation messages that the breakpoint command prints.  */
                    592: 
                    593: void
                    594: set_breakpoint (s, line, tempflag)
                    595:      struct symtab *s;
                    596:      int line;
                    597:      int tempflag;
                    598: {
                    599:   register struct breakpoint *b;
                    600:   struct symtab_and_line sal;
                    601:   
                    602:   sal.symtab = s;
                    603:   sal.line = line;
                    604:   sal.pc = find_line_pc (sal.symtab, sal.line);
                    605:   if (sal.pc == 0)
                    606:     error ("No line %d in file \"%s\".\n", sal.line, sal.symtab->filename);
                    607:   else
                    608:     {
                    609:       describe_other_breakpoints (sal.pc);
                    610: 
                    611:       b = set_raw_breakpoint (sal);
                    612:       b->number = ++breakpoint_count;
                    613:       b->cond = 0;
                    614:       if (tempflag)
                    615:        b->enable = temporary;
                    616: 
                    617:       printf ("Breakpoint %d at 0x%x", b->number, b->address);
                    618:       if (b->symtab)
                    619:        printf (": file %s, line %d.", b->symtab->filename, b->line_number);
                    620:       printf ("\n");
                    621:     }
                    622: }
                    623: 
1.1       root      624: /* Set a breakpoint according to ARG (function, linenum or *address)
1.1.1.4 ! root      625:    and make it temporary if TEMPFLAG is nonzero.  */
1.1       root      626: 
                    627: static void
1.1.1.4 ! root      628: break_command_1 (arg, tempflag, from_tty)
1.1       root      629:      char *arg;
1.1.1.4 ! root      630:      int tempflag, from_tty;
1.1       root      631: {
                    632:   struct symtab_and_line sal;
                    633:   register struct expression *cond = 0;
                    634:   register struct breakpoint *b;
                    635: 
1.1.1.4 ! root      636:   sal.pc = 0;
1.1       root      637: 
                    638:   if (arg)
                    639:     {
1.1.1.4 ! root      640:       sal = decode_line_1 (&arg, 1, 0, 0);
1.1       root      641: 
1.1.1.4 ! root      642:       if (sal.pc == 0 && sal.symtab != 0)
1.1       root      643:        {
1.1.1.4 ! root      644:          sal.pc = find_line_pc (sal.symtab, sal.line);
        !           645:          if (sal.pc == 0)
        !           646:            error ("No line %d in file \"%s\".",
        !           647:                   sal.line, sal.symtab->filename);
        !           648:        }
1.1       root      649: 
1.1.1.4 ! root      650:       while (*arg)
        !           651:        {
        !           652:          if (arg[0] == 'i' && arg[1] == 'f'
        !           653:              && (arg[2] == ' ' || arg[2] == '\t'))
        !           654:            cond = (struct expression *) parse_c_1 ((arg += 2, &arg),
        !           655:                                                    block_for_pc (sal.pc), 0);
        !           656:          else
        !           657:            error ("Junk at end of arguments.");
1.1       root      658:        }
                    659:     }
                    660:   else if (default_breakpoint_valid)
                    661:     {
                    662:       sal.pc = default_breakpoint_address;
                    663:       sal.line = default_breakpoint_line;
                    664:       sal.symtab = default_breakpoint_symtab;
                    665:     }
                    666:   else
                    667:     error ("No default breakpoint address now.");
                    668: 
1.1.1.4 ! root      669:   if (from_tty)
        !           670:     describe_other_breakpoints (sal.pc);
1.1.1.3   root      671: 
1.1.1.4 ! root      672:   b = set_raw_breakpoint (sal);
        !           673:   b->number = ++breakpoint_count;
        !           674:   b->cond = cond;
        !           675:   if (tempflag)
        !           676:     b->enable = temporary;
        !           677: 
        !           678:   printf ("Breakpoint %d at 0x%x", b->number, b->address);
        !           679:   if (b->symtab)
        !           680:     printf (": file %s, line %d.", b->symtab->filename, b->line_number);
        !           681:   printf ("\n");
1.1       root      682: }
                    683: 
                    684: static void
                    685: break_command (arg, from_tty)
                    686:      char *arg;
                    687:      int from_tty;
                    688: {
1.1.1.4 ! root      689:   break_command_1 (arg, 0, from_tty);
1.1       root      690: }
                    691: 
                    692: static void
                    693: tbreak_command (arg, from_tty)
                    694:      char *arg;
                    695:      int from_tty;
                    696: {
1.1.1.4 ! root      697:   break_command_1 (arg, 1, from_tty);
1.1       root      698: }
                    699: 
                    700: static void
                    701: clear_command (arg, from_tty)
                    702:      char *arg;
                    703:      int from_tty;
                    704: {
                    705:   register struct breakpoint *b, *b1;
                    706:   struct symtab_and_line sal;
                    707:   register struct breakpoint *found;
                    708: 
                    709:   if (arg)
1.1.1.4 ! root      710:     sal = decode_line_spec (arg, 1);
1.1       root      711:   else
                    712:     {
                    713:       sal.line = default_breakpoint_line;
                    714:       sal.symtab = default_breakpoint_symtab;
                    715:       sal.pc = 0;
                    716:       if (sal.symtab == 0)
                    717:        error ("No source file specified.");
                    718:     }
                    719: 
1.1.1.4 ! root      720:   /* If exact pc given, clear bpts at that pc.
        !           721:      But if sal.pc is zero, clear all bpts on specified line.  */
1.1.1.3   root      722: 
1.1.1.4 ! root      723:   found = (struct breakpoint *) 0;
        !           724:   while (breakpoint_chain
        !           725:         && (sal.pc ? breakpoint_chain->address == sal.pc
        !           726:             : (breakpoint_chain->symtab == sal.symtab
        !           727:                && breakpoint_chain->line_number == sal.line)))
        !           728:     {
        !           729:       b1 = breakpoint_chain;
        !           730:       breakpoint_chain = b1->next;
        !           731:       b1->next = found;
        !           732:       found = b1;
        !           733:     }
        !           734: 
        !           735:   ALL_BREAKPOINTS (b)
        !           736:     while (b->next
        !           737:           && (sal.pc ? b->next->address == sal.pc
        !           738:               : (b->next->symtab == sal.symtab
        !           739:                  && b->next->line_number == sal.line)))
        !           740:       {
        !           741:        b1 = b->next;
        !           742:        b->next = b1->next;
        !           743:        b1->next = found;
        !           744:        found = b1;
        !           745:       }
1.1       root      746: 
1.1.1.4 ! root      747:   if (found == 0)
        !           748:     error ("No breakpoint at %s.", arg);
1.1       root      749: 
1.1.1.4 ! root      750:   if (found->next) from_tty = 1; /* Alwats report if deleted more than one */
        !           751:   if (from_tty) printf ("Deleted breakpoint%s ", found->next ? "s" : "");
        !           752:   while (found)
        !           753:     {
        !           754:       if (from_tty) printf ("%d ", found->number);
        !           755:       b1 = found->next;
        !           756:       delete_breakpoint (found);
        !           757:       found = b1;
1.1       root      758:     }
1.1.1.4 ! root      759:   if (from_tty) putchar ('\n');
1.1       root      760: }
                    761: 
                    762: /* Delete breakpoint number BNUM if it is a `delete' breakpoint.
                    763:    This is called after breakpoint BNUM has been hit.
                    764:    Also delete any breakpoint numbered -3 unless there are breakpoint
                    765:    commands to be executed.  */
                    766: 
                    767: void
                    768: breakpoint_auto_delete (bnum)
                    769:      int bnum;
                    770: {
                    771:   register struct breakpoint *b;
                    772:   if (bnum != 0)
                    773:     ALL_BREAKPOINTS (b)
                    774:       if (b->number == bnum)
                    775:        {
                    776:          if (b->enable == delete)
                    777:            delete_breakpoint (b);
                    778:          break;
                    779:        }
                    780:   if (breakpoint_commands == 0)
                    781:     clear_momentary_breakpoints ();
                    782: }
                    783: 
                    784: static void
                    785: delete_breakpoint (bpt)
                    786:      struct breakpoint *bpt;
                    787: {
                    788:   register struct breakpoint *b;
                    789: 
                    790:   if (bpt->inserted)
                    791:     write_memory (bpt->address, bpt->shadow_contents, sizeof break_insn);
                    792: 
                    793:   if (breakpoint_chain == bpt)
                    794:     breakpoint_chain = bpt->next;
                    795: 
                    796:   ALL_BREAKPOINTS (b)
                    797:     if (b->next == bpt)
                    798:       {
                    799:        b->next = bpt->next;
                    800:        break;
                    801:       }
                    802: 
                    803:   check_duplicates (bpt->address);
                    804: 
                    805:   free_command_lines (&bpt->commands);
                    806:   if (bpt->cond)
                    807:     free (bpt->cond);
                    808:   free (bpt);
                    809: }
                    810: 
                    811: void map_breakpoint_numbers ();
                    812: 
                    813: static void
                    814: delete_command (arg, from_tty)
                    815:      char *arg;
                    816:      int from_tty;
                    817: {
                    818:   register struct breakpoint *b, *b1;
                    819: 
                    820:   if (arg == 0)
                    821:     {
                    822:       if (!from_tty || query ("Delete all breakpoints? "))
                    823:        {
                    824:          /* No arg; clear all breakpoints.  */
                    825:          while (breakpoint_chain)
                    826:            delete_breakpoint (breakpoint_chain);
                    827:        }
                    828:     }
                    829:   else
                    830:     map_breakpoint_numbers (arg, delete_breakpoint);
                    831: }
                    832: 
                    833: /* Delete all breakpoints.
                    834:    Done when new symtabs are loaded, since the break condition expressions
                    835:    may become invalid, and the breakpoints are probably wrong anyway.  */
                    836: 
                    837: void
                    838: clear_breakpoints ()
                    839: {
                    840:   delete_command (0, 0);
                    841: }
                    842: 
                    843: /* Set ignore-count of breakpoint number BPTNUM to COUNT.
                    844:    If from_tty is nonzero, it prints a message to that effect,
                    845:    which ends with a period (no newline).  */
                    846: 
                    847: void
                    848: set_ignore_count (bptnum, count, from_tty)
                    849:      int bptnum, count, from_tty;
                    850: {
                    851:   register struct breakpoint *b;
                    852: 
                    853:   if (count < 0)
                    854:     count = 0;
                    855: 
                    856:   ALL_BREAKPOINTS (b)
                    857:     if (b->number == bptnum)
                    858:       {
                    859:        b->ignore_count = count;
                    860:        if (!from_tty)
                    861:          return;
                    862:        else if (count == 0)
                    863:          printf ("Will stop next time breakpoint %d is reached.", bptnum);
                    864:        else if (count == 1)
                    865:          printf ("Will ignore next crossing of breakpoint %d.", bptnum);
                    866:        else
                    867:          printf ("Will ignore next %d crossings of breakpoint %d.",
                    868:                  count, bptnum);
                    869:        return;
                    870:       }
                    871: 
                    872:   error ("No breakpoint number %d.", bptnum);
                    873: }
                    874: 
                    875: /* Command to set ignore-count of breakpoint N to COUNT.  */
                    876: 
                    877: static void
                    878: ignore_command (args, from_tty)
                    879:      char *args;
                    880:      int from_tty;
                    881: {
1.1.1.4 ! root      882:   register char *p = args;
1.1       root      883:   register int num;
1.1.1.2   root      884: 
                    885:   if (p == 0)
                    886:     error_no_arg ("a breakpoint number");
1.1       root      887:   
                    888:   while (*p >= '0' && *p <= '9') p++;
                    889:   if (*p && *p != ' ' && *p != '\t')
                    890:     error ("First argument must be a breakpoint number.");
                    891: 
                    892:   num = atoi (args);
                    893: 
                    894:   if (*p == 0)
                    895:     error ("Second argument (specified ignore-count) is missing.");
                    896: 
                    897:   set_ignore_count (num, parse_and_eval_address (p), from_tty);
                    898:   printf ("\n");
                    899: }
                    900: 
                    901: /* Call FUNCTION on each of the breakpoints
                    902:    whose numbers are given in ARGS.  */
                    903: 
                    904: static void
                    905: map_breakpoint_numbers (args, function)
                    906:      char *args;
                    907:      void (*function) ();
                    908: {
                    909:   register char *p = args;
                    910:   register char *p1;
                    911:   register int num;
                    912:   register struct breakpoint *b;
                    913: 
                    914:   if (p == 0)
                    915:     error_no_arg ("one or more breakpoint numbers");
                    916: 
                    917:   while (*p)
                    918:     {
                    919:       p1 = p;
                    920:       while (*p1 >= '0' && *p1 <= '9') p1++;
                    921:       if (*p1 && *p1 != ' ' && *p1 != '\t')
                    922:        error ("Arguments must be breakpoint numbers.");
                    923: 
                    924:       num = atoi (p);
                    925: 
                    926:       ALL_BREAKPOINTS (b)
                    927:        if (b->number == num)
                    928:          {
                    929:            function (b);
                    930:            goto win;
                    931:          }
                    932:       printf ("No breakpoint number %d.\n", num);
                    933:     win:
                    934:       p = p1;
                    935:       while (*p == ' ' || *p == '\t') p++;
                    936:     }
                    937: }
                    938: 
                    939: static void
                    940: enable_breakpoint (bpt)
                    941:      struct breakpoint *bpt;
                    942: {
                    943:   bpt->enable = enabled;
                    944: 
                    945:   check_duplicates (bpt->address);
                    946: }
                    947: 
                    948: static void
                    949: enable_command (args)
                    950:      char *args;
                    951: {
                    952:   map_breakpoint_numbers (args, enable_breakpoint);
                    953: }
                    954: 
                    955: static void
                    956: disable_breakpoint (bpt)
                    957:      struct breakpoint *bpt;
                    958: {
                    959:   bpt->enable = disabled;
                    960: 
                    961:   check_duplicates (bpt->address);
                    962: }
                    963: 
                    964: static void
                    965: disable_command (args)
                    966:      char *args;
                    967: {
                    968:   register struct breakpoint *bpt;
                    969:   if (args == 0)
                    970:     ALL_BREAKPOINTS (bpt)
                    971:       disable_breakpoint (bpt);
                    972:   else
                    973:     map_breakpoint_numbers (args, disable_breakpoint);
                    974: }
                    975: 
                    976: static void
                    977: enable_once_breakpoint (bpt)
                    978:      struct breakpoint *bpt;
                    979: {
                    980:   bpt->enable = temporary;
                    981: 
                    982:   check_duplicates (bpt->address);
                    983: }
                    984: 
                    985: static void
                    986: enable_once_command (args)
                    987:      char *args;
                    988: {
                    989:   map_breakpoint_numbers (args, enable_once_breakpoint);
                    990: }
                    991: 
                    992: static void
                    993: enable_delete_breakpoint (bpt)
                    994:      struct breakpoint *bpt;
                    995: {
                    996:   bpt->enable = delete;
                    997: 
                    998:   check_duplicates (bpt->address);
                    999: }
                   1000: 
                   1001: static void
                   1002: enable_delete_command (args)
                   1003:      char *args;
                   1004: {
                   1005:   map_breakpoint_numbers (args, enable_delete_breakpoint);
                   1006: }
                   1007: 
                   1008: 
                   1009: /* Chain containing all defined enable commands.  */
                   1010: 
                   1011: struct cmd_list_element *enablelist;
                   1012: 
                   1013: extern struct cmd_list_element *cmdlist;
                   1014: 
                   1015: static
                   1016: initialize ()
                   1017: {
                   1018:   breakpoint_chain = 0;
                   1019:   breakpoint_count = 0;
                   1020:   enablelist = 0;
                   1021: 
                   1022:   add_com ("ignore", class_breakpoint, ignore_command,
                   1023:           "Set ignore-count of breakpoint number N to COUNT.");
                   1024: 
                   1025:   add_com ("commands", class_breakpoint, commands_command,
                   1026:           "Set commands to be executed when a breakpoint is hit.\n\
                   1027: Give breakpoint number as argument after \"commands\".\n\
                   1028: The commands themselves follow starting on the next line.\n\
                   1029: Type a line containing \"end\" to indicate the end of them.\n\
                   1030: Give \"silent\" as the first line to make the breakpoint silent;\n\
                   1031: then no output is printed when it is hit, except what the commands print.");
                   1032: 
                   1033:   add_com ("condition", class_breakpoint, condition_command,
                   1034:           "Specify breakpoint number N to break only if COND is true.\n\
                   1035: N is an integer; COND is a C expression to be evaluated whenever\n\
                   1036: breakpoint N is reached.  Actually break only when COND is nonzero.");
                   1037: 
                   1038:   add_com ("tbreak", class_breakpoint, tbreak_command,
                   1039:           "Set a temporary breakpoint.  Args like \"break\" command.\n\
                   1040: Like \"break\" except the breakpoint is only enabled temporarily,\n\
                   1041: so it will be disabled when hit.  Equivalent to \"break\" followed\n\
                   1042: by using \"enable once\" on the breakpoint number.");
                   1043: 
                   1044:   add_prefix_cmd ("enable", class_breakpoint, enable_command,
                   1045:                  "Enable some breakpoints.  Give breakpoint numbers as arguments.\n\
                   1046: With no subcommand, breakpoints are enabled until you command otherwise.\n\
                   1047: This is used to cancel the effect of the \"disable\" command.\n\
                   1048: With a subcommand you can enable temporarily.",
                   1049:                  &enablelist, "enable ", 1, &cmdlist);
                   1050: 
                   1051:   add_cmd ("delete", 0, enable_delete_command,
                   1052:           "Enable breakpoints and delete when hit.  Give breakpoint numbers.\n\
                   1053: If a breakpoint is hit while enabled in this fashion, it is deleted.",
                   1054:           &enablelist);
                   1055: 
                   1056:   add_cmd ("once", 0, enable_once_command,
                   1057:           "Enable breakpoints for one hit.  Give breakpoint numbers.\n\
                   1058: If a breakpoint is hit while enabled in this fashion, it becomes disabled.\n\
                   1059: See the \"tbreak\" command which sets a breakpoint and enables it once.",
                   1060:           &enablelist);
                   1061: 
                   1062:   add_com ("disable", class_breakpoint, disable_command,
                   1063:           "Disable some breakpoints.  Give breakpoint numbers as arguments.\n\
                   1064: With no arguments, disable all breakpoints.\n\
                   1065: A disabled breakpoint is not forgotten,\n\
                   1066: but it has no effect until enabled again.");
                   1067:   add_com_alias ("dis", "disable", class_breakpoint, 1);
                   1068: 
                   1069:   add_com ("delete", class_breakpoint, delete_command,
                   1070:           "Delete breakpoints, specifying breakpoint numbers; or all breakpoints.\n\
                   1071: Arguments are breakpoint numbers with spaces in between.\n\
                   1072: To delete all breakpoints, give no argument.");
                   1073:   add_com_alias ("d", "delete", class_breakpoint, 1);
                   1074: 
                   1075:   add_com ("clear", class_breakpoint, clear_command,
                   1076:           "Clear breakpoint at specified line or function.\n\
                   1077: Argument may be line number, function name, or \"*\" and an address.\n\
                   1078: If line number is specified, all breakpoints in that line are cleared.\n\
                   1079: If function is specified, breakpoints at beginning of function are cleared.\n\
                   1080: If an address is specified, breakpoints at that address are cleared.\n\n\
                   1081: With no argument, clears all breakpoints in the line that the selected frame\n\
                   1082: is executing in.\n\
                   1083: \n\
                   1084: See also the \"delete\" command which clears breakpoints by number.");
                   1085: 
                   1086:   add_com ("break", class_breakpoint, break_command,
                   1087:           "Set breakpoint at specified line or function.\n\
                   1088: Argument may be line number, function name, or \"*\" and an address.\n\
                   1089: If line number is specified, break at start of code for that line.\n\
                   1090: If function is specified, break at start of code for that function.\n\
                   1091: If an address is specified, break at that exact address.\n\
                   1092: With no arg, uses current execution address of selected stack frame.\n\
                   1093: This is useful for breaking on return to a stack frame.\n\
                   1094: \n\
                   1095: Multiple breakpoints at one place are permitted, and useful if conditional.\n\
                   1096: \n\
                   1097: Do \"help breakpoints\" for info on other commands dealing with breakpoints.");
                   1098:   add_com_alias ("b", "break", class_run, 1);
                   1099:   add_com_alias ("br", "break", class_run, 1);
                   1100:   add_com_alias ("bre", "break", class_run, 1);
                   1101:   add_com_alias ("brea", "break", class_run, 1);
                   1102: 
                   1103:   add_info ("breakpoints", breakpoints_info,
                   1104:            "Status of all breakpoints, or breakpoint number NUMBER.\n\
1.1.1.2   root     1105: Second column is \"y\" for enabled breakpoint, \"n\" for disabled,\n\
1.1       root     1106: \"o\" for enabled once (disable when hit), \"d\" for enable but delete when hit.\n\
                   1107: Then come the address and the file/line number.\n\n\
                   1108: Convenience variable \"$_\" and default examine address for \"x\"\n\
                   1109: are set to the address of the last breakpoint listed.");
                   1110: }
                   1111: 
                   1112: END_FILE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.