|
|
1.1 ! root 1: .TH DB 1 ! 2: .SH NAME ! 3: db \- debugger ! 4: .SH SYNOPSIS ! 5: .B db ! 6: [ ! 7: .I option ... ! 8: ] ! 9: [ ! 10: .I textfile ! 11: ] ! 12: [ ! 13: .I pid ! 14: ] ! 15: .SH DESCRIPTION ! 16: .I Db ! 17: is a general purpose debugging program. ! 18: It may be used to examine files and to provide ! 19: a controlled environment for the execution ! 20: of Plan 9 programs. ! 21: .PP ! 22: A ! 23: .I textfile ! 24: is a file containing the text and initialized ! 25: data of an executable program. ! 26: A ! 27: .I memfile ! 28: is the memory image of an executing process. It is ! 29: usually accessed via the process id ! 30: .RI ( pid ) ! 31: of the process in ! 32: .BI /proc/ pid /mem\f1. ! 33: A ! 34: .I memfile ! 35: contains the text, data, and saved registers and ! 36: process state. A ! 37: .I map ! 38: associated with each ! 39: .I textfile ! 40: or ! 41: .I memfile ! 42: supports accesses to instructions and data in the file; ! 43: see `Addresses'. ! 44: .PP ! 45: An argument consisting entirely of digits is assumed ! 46: to be a process id; otherwise, it is the name of a ! 47: .IR textfile . ! 48: When a ! 49: .I textfile ! 50: is given, the textfile map ! 51: is associated with it. ! 52: If only a ! 53: .I pid ! 54: is given, the textfile map is ! 55: associated with ! 56: .BI /proc/ pid /text\f1. ! 57: When a ! 58: .I pid ! 59: is given, the memfile map is associated with ! 60: .BI /proc/ pid /mem\f1; ! 61: otherwise it is undefined and accesses to the ! 62: .I memfile ! 63: are not permitted. ! 64: .PP ! 65: Commands to ! 66: .I db ! 67: are read from the standard input and ! 68: responses are to the standard output. ! 69: The options are ! 70: .TP ! 71: .BI -k ! 72: Use the kernel stack of process ! 73: .IR pid ! 74: to debug the executing kernel process. ! 75: If ! 76: .I textfile ! 77: is not specified, file ! 78: .BI / $cputype /9 type ! 79: is used, where ! 80: .I type ! 81: is the second word in ! 82: .BR $terminal . ! 83: .TP ! 84: .B -w ! 85: Create ! 86: .I textfile ! 87: and ! 88: .I memfile ! 89: if they don't exist; open them for writing ! 90: as well as reading. ! 91: .TP ! 92: .BI -I path ! 93: Directory in which to look for relative path names in ! 94: .B $< ! 95: and ! 96: .B $<< ! 97: commands. ! 98: .TP ! 99: .BI -m machine ! 100: Assume instructions are for the given CPU type ! 101: (one of ! 102: .BR 3210 , ! 103: .BR 386 , ! 104: .BR 68020 , ! 105: .BR 960 , ! 106: .BR mips , ! 107: .BR mipsco , ! 108: .BR sparc , ! 109: or ! 110: .BR sunsparc ) ! 111: instead of using the magic number to select ! 112: the CPU type. ! 113: .PP ! 114: Most ! 115: .I db ! 116: commands have the following form: ! 117: .IP ! 118: .RI [ address ] ! 119: .RB [ , ! 120: .IR count ] ! 121: .RI [ command ] ! 122: .PP ! 123: If ! 124: .I address ! 125: is present then the current position, called `dot', ! 126: is set to ! 127: .IR address . ! 128: Initially dot ! 129: is set to 0. ! 130: Most commands are repeated ! 131: .I count ! 132: times with ! 133: dot advancing between repetitions. ! 134: The default ! 135: .I count ! 136: is 1. ! 137: .I Address ! 138: and ! 139: .I count ! 140: are expressions. ! 141: Multiple commands on one line must be separated by ! 142: .LR ; . ! 143: .SS Expressions ! 144: Expressions are evaluated as long ! 145: .IR ints . ! 146: .TP 7.2n ! 147: .B . ! 148: The value of dot. ! 149: .TP 7.2n ! 150: .B + ! 151: The value of dot ! 152: incremented by the current increment. ! 153: .TP 7.2n ! 154: .B ^ ! 155: The value of dot ! 156: decremented by the current increment. ! 157: .TP 7.2n ! 158: .B \&" ! 159: The last ! 160: .I address ! 161: typed. ! 162: .TP 7.2n ! 163: .I integer ! 164: A number, in decimal radix by default. ! 165: The prefixes ! 166: .L 0 ! 167: and ! 168: .L 0o ! 169: and ! 170: .L 0O ! 171: (zero oh) force interpretation ! 172: in octal radix; the prefixes ! 173: .L 0t ! 174: and ! 175: .L 0T ! 176: force interpretation in ! 177: decimal radix; the prefixes ! 178: .LR 0x , ! 179: .LR 0X , ! 180: and ! 181: .L # ! 182: force interpretation in ! 183: hexadecimal radix. ! 184: Thus ! 185: .LR 020 , ! 186: .LR 0o20 , ! 187: .LR 0t16 , ! 188: and ! 189: .L #10 ! 190: all represent sixteen. ! 191: .TP 7.2n ! 192: .IB integer . fraction ! 193: A single-precision floating point number. ! 194: .TP 7.2n ! 195: .BI \' c\| \' ! 196: The ! 197: 16-bit ! 198: value of a character. ! 199: .L \e ! 200: may be used to escape a ! 201: .LR \' . ! 202: .TP 7.2n ! 203: .BI < name ! 204: The value of ! 205: .IR name , ! 206: which is a register name. ! 207: The register names are ! 208: those printed by the ! 209: .B $r ! 210: command. ! 211: .TP 7.2n ! 212: .I symbol ! 213: A ! 214: .I symbol ! 215: is a sequence ! 216: of upper or lower case letters, underscores or ! 217: digits, not starting with a digit. ! 218: .L \e ! 219: may be used to escape other characters. ! 220: The location of the ! 221: .I symbol ! 222: is calculated from the symbol table ! 223: in ! 224: .IR textfile . ! 225: .TP 7.2n ! 226: .IB routine . name ! 227: The address of the variable ! 228: .I name ! 229: in the specified ! 230: C or ALEF routine. ! 231: Both ! 232: .I routine ! 233: and ! 234: .I name ! 235: are ! 236: .IR symbols . ! 237: If ! 238: .I name ! 239: is omitted the value is the address of the ! 240: most recently activated stack frame ! 241: corresponding to ! 242: .IR routine ; ! 243: if ! 244: .I routine ! 245: is omitted, ! 246: the active procedure ! 247: is assumed. ! 248: .TP 7.2n ! 249: .IB file : integer ! 250: The address of the instruction corresponding ! 251: to the source statement at the indicated ! 252: line number of the file. If the source line contains ! 253: no executable statement, the address of the ! 254: instruction associated with the nearest ! 255: executable source line is returned. Files ! 256: begin at line 1. If multiple files of the same ! 257: name are loaded, an expression of this form resolves ! 258: to the first file encountered in the symbol table. ! 259: .TP 7.2n ! 260: .BI ( exp ) ! 261: The value of the expression ! 262: .IR exp . ! 263: .LP ! 264: .I Monadic operators ! 265: .RS ! 266: .TP 7.2n ! 267: .BI * exp ! 268: The contents of the location addressed ! 269: by ! 270: .I exp ! 271: in ! 272: .IR memfile . ! 273: .TP 7.2n ! 274: .BI @ exp ! 275: The contents of the location addressed by ! 276: .I exp ! 277: in ! 278: .IR textfile . ! 279: .TP 7.2n ! 280: .BI - exp ! 281: Integer negation. ! 282: .TP 7.2n ! 283: .BI ~ exp ! 284: Bitwise complement. ! 285: .TP 7.2n ! 286: .BI % exp ! 287: When used as an ! 288: .IR address , ! 289: .I exp ! 290: is an offset into the segment named ! 291: .IR ublock ; ! 292: see `Addresses'. ! 293: .RE ! 294: .LP ! 295: .I "Dyadic\ operators" ! 296: are left-associative ! 297: and are less binding than monadic operators. ! 298: .RS ! 299: .TP 7.2n ! 300: .IB e1 + e2 ! 301: Integer addition. ! 302: .TP 7.2n ! 303: .IB e1 - e2 ! 304: Integer subtraction. ! 305: .TP 7.2n ! 306: .IB e1 * e2 ! 307: Integer multiplication. ! 308: .TP 7.2n ! 309: .IB e1 % e2 ! 310: Integer division. ! 311: .TP 7.2n ! 312: .IB e1 & e2 ! 313: Bitwise conjunction. ! 314: .TP 7.2n ! 315: .IB e1 | e2 ! 316: Bitwise disjunction. ! 317: .TP 7.2n ! 318: .IB e1 # e2 ! 319: .I E1 ! 320: rounded up to the next multiple of ! 321: .IR e2 . ! 322: .RE ! 323: .DT ! 324: .SS Commands ! 325: Most commands have the following syntax: ! 326: .TP .5i ! 327: .BI ? f ! 328: Locations starting at ! 329: .I address ! 330: in ! 331: .I textfile ! 332: are printed according to the format ! 333: .IR f . ! 334: .TP ! 335: .BI / f ! 336: Locations starting at ! 337: .I address ! 338: in ! 339: .I memfile ! 340: are printed according to the format ! 341: .IR f . ! 342: .TP ! 343: .BI = f ! 344: The value of ! 345: .I address ! 346: itself is printed according to the format ! 347: .IR f . ! 348: .PP ! 349: A ! 350: .I format ! 351: consists of one or more characters that specify a style ! 352: of printing. ! 353: Each format character may be preceded by a decimal integer ! 354: that is a repeat count for the format character. ! 355: If no format is given then the last format is used. ! 356: .PP ! 357: Most format letters fetch some data, ! 358: print it, ! 359: and advance (a local copy of) dot ! 360: by the number of bytes fetched. ! 361: The total number of bytes in a format becomes the ! 362: .I current increment\f1. ! 363: .ta 2.5n .5i ! 364: .RS ! 365: .TP ! 366: .PD 0 ! 367: .B o ! 368: Print two-byte integer in octal. ! 369: .TP ! 370: .B O ! 371: Print four-byte integer in octal. ! 372: .TP ! 373: .B q ! 374: Print two-byte integer in signed octal. ! 375: .TP ! 376: .B Q ! 377: Print four-byte integer in signed octal. ! 378: .TP ! 379: .B d ! 380: Print two-byte integer in decimal. ! 381: .TP ! 382: .B D ! 383: Print four-byte integer in decimal. ! 384: .TP ! 385: .B x ! 386: Print two-byte integer in hexadecimal. ! 387: .TP ! 388: .B X ! 389: Print four-byte integer in hexadecimal. ! 390: .TP ! 391: .B u ! 392: Print two-byte integer in unsigned decimal. ! 393: .TP ! 394: .B U ! 395: Print four-byte integer in unsigned decimal. ! 396: .TP ! 397: .B f ! 398: Print ! 399: as a single-precision floating point number. ! 400: .TP ! 401: .B F ! 402: Print double-precision floating point. ! 403: .TP ! 404: .B b ! 405: Print the addressed byte in hexadecimal. ! 406: .TP ! 407: .B c ! 408: Print the addressed byte as an ! 409: .SM ASCII ! 410: character. ! 411: .TP ! 412: .B C ! 413: Print the addressed byte as a character. ! 414: Printable ! 415: .SM ASCII ! 416: characters ! 417: are represented normally; others ! 418: are printed in the form ! 419: .BR \exnn . ! 420: .TP ! 421: .B s ! 422: Print the addressed characters, as a ! 423: .SM UTF ! 424: string, until a zero byte ! 425: is reached. ! 426: Advance dot ! 427: by the length of the string, ! 428: including the zero terminator. ! 429: .TP ! 430: .B S ! 431: Print a string using ! 432: the escape convention (see ! 433: .B C ! 434: above). ! 435: .TP ! 436: .B r ! 437: Print as UTF the addressed two-byte integer (rune). ! 438: .TP ! 439: .B R ! 440: Print as UTF the addressed two-byte integers as runes ! 441: until a zero rune is reached. ! 442: Advance dot ! 443: by the length of the string, ! 444: including the zero terminator. ! 445: .TP ! 446: .B Y ! 447: Print a four-byte integer in date format (see ! 448: .IR ctime (2)). ! 449: .TP ! 450: .B i ! 451: Print as machine instructions. Dot is ! 452: incremented by the size of the instruction. ! 453: .TP ! 454: .B I ! 455: As ! 456: .B i ! 457: above, but print the machine instructions in ! 458: an alternate form if possible: ! 459: .B sunsparc ! 460: and ! 461: .B mipsco ! 462: reproduce the manufacturers' syntax. ! 463: .TP ! 464: .B M ! 465: Print the addressed machine instruction in a ! 466: machine-dependent hexadecimal form. ! 467: .TP ! 468: .B a ! 469: Print the value of dot ! 470: in symbolic form. ! 471: Dot is unaffected. ! 472: .TP ! 473: .B A ! 474: Print the value of dot ! 475: in hexadecimal. ! 476: Dot is unaffected. ! 477: .TP ! 478: .B z ! 479: Print the function name, source file, and line number ! 480: corresponding to dot (textfile only). Dot is unaffected. ! 481: .TP ! 482: .B p ! 483: Print the addressed value in symbolic form. ! 484: Dot is advanced by the size of a machine address. ! 485: .TP ! 486: .B t ! 487: When preceded by an integer, tabs to the next ! 488: appropriate tab stop. ! 489: For example, ! 490: .B 8t ! 491: moves to the next 8-space tab stop. ! 492: Dot is unaffected. ! 493: .TP ! 494: .B n ! 495: Print a newline. ! 496: Dot is unaffected. ! 497: .tr '" ! 498: .TP ! 499: .BR ' ... ' ! 500: Print the enclosed string. ! 501: Dot is unaffected. ! 502: .br ! 503: .tr '' ! 504: .TP ! 505: .B ^ ! 506: Dot is decremented by the current increment. ! 507: Nothing is printed. ! 508: .TP ! 509: .B + ! 510: Dot is incremented by 1. ! 511: Nothing is printed. ! 512: .TP ! 513: .B - ! 514: Dot is decremented by 1. ! 515: Nothing is printed. ! 516: .RE ! 517: .PD ! 518: .LP ! 519: Other commands include: ! 520: .TP ! 521: newline ! 522: Update dot by the current increment. ! 523: Repeat the previous command with a ! 524: .I count ! 525: of 1. ! 526: .TP ! 527: .RB [ ?/ ] l "\fI value mask\fR" ! 528: Words starting at dot ! 529: are masked with ! 530: .I mask ! 531: and compared with ! 532: .I value ! 533: until ! 534: a match is found. ! 535: If ! 536: .B l ! 537: is used, ! 538: the match is for a two-byte integer; ! 539: .B L ! 540: matches four bytes. ! 541: If no match is found then dot ! 542: is unchanged; otherwise dot ! 543: is set to the matched location. ! 544: If ! 545: .I mask ! 546: is omitted then ~0 is used. ! 547: .TP ! 548: .RB [ ?/ ] w "\fI value ...\fR" ! 549: Write the two-byte ! 550: .I value ! 551: into the addressed ! 552: location. ! 553: If the command is ! 554: .BR W , ! 555: write four bytes. ! 556: .TP ! 557: .RB [ ?/ ] "m\fI s b e f \fP" [ ?\fR] ! 558: .br ! 559: New values for ! 560: .RI ( b,\ e,\ f ) ! 561: in the segment named ! 562: .I s ! 563: are recorded. Valid segment names are ! 564: .IR text , ! 565: .IR data , ! 566: or ! 567: .IR ublock . ! 568: If less than three address expressions are given, ! 569: the remaining parameters are left unchanged. ! 570: If the list is terminated by ! 571: .L ? ! 572: or ! 573: .L / ! 574: then the file ! 575: .RI ( textfile ! 576: or ! 577: .I memfile ! 578: respectively) is used ! 579: for subsequent requests. ! 580: For example, ! 581: .L /m? ! 582: causes ! 583: .L / ! 584: to refer to ! 585: .IR textfile . ! 586: .TP ! 587: .BI > name ! 588: Dot is assigned to the variable or register named. ! 589: .TP ! 590: .B ! ! 591: The rest of the line is passed to ! 592: .IR rc (1) ! 593: for execution. ! 594: .TP ! 595: .BI $ modifier ! 596: Miscellaneous commands. ! 597: The available ! 598: .I modifiers ! 599: are: ! 600: .RS ! 601: .TP ! 602: .PD 0 ! 603: .BI < f ! 604: Read commands from the file ! 605: .IR f . ! 606: If this command is executed in a file, further commands ! 607: in the file are not seen. ! 608: If ! 609: .I f ! 610: is omitted, the current input stream is terminated. ! 611: If a ! 612: .I count ! 613: is given, and is zero, the command is ignored. ! 614: .TP ! 615: .BI << f ! 616: Similar to ! 617: .B < ! 618: except it can be used in a file of commands without ! 619: causing the file to be closed. ! 620: There is a (small) limit to the number of ! 621: .B << ! 622: files that can be open at once. ! 623: .br ! 624: .ns ! 625: .TP ! 626: .BI > f ! 627: Append output to the file ! 628: .IR f , ! 629: which is created if it does not exist. ! 630: If ! 631: .I f ! 632: is omitted, output is returned to the terminal. ! 633: .TP ! 634: .B ? ! 635: Print process id, the condition which caused stopping or termination, ! 636: the registers and the instruction addressed by ! 637: .BR pc . ! 638: This is the default if ! 639: .I modifier ! 640: is omitted. ! 641: .TP ! 642: .B r ! 643: Print the general registers and ! 644: the instruction addressed by ! 645: .BR pc . ! 646: Dot is set to ! 647: .BR pc . ! 648: .TP ! 649: .B R ! 650: Like ! 651: .BR $r , ! 652: but include miscellaneous processor control registers ! 653: and floating point registers. ! 654: .TP ! 655: .B f ! 656: Print floating-point register values as ! 657: single-precision floating point numbers. ! 658: .TP ! 659: .B F ! 660: Print floating-point register values as ! 661: double-precision floating point numbers. ! 662: .TP ! 663: .B b ! 664: Print all breakpoints ! 665: and their associated counts and commands. `B' produces the same results. ! 666: .TP ! 667: .B c ! 668: Stack backtrace. ! 669: If ! 670: .I address ! 671: is given, it specifies the address of a pair of 32-bit ! 672: values containing the ! 673: .B sp ! 674: and ! 675: .B pc ! 676: of an active process. This allows selecting ! 677: among various contexts of a multi-threaded ! 678: process. ! 679: If ! 680: .B C ! 681: is used, the names and (long) values of all ! 682: parameters, ! 683: automatic ! 684: and static variables are printed for each active function. ! 685: If ! 686: .I count ! 687: is given, only the first ! 688: .I count ! 689: frames are printed. ! 690: .TP ! 691: .B a ! 692: Attach to the running process whose pid ! 693: is contained in ! 694: .IR address . ! 695: .TP ! 696: .B e ! 697: The names and values of all ! 698: external variables are printed. ! 699: .TP ! 700: .B w ! 701: Set the page width for output to ! 702: .I address ! 703: (default 80). ! 704: .TP ! 705: .B q ! 706: Exit from ! 707: .IR db . ! 708: .TP ! 709: .B m ! 710: Print the address maps. ! 711: .TP ! 712: .B k ! 713: Simulate kernel memory management. ! 714: .TP ! 715: .BI M machine ! 716: Set the ! 717: .I machine ! 718: type used for disassembling instructions. ! 719: .PD ! 720: .RE ! 721: .TP ! 722: .BI : modifier ! 723: Manage a subprocess. ! 724: Available modifiers are: ! 725: .RS ! 726: .TP ! 727: .PD 0 ! 728: .BI h ! 729: Halt ! 730: an asynchronously running process to allow breakpointing. ! 731: Unnecessary for processes created under ! 732: .IR db , ! 733: e.g. by ! 734: .BR :r . ! 735: .TP ! 736: .BI b c ! 737: Set breakpoint at ! 738: .IR address . ! 739: The breakpoint is executed ! 740: .IR count \-1 ! 741: times before ! 742: causing a stop. ! 743: Also, if a command ! 744: .I c ! 745: is given it is executed at each ! 746: breakpoint and if it sets dot to zero ! 747: the breakpoint causes a stop. ! 748: .TP ! 749: .B d ! 750: Delete breakpoint at ! 751: .IR address . ! 752: .TP ! 753: .B r ! 754: Run ! 755: .I textfile ! 756: as a subprocess. ! 757: If ! 758: .I address ! 759: is given the ! 760: program is entered at that point; otherwise ! 761: the standard entry point is used. ! 762: .I Count ! 763: specifies how many breakpoints are to be ! 764: ignored before stopping. ! 765: Arguments to the subprocess may be supplied on the ! 766: same line as the command. ! 767: An argument starting with < or > causes the standard ! 768: input or output to be established for the command. ! 769: .TP ! 770: .BI c s ! 771: The subprocess is continued. ! 772: If ! 773: .I s ! 774: is omitted ! 775: or nonzero, ! 776: the subprocess ! 777: is sent the note that caused it to stop. ! 778: If 0 ! 779: is specified, ! 780: no note is sent. ! 781: (If the stop was due to a breakpoint or single-step, ! 782: the corresponding note is elided before continuing.) ! 783: Breakpoint skipping is the same ! 784: as for ! 785: .BR r . ! 786: .TP ! 787: .BI s s ! 788: As for ! 789: .B c ! 790: except that ! 791: the subprocess is single stepped for ! 792: .I count ! 793: machine instructions. ! 794: If a note is pending, ! 795: it is received ! 796: before the first instruction is executed. ! 797: If there is no current subprocess then ! 798: .I textfile ! 799: is run ! 800: as a subprocess as for ! 801: .BR r . ! 802: In this case no note can be sent; the remainder of the line ! 803: is treated as arguments to the subprocess. ! 804: .TP ! 805: .BI S s ! 806: Identical to ! 807: .B s ! 808: except the subprocess is single stepped for ! 809: .I count ! 810: lines of C source. In optimized code, the correspondence ! 811: between C source and the machine instructions is ! 812: approximate at best. ! 813: .TP ! 814: .BI x ! 815: The current subprocess, if any, is released by ! 816: .I db ! 817: and allowed to continue executing normally. ! 818: .TP ! 819: .B k ! 820: The current subprocess, if any, is terminated. ! 821: .TP ! 822: .BI n c ! 823: Display the pending notes for the process. ! 824: If ! 825: .I c ! 826: is specified, first delete ! 827: .I c'th ! 828: pending note. ! 829: .PD ! 830: .RE ! 831: .SS Addresses ! 832: The location in a file or memory image associated with ! 833: an address is calculated from a map ! 834: associated with the file. ! 835: Each map contains one or more quadruples ! 836: .RI ( "t, b, e, f" ), ! 837: defining a segment named ! 838: .I t ! 839: (usually, ! 840: .IR text , ! 841: .IR data , ! 842: or ! 843: .IR ublock ) ! 844: mapping addresses in the range ! 845: .I b ! 846: through ! 847: .I e ! 848: to the part of the file ! 849: beginning at ! 850: offset ! 851: .IR f . ! 852: The memory model of a Plan 9 process assumes ! 853: that segments are disjoint. There ! 854: can be more than one segment of a given type (e.g., a process ! 855: may have more than one text segment) but segments ! 856: may not overlap. ! 857: An address ! 858: .I a ! 859: is translated ! 860: to a file address ! 861: by finding a segment ! 862: for which ! 863: .IR b ≤ a < e ; ! 864: the location in the file ! 865: is then ! 866: .IR address + f \- b . ! 867: .PP ! 868: Usually, ! 869: the text and initialized data of a program ! 870: are mapped by segments called ! 871: .I text ! 872: and ! 873: .IR data . ! 874: Since a program file does not contain bss, stack or ublock data, ! 875: these data are ! 876: not mapped by the data segment. ! 877: The text segment is mapped similarly in ! 878: a normal (i.e., non-kernel) ! 879: .IR memfile . ! 880: However, the segment called ! 881: .I data ! 882: maps memory from the beginning of the program's data space to ! 883: the base of the ublock. ! 884: This region contains the program's static data, the bss, the ! 885: heap and the stack. A segment ! 886: called ! 887: .I ublock ! 888: maps the page containing its registers and process state. ! 889: .PP ! 890: Sometimes it is useful to define a map with a single segment ! 891: mapping the region from 0 to 0xFFFFFFFF; a map of this type ! 892: allows the entire file to be examined ! 893: without address translation. ! 894: .PP ! 895: Registers are saved at a machine-dependent offset in the ublock. ! 896: It is usually not necessary to know this offset; the ! 897: .BR $r , ! 898: .BR $R , ! 899: .BR $f , ! 900: and ! 901: .BR $F ! 902: commands calculate it and display the register contents. ! 903: .PP ! 904: The ! 905: .B $m ! 906: command dumps the currently active maps. The ! 907: .B ?m ! 908: and ! 909: .B /m ! 910: commands modify the segment parameters in the ! 911: .I textfile ! 912: and ! 913: .I memfile ! 914: maps, respectively. ! 915: .SH EXAMPLES ! 916: To set a breakpoint at the beginning of ! 917: .B write() ! 918: in extant process 27: ! 919: .IP ! 920: .EX ! 921: % db 27 ! 922: :h ! 923: write:b ! 924: :c ! 925: .EE ! 926: .PP ! 927: To examine the Plan 9 kernel stack for process 27: ! 928: .IP ! 929: .EX ! 930: % db -k 27 ! 931: $C ! 932: .EE ! 933: .PP ! 934: Similar, but using a kernel named ! 935: .BR test : ! 936: .IP ! 937: .EX ! 938: % db -k test 27 ! 939: $C ! 940: .EE ! 941: .PP ! 942: To set a breakpoint at the entry of function ! 943: .B parse ! 944: when the local variable ! 945: .B argc ! 946: in ! 947: .B main ! 948: is equal to 1: ! 949: .IP ! 950: .EX ! 951: parse:b *main.argc-1=X ! 952: .EE ! 953: .PP ! 954: This prints the value of ! 955: .B argc-1 ! 956: which as a side effect sets dot; when ! 957: .B argc ! 958: is one the breakpoint will fire. ! 959: Beware that local variables may be stored in registers; see the ! 960: BUGS section. ! 961: .PP ! 962: Debug process 127 on remote machine ! 963: .BR kremvax : ! 964: .IP ! 965: .EX ! 966: % import kremvax /proc ! 967: % db 127 ! 968: $C ! 969: .EE ! 970: .SH FILES ! 971: .B /proc/*/text ! 972: .br ! 973: .B /proc/*/mem ! 974: .br ! 975: .B /proc/*/ctl ! 976: .br ! 977: .B /proc/*/note ! 978: .SH "SEE ALSO" ! 979: .IR acid (1), ! 980: .IR nm (1), ! 981: .IR proc (3) ! 982: .SH SOURCE ! 983: .B /sys/src/cmd/db ! 984: .SH DIAGNOSTICS ! 985: Exit status is null, unless the last command failed or ! 986: returned non-null status. ! 987: .SH BUGS ! 988: Examining a local variable with ! 989: .I routine.name ! 990: returns the contents of the memory allocated for the variable, but ! 991: with optimization (suppressed by the ! 992: .B -N ! 993: compiler flag) variables often reside in registers. ! 994: Also, on some architectures, the first argument is always ! 995: passed in a register. ! 996: .PP ! 997: Variables and parameters that have been ! 998: optimized away do not appear in the ! 999: symbol table, returning the error ! 1000: .IR "bad local variable" ! 1001: when accessed by ! 1002: .IR db . ! 1003: .PP ! 1004: Because of alignment incompatibilities, Motorola 68000 ! 1005: series machines can not be debugged remotely from a ! 1006: processor of a different type. ! 1007: .PP ! 1008: Breakpoints should not be set on instructions scheduled ! 1009: in delay slots. When a program stops on such a breakpoint, ! 1010: it is usually impossible to continue its execution.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.