home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VSCPPv4.zip / VACPP / IBMCPP / HELP / KDEBUG.INF (.txt) < prev    next >
OS/2 Help File  |  1995-03-10  |  94KB  |  2,899 lines

  1.  
  2. ΓòÉΓòÉΓòÉ <hidden> Debug Kernel Reference ΓòÉΓòÉΓòÉ
  3.  
  4. Select One: 
  5.  
  6.       Introduction 
  7.       Installing Debug Support 
  8.       Entering the Debugger 
  9.       Expressions 
  10.       Operator Precedence 
  11.       Binary Operators 
  12.       Unary Operators 
  13.       Numbers 
  14.       Strings 
  15.       Symbol Files 
  16.       Breakpoints 
  17.       Using Kernel Debugger Commands 
  18.       Commands (Breakpoint) 
  19.       Commands (External) 
  20.       Using Default Commands 
  21.       Setting Useful Breakpoints 
  22.       Debugging Kernel Device Drivers 
  23.       Debugging VM Start Sessions 
  24.       Debugging the CMD.EXE 
  25.       Debugging a Remote System 
  26.  
  27.  
  28. ΓòÉΓòÉΓòÉ 1. Introduction ΓòÉΓòÉΓòÉ
  29.  
  30. This section describes the use of the Kernel Debugger functions in the OS/2 
  31. system. 
  32.  
  33. This release of the OS/2 toolkit contains a copy of the OS/2 debugging kernel. 
  34. It is included to assist you in debugging your applications and drivers until 
  35. higher-level debuggers such as IPMD can provide adequate debugging functions in 
  36. complex situations. 
  37.  
  38. The Kernel Debugger is a low-level debugger oriented toward system and 
  39. device-driver debugging. 
  40.  
  41. The use of this kernel is supported as an aid in debugging your software.  We 
  42. offer support for the installation and use of the debugging kernel and its 
  43. commands and syntax. 
  44.  
  45. The Kernel Debugger is derived from the DEBUG and SYMDEB debuggers, with 
  46. enhancements to handle both real-mode and protected-mode operation. Most of the 
  47. commands and structure of this debugger are the same as for DEBUG and SYMDEB. 
  48. This document describes most of the Kernel Debugger 's commands and new 
  49. features. 
  50.  
  51. The Kernel Debugger is actually a version of the  OS/2 kernel that has a user 
  52. interface included in the kernel itself.  This interface always gets its input 
  53. from an asynchronous port, usually COM2 or COM1, and always prints its output 
  54. to the same asynchronous port. The kernel debugger is a compiled part of the 
  55. kernel. Connect a terminal to communications port 2 (COM2) to receive output 
  56. from the Kernel Debugger. To interrupt the Kernel Debugger at any time, press 
  57. Control and C (Ctrl+C) on the terminal. 
  58.  
  59. The debugger and user interface actually amount to about 80KB (where KB equals 
  60. 1024 bytes) of code and data. 
  61.  
  62. The debugger normally uses COM2 for its input and output, but if no COM2 
  63. exists, it looks for a COM1 port.  If neither COM1 or COM2 exists, it looks for 
  64. any other COM port in the ROM data area (40:0).  A three-wire null modem cable 
  65. is all that is needed, with pins 2 and 3 switched on one end of the cable. A 
  66. full null modem cable works as well. 
  67.  
  68. An asynchronous modem can be used to set up a remote debugging session. In a 
  69. remote debugging session, you call over a telephone line to the system that has 
  70. the problem. This allows you to solve problems at remote locations, using the 
  71. Kernel Debugger. 
  72.  
  73. See Setup for Remote Debugging for more information about remote debugging. 
  74.  
  75.  
  76. ΓòÉΓòÉΓòÉ 2. Installing Debug Support ΓòÉΓòÉΓòÉ
  77.  
  78. The menu-based debug installation program installs debug replacement files for 
  79. the kernel and the Presentation Manager interface. Once the program is 
  80. installed, you can install other debug files, or restore retail files, from the 
  81. OS/2 command prompt. 
  82.  
  83. During initial installation, two files are copied to the root directory of your 
  84. specified installation drive: 
  85.  
  86.  DBINST.CMD 
  87.       A command file that can be executed separately.  This file calls 
  88.       DBUGINST.EXE with the requested installation drive as a command-line 
  89.       argument. 
  90.  
  91.  DBUGINST.EXE 
  92.       This executable file is the user interface.  The user can choose which 
  93.       parts of the debug system to install, or which parts to restore to the 
  94.       retail version. 
  95.  
  96.  INSTALLING FROM DISKETTE 
  97.  
  98.  To install and start the debug installation program: 
  99.  
  100.    1. Insert Debug Diskette 1 in drive A. 
  101.  
  102.    2. At the OS/2 command prompt, type: 
  103.  
  104.       a:install c a 
  105.  
  106.        where: 
  107.  
  108.          c   is the drive where OS/2 resides. 
  109.  
  110.          a   is the diskette drive. 
  111.  
  112.       Note:  Do NOT type a colon after the drive letters. 
  113.  
  114.    3. Press Enter.  A screen appears that presents installation choices. 
  115.  
  116.  INSTALLING FROM CD-ROM OR REMOTE DISK 
  117.  
  118.  To install and start the debug installation program: 
  119.  
  120.    1. Insert the Toolkit installation CD-ROM into the CD-ROM drive. 
  121.  
  122.       Note:  If installation is from a remote disk, ensure you have access to 
  123.       it. 
  124.  
  125.    2. At the OS/2 command prompt, type : 
  126.  
  127.       d:\OS2TK21\CDINST d c 
  128.  
  129.        where: 
  130.  
  131.          d   is the drive of the CD-ROM or remote disk. 
  132.  
  133.          c   is the drive where OS/2 resides. 
  134.  
  135.       Note:  Do NOT type a colon after the drive letters. 
  136.  
  137.    3. Press Enter.  A screen appears that presents installation choices. 
  138.  
  139.  The user interface consists of a menu that provides installation choices in 
  140.  three optional parts.  It also provides the ability to restore two of those 
  141.  parts to their corresponding retail versions. 
  142.  
  143.  The menu choices are as follows: 
  144.  
  145.    o  Install utilities/symbols 
  146.    o  Install debug kernel 
  147.    o  Install debug PM 
  148.    o  Restore retail kernel 
  149.    o  Restore retail PM 
  150.  
  151.  When prompted to enter a debug installation option, choose the options in the 
  152.  order they appear on the screen. 
  153.  
  154.  When you complete the debug installation procedure, you may need to edit your 
  155.  CONFIG.SYS file. 
  156.  
  157.  
  158. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Edit CONFIG.SYS ΓòÉΓòÉΓòÉ
  159.  
  160. EDIT CONFIG.SYS - DEBUG KERNEL 
  161.  
  162. If you installed only the debug kernel, shutdown and restart your system. 
  163.  
  164. Note:  If you have a second communication port, then the output of the debug 
  165. kernel will go to that port (COM2), otherwise output will go to COM1.  Be sure 
  166. to connect your cable to the active port. 
  167.  
  168. RESTORING THE KERNEL 
  169.  
  170. To restore the retail kernel, run the debug installation program and select the 
  171. "Restore Retail Kernel" option. 
  172.  
  173. DEBUG PRESENTATION MANAGER INTERFACE 
  174.  
  175. If you have installed the debug version of the Presentation Manager Interface, 
  176. modify the DEVICE statement with the PMDD.SYS line a follows: 
  177.  
  178. DEVICE=c:\OS2\DEBUG\DLL\PMDD.SYS /Cn 
  179.  
  180. where: 
  181.  
  182.  c    is your installation drive 
  183.  n    is the communication port for debug output 
  184.  
  185.       Allowed values for n are: 
  186.  
  187.       2 if COM2 is present or 
  188.       1 if COM2 is not present 
  189.  
  190.  The DEVICE statement includes the C drive as the installation drive and allows 
  191.  you to call the debug version of PMDD.SYS from the OS2\DEBUG\DLL subdirectory. 
  192.  The /C switch is set with n as the communication port for the debug output. 
  193.  
  194.  Modify the LIBPATH statement by adding the DEBUG\DLL subdirectory as follows: 
  195.  
  196.  LIBPATH=C:\OS2\DEBUG\DLL; .... 
  197.  
  198.  Shutdown and restart your system to have the changes take effect. 
  199.  
  200.  RESTORING THE PRESENTATION MANAGER INTERFACE 
  201.  
  202.  To restore the retail Presentation Manager, do the following: 
  203.  
  204.    1. Restore the device statement: 
  205.  
  206.       DEVICE=C:\OS2\PMDD.SYS 
  207.  
  208.    2. Modify the LIBPATH statement by removing the DEBUG\DLL subdirectory. 
  209.  
  210.    3. Shutdown and restart your system to have the changes take effect. 
  211.  
  212.  
  213. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Install Utilities / Symbols ΓòÉΓòÉΓòÉ
  214.  
  215. The Install utilities / symbols option copies all the kernel and the 
  216. Presentation Manager symbol files (.SYM) to the installation partition.  The 
  217. subdirectory structure follows: 
  218.  
  219.   ΓöÇROOT
  220.        ΓööΓöÇΓöÇΓöÇΓöÇ OS2
  221.              Γö£ΓöÇΓöÇ DLL
  222.              ΓööΓöÇΓöÇ DEBUG
  223.                   ΓööΓöÇΓöÇΓöÇΓöÇ DLL
  224.  
  225.  
  226. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Install Debug Kernel ΓòÉΓòÉΓòÉ
  227.  
  228. The Install debug kernel option: 
  229.  
  230.    o  Unhides OS2KRNL in the root directory 
  231.    o  Renames it with a .RTL file name extension 
  232.    o  Replaces it with the debug version from the "DB" diskette 
  233.    o  Adds a kernel symbol file to the root directory 
  234.  
  235.      ROOT
  236.     ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  237.     Γöé OS2KRNL      Γöé
  238.     Γöé OS2KRNL.SYM  Γöé
  239.     Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  240.     Γöé OS2KRNL.RTL  Γöé
  241.     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  242.  
  243.  
  244. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Install Debug PM ΓòÉΓòÉΓòÉ
  245.  
  246. The Install debug PM option: 
  247.  
  248.    o  Unpacks debug versions of the Presentation Manager and display DLLs and 
  249.       PMDD.SYS to the \OS2\DEBUG\DLL directory 
  250.    o  Replaces the PMWIN symbol file: 
  251.  
  252.     ΓöÇROOT
  253.          ΓööΓöÇΓöÇΓöÇΓöÇΓöÇ OS2
  254.                 Γöé
  255.                 ΓööΓöÇΓöÇΓöÇ DEBUG
  256.                       Γöé
  257.                       ΓööΓöÇΓöÇΓöÇΓöÇ DLL  ΓöÇΓöÇ  ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  258.                                       Γöé PMDD.SYS  Γöé
  259.                                       Γöé PMDD.SYM  Γöé
  260.                                       Γöé PMGRE.DLL Γöé
  261.                                       Γöé PMWIN.DLL Γöé
  262.                                       Γöé PMWIN.SYM Γöé
  263.                                       Γöé PMGRE.SYM Γöé
  264.                                       ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  265.  
  266.  
  267. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Restore Retail Kernel ΓòÉΓòÉΓòÉ
  268.  
  269. The Restore retail kernel option copies the saved OS2KRNL.RTL file in the root 
  270. directory to the same name without extension, and deletes the .RTL file.  (The 
  271. kernel symbol file will be left in the root directory.) 
  272.  
  273.    ΓöÇROOT
  274.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  275.   Γöé OS2KRNL      Γöé
  276.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  277.  
  278.  
  279. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Restore Retail PM ΓòÉΓòÉΓòÉ
  280.  
  281. The Restore retail PM option describes the config.sys changes required to 
  282. restore the retail version. The debug DLLs (which are currently active) are 
  283. left in the \OS2\DEBUG\DLL subdirectory. 
  284.  
  285.  
  286. ΓòÉΓòÉΓòÉ 3. Entering the Debugger ΓòÉΓòÉΓòÉ
  287.  
  288. There are various ways to enter the debugger. The first way is during 
  289. initialization. If the following keys are pressed at the debugger's console, 
  290. the debugger is entered: 
  291.  
  292.    o  "r" - (lowercase r) enters the debugger at the beginning of system kernel 
  293.       initialization in real mode. This is very early in system initialization. 
  294.  
  295.    o  "p" - enters the debugger after going into protected mode for the first 
  296.       time.  Symbols have not been loaded yet. 
  297.  
  298.    o  "<space-bar>" - enters the debugger after most of the kernel has been 
  299.       initialized.  Symbols for the system kernel have been loaded. 
  300.  
  301.  After initialization is complete, the debugger can be entered at any time by 
  302.  pressing Ctrl+C at the debugger's console. The debugger is entered when and 
  303.  where the next timer tick occurs after the keys were pressed. This is the most 
  304.  commonly used method to enter the debugger. 
  305.  
  306.  An NMI (non maskable interrupt) switch allows you to enter the debugger even 
  307.  if interrupts are disabled. Pressing Ctrl+C does not allow this. 
  308.  
  309.  An INT 3 in the kernel or in a program will also cause the debugger to stop. 
  310.  
  311.  A kernel "panic" is an event where the  OS/2 kernel enters a state where it 
  312.  cannot continue to run the system with pure integrity. 
  313.  
  314.  When a kernel panic occurs, a message is sent to both the screen and the 
  315.  debugger port.  Before sending the message to the screen, the screen is 
  316.  cleared and set to text mode.  This can be a problem if you need to see how 
  317.  far a test case got before stopping.  If you set the byte flag fDebugOnly to 
  318.  nonzero, the message goes to the debug port only, and the screen is left 
  319.  unchanged. 
  320.  
  321.  After symbols are loaded, an initialization file named KDB.INI is read and 
  322.  executed. KDB.INI is a plain text file that, if used, resides in the root 
  323.  directory of the startup drive. Any debugger command or list of debugger 
  324.  commands can be in the KDB.INI file.  A "G" command should be at the end of 
  325.  the commands unless you want the debugger to stop after the KDB.INI file is 
  326.  executed. 
  327.  
  328.  
  329. ΓòÉΓòÉΓòÉ 4. Expressions ΓòÉΓòÉΓòÉ
  330.  
  331. The expression evaluator has been enhanced to provide support for four types of 
  332. addresses - 
  333.  
  334.  real mode           (&segment:offset) 
  335.  protected mode      (#selector:offset) 
  336.  linear address      (%dword) 
  337.  physical address    (%%dword) 
  338.  
  339.  The symbols: 
  340.  
  341.       "&" 
  342.       "#" 
  343.       "%" 
  344.       "%%" 
  345.  
  346.  override the current address type, allowing selectors to be used in real mode, 
  347.  segments to be used in protected mode, and so on.  The "%" linear address and 
  348.  the "%%" physical address operator actually convert other address types to a 
  349.  linear or physical address. For example, %(#001F:0220) looks up selector 1F's 
  350.  linear address in the current LDT, and adds hex 0220 to it. Linear and 
  351.  physical addresses are the same, unless paging is enabled on an  80386 
  352.  microprocessor. 
  353.  
  354.    o  ?  <expr> | "<string>" 
  355.  
  356.  This command evaluates the expression and prints it in all the standard 
  357.  numerical bases, along with the ASCII character for the value and the physical 
  358.  address for the address. It also prints an indication of whether the 
  359.  expression evaluated to TRUE (nonzero) or FALSE (zero). It prints a string if 
  360.  the string is surrounded by single or double quotation marks. 
  361.  
  362.  #1f:02C0       Protected-Mode address 
  363.  
  364.  &3450:1234     Real-Mode address 
  365.  
  366.  %310230        Linear address 
  367.  
  368.  %%310230       Physical address 
  369.  
  370.  Addresses can be used in any mode.  In real mode, you can use protected mode 
  371.  addresses as long as there is an override. The default depends on the current 
  372.  debugger mode. 
  373.  
  374.  The following are keywords that return the value of registers, breakpoints, 
  375.  and so on in expressions: 
  376.  
  377.    o  AX, BX, CX, DX, SI, DI, BP, DS, ES, SS, CS, SP, IP - register values 
  378.  
  379.    o  FLG - value of the flags 
  380.  
  381.    o  GDTB - value of the GDT base as a physical address 
  382.  
  383.    o  GDTL - value of the GDT limit 
  384.  
  385.    o  IDTB - value of the IDT base as a physical address 
  386.  
  387.    o  IDTL - value of the IDT limit 
  388.  
  389.    o  TR, LDTR, MSW - value of the TR, LDTR, and MSW registers 
  390.  
  391.    o  BR0, BR1,..., BR9 - the address at that breakpoint. 
  392.  
  393.       The 80386 keywords are (in addition to the above): 
  394.  
  395.    o  EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP - extended register values 
  396.  
  397.    o  FS, GS - segment registers 
  398.  
  399.    o  EFLG - value of extend flags 
  400.  
  401.    o  CR0, CR2, CR3 - control register values 
  402.  
  403.    o  DR0, DR1, DR2, DR3, DR6, DR7 - debug register values 
  404.  
  405.    o  TR6, TR7 - test register values. 
  406.  
  407.  These register names are searched for first, before the symbol table is 
  408.  searched. The "@" character can override the register name lookup, and cause a 
  409.  search of the symbol table for the name. The term "@ax" causes a search for a 
  410.  symbol called "ax", instead of evaluating to the register value. 
  411.  
  412.  
  413. ΓòÉΓòÉΓòÉ 5. Operator Precedence ΓòÉΓòÉΓòÉ
  414.  
  415. The precedence of the operators has been changed to be more like "C". 
  416.  
  417. If two or more operators have the same precedence, the expression is evaluated 
  418. from left to right. "C" evaluates unary operators from right to left, which is 
  419. more intuitive and easier to use. Expressions such as "poi #60:133" must be 
  420. written as "poi (#60:133)" because of the way the debugger handles unary 
  421. operators. 
  422.  
  423.    1. (  ) 
  424.  
  425.    2. |  : 
  426.  
  427.    3. &  #  %  %%  -  ! NOT  SEG  OFF  BY  WO  DW  POI  PORT  WPORT  (all unary 
  428.       operators) 
  429.  
  430.    4. *  /  MOD 
  431.  
  432.    5. +  - 
  433.  
  434.    6. >  <  >=  <= 
  435.  
  436.    7. ==  != 
  437.  
  438.    8. AND  XOR  OR 
  439.  
  440.    9. &&  || 
  441.  
  442.  
  443. ΓòÉΓòÉΓòÉ 6. Binary Operators ΓòÉΓòÉΓòÉ
  444.  
  445. The following operators evaluate the relationship of two arguments: 
  446.  
  447.  ( )           Parentheses, used to change order of evaluation 
  448.  
  449.  :             Address binder, binds segment/selector and offsets 
  450.  
  451.  *             Multiplication 
  452.  
  453.  /             Division 
  454.  
  455.  MOD           Modulo (remainder) 
  456.  
  457.  +             Addition 
  458.  
  459.  -             Subtraction 
  460.  
  461.  >             Greater than relational operator 
  462.  
  463.  <             Less than relational operator 
  464.  
  465.  >=            Greater than or equal to relational operator 
  466.  
  467.  <=            Less than or equal to relational operator 
  468.  
  469.  ==            Equal to operator 
  470.  
  471.  !=            Not equal to relational operator 
  472.  
  473.  AND           Bitwise AND 
  474.  
  475.  XOR           Bitwise exclusive OR 
  476.  
  477.  OR            Bitwise inclusive OR 
  478.  
  479.  &&            Logical AND 
  480.  
  481.  ||            Logical OR 
  482.  
  483.  
  484. ΓòÉΓòÉΓòÉ 7. Unary Operators ΓòÉΓòÉΓòÉ
  485.  
  486. The following operators expect a single argument. 
  487.  
  488. Ranges are an address and either a length or an end.  "4544:0 L5" is address 
  489. (4544:0) and a length of 5 objects.  If you are dumping words, 5 words are 
  490. dumped.  "#8:32 50" is a range of bytes from address "8:32" to and including 
  491. "8:50". 
  492.  
  493. Note:  For <ranges>, if the second address has a unary operator such as "&" or 
  494. "#", then it must be separated by a comma from the first. Parentheses work as 
  495. well, for example: 
  496.  
  497.  >db ds:40,%40000        Correct 
  498.  
  499.  >db ds:40 (%40000)      Correct 
  500.  
  501.  >db ds:40 %40000        Incorrect 
  502.  
  503.  These results are caused by the way in which the expression evaluator parses 
  504.  the input. 
  505.  
  506.  |             Task number/address operator 
  507.  
  508.  &             Address type is segment:offset 
  509.  
  510.  #             Address type is selector:offset 
  511.  
  512.  %             Address type is linear 
  513.  
  514.  %%            Address type is physical 
  515.  
  516.  -             Two's complement 
  517.  
  518.  !             Logical NOT operator 
  519.  
  520.  NOT           Bitwise one's complement 
  521.  
  522.  SEG           Returns the segment portion 
  523.  
  524.  OFF           Returns the offset portion 
  525.  
  526.  BY            1-byte value from the address 
  527.  
  528.  WO            2-byte value from the address 
  529.  
  530.  DW            4-byte value from the address 
  531.  
  532.  POI           4-byte address from the address 
  533.  
  534.  PORT          1-byte value from an 8-bit I/O port 
  535.  
  536.  WPORT         2-byte value from a 16-bit I/O port 
  537.  
  538.  
  539. ΓòÉΓòÉΓòÉ 8. Numbers ΓòÉΓòÉΓòÉ
  540.  
  541. The default base for numbers in the Kernel Debugger is 16 (hexadecimal). You 
  542. can add a one-letter suffix to the digits of a number to indicate the base of 
  543. the number, as shown in the following table. The term "nnnnnn" represents a 
  544. number that consists of a variable number of digits. 
  545.  
  546. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  547. Γöé Number       Γöé Base          Γöé Valid digits                   Γöé
  548. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  549. Γöé nnnnnnY      Γöé Binary        Γöé 0 1                            Γöé
  550. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  551. Γöé nnnnnnO      Γöé Octal         Γöé 0 1 2 3 4 5 6 7                Γöé
  552. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  553. Γöé nnnnnnQ      Γöé Octal         Γöé 0 1 2 3 4 5 6 7                Γöé
  554. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  555. Γöé nnnnnnT      Γöé Decimal       Γöé 0 1 2 3 4 5 6 7 8 9            Γöé
  556. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  557. Γöé nnnnnnH      Γöé Hexadecimal   Γöé 0 1 2 3 4 5 6 7 8 9 A B C D E FΓöé
  558. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  559.  
  560.  
  561. ΓòÉΓòÉΓòÉ 9. Strings ΓòÉΓòÉΓòÉ
  562.  
  563. A string can be represented as follows: 
  564.  
  565.    o  'characters' 
  566.  
  567.    o  "characters" 
  568.  
  569.  A string represents a list of ASCII values.  It can be any number and 
  570.  combination of characters enclosed in single (') or double (") quotation 
  571.  marks.  The starting and ending quotation marks must be the same type.  If a 
  572.  matching quotation mark appears inside the string, it must be given twice to 
  573.  prevent the debugger from ending the string too soon. 
  574.  
  575.  Examples: 
  576.  
  577.    o  'This is a string' 
  578.  
  579.    o  "This is a string" 
  580.  
  581.    o  'This ''string'' is okay' 
  582.  
  583.    o  "This ""string"" is okay" 
  584.  
  585.  
  586. ΓòÉΓòÉΓòÉ 10. Symbol Files ΓòÉΓòÉΓòÉ
  587.  
  588. The Kernel Debugger supports symbolic debugging. The MAPSYM utility program 
  589. converts a .MAP file to a .SYM file. When a symbol file (generated with MAPSYM) 
  590. is loaded by the operating system, the debugger can use public symbols in the 
  591. operating system, executable programs, dynamic link libraries, or any device 
  592. driver as part of an expression. The disassembler and the BL command also 
  593. display addresses symbolically if the symbol exists for the address. 
  594.  
  595. The debugger uses the MAPSYM format for the symbol file. The statement MAPSYM 
  596. MAPFILE.MAP generates the .SYM file MAPFILE.SYM. The kernel's symbols must be 
  597. on the system startup drive in the root directory, in a file named OS2KRNL.SYM. 
  598. For device drivers, the .SYM file must be in the same directory as the device 
  599. driver file with the .SYM extension. 
  600.  
  601. To load symbols for a program or module, the .SYM file must be in the same 
  602. directory as the .EXE or .DLL file, and the symbols will be loaded 
  603. automatically. 
  604.  
  605. The file name of the .SYM file must match that of the executable (program, 
  606. device driver or DLL) it corresponds to. 
  607.  
  608. There can be more than one symbol file loaded at one time, and more than one 
  609. currently active. The WA, WR and LM commands control and list the currently 
  610. active map files.  The term map file refers to the .SYM file generated by 
  611. MAPSYM.  Each newly-loaded map file starts in the active state. 
  612.  
  613. The message Symbols Linked (xxxxxxxx) is printed when a symbol file loads 
  614. successfully.  The "xxxxxxx" is the map name listed in the LM command.  The 
  615. message Symbols Unlinked (xxxxxxxxx) is printed when a program that has loaded 
  616. symbols stops and the symbol file is removed. 
  617.  
  618. Symbols are case insensitive. 
  619.  
  620.  
  621. ΓòÉΓòÉΓòÉ 11. Using Kernel Debugger Commands ΓòÉΓòÉΓòÉ
  622.  
  623. There are many Kernel Debugger commands that allow you to control execution of 
  624. the system under test. 
  625.  
  626. Most commands are one or two characters, with one-character options.  The 
  627. semicolon character (;) is the command separator, and the comma (,) or a blank 
  628. is the operand separator. 
  629.  
  630. When the syntax of the command is shown, the following conventions are used: 
  631.  
  632.    o  Arguments between square brackets ([ ]) are optional. 
  633.  
  634.    o  A vertical bar (|) indicates that either argument is acceptable. 
  635.  
  636.  The definitions of some of the arguments used in the commands are as follows: 
  637.  
  638.        <range>  = <addr> [<word>] | [<addr>] [L <word>] 
  639.  
  640.        <addr>  = [& | #][<word>:]<word> | %<dword> 
  641.  
  642.        <list>  = <byte>, <byte>, ... | "string" 
  643.  
  644.        <string> = "char" | 'char' 
  645.  
  646.        <dword>, 
  647.  
  648.        <word> , 
  649.  
  650.        <byte>  = evaluate to the size indicated in the symbols <>. 
  651.  
  652.  Some examples of how to use the debugger follow: 
  653.  
  654.        ##? 
  655.  
  656.  This command gets you a help screen, and '.?' gets you a help screen for the 
  657.  extended commands. 
  658.  
  659.        ##.P 
  660.  
  661.  This command displays all of the processes running in the system.  The 
  662.  left-hand column of this display shows the 'slot number', which is important 
  663.  for the '.ss' command. 
  664.  
  665.  When you set a breakpoint in an application, the current debugger 'context' 
  666.  must be changed to that process.  For example, if you press Ctrl+C and you 
  667.  interrupt while 'BAR.EXE' is executing, but you want to set a breakpoint in 
  668.  'FOO.EXE', you must change the debugger context to 'FOO.EXE'. 
  669.  
  670.        ##SS [slot number] 
  671.  
  672.  Type '.p', find out the slot number of 'FOO.EXE', and type '.ss [slot 
  673.  number]'. Now you can set breakpoints in 'FOO.EXE'. Because .DLLs have no 
  674.  'process' associated with them, in order to set a breakpoint in a .DLL you 
  675.  need to be in the context of an application that is dynamically linked to that 
  676.  .DLL. 
  677.  
  678.        ##BP [addr] 
  679.  
  680.  This sets a break point at the address [addr].  [addr] can be symbolic or 
  681.  numerical. For 32-bit applications, this is a 32-bit address. For 16-bit 
  682.  applications, this is a 16-bit address. 
  683.  
  684.       ##BC [bp number] 
  685.  
  686.       ##BD [bp number] 
  687.  
  688.       ##BC * 
  689.  
  690.       ##BD * 
  691.  
  692.  'BC [bp number]' clears a breakpoint, while 'BD' disables it. 'BC *' clears 
  693.  all breakpoints, while 'BD *' disables all breakpoints. 
  694.  
  695.       ##DA [addr] 
  696.  
  697.       ##DB [addr] 
  698.  
  699.       ##DW [addr] 
  700.  
  701.       ##DD [addr] 
  702.  
  703.  The above commands stand for 'dump ASCII', 'dump byte', 'dump word' and 'dump 
  704.  doubleword' respectively, and display memory starting at address [addr].  DW 
  705.  [addr] L 20 would display hex 20 words starting at [addr]. 
  706.  
  707.        ##E [addr] 
  708.  
  709.  This allows you to edit memory (change memory contents) at [addr]. 
  710.  
  711.        ##K 
  712.  
  713.  This gives a stack-frame backtrace of the current application (even at ring 
  714.  0). 
  715.  
  716.        ##.K [slot number] 
  717.  
  718.  This gives a stack-frame backtrace of the thread in this slot. If you are in 
  719.  ring 0, this causes a ring-3 backtrace. 
  720.  
  721.        ##DD SS:ESP 
  722.  
  723.  This dumps the stack data at the current top of the stack. 'ESP' always points 
  724.  to the last value pushed onto the stack. 
  725.  
  726.        ##DD SS:EBP 
  727.  
  728.  This is what links 'C' stack-frames together at any time.  The 'EBP' register 
  729.  points to the location on the stack where the old 'EBP' is saved. After 'EBP' 
  730.  is located on the stack, you get the return address and then the parameters 
  731.  passed to the function that is currently executing. References to [EBP+n] 
  732.  refer to passed parameters, while references to [EBP-n] refer to local 
  733.  variables. 
  734.  
  735.        ##G 
  736.  
  737.  This means 'go' or execute. 
  738.  
  739.        ##R 
  740.  
  741.  This dumps the register set. To set a register, type 'r [reg] = value'. For 
  742.  example, 'r EAX = 6' puts 6 into register EAX. To re-execute some code or to 
  743.  jump ahead in the code, reset the instruction pointer by typing 'r 
  744.  EIP=[addr]'. 
  745.  
  746.        ##P 
  747.  
  748.  This steps through the code using the INT 3 type of stepping to step over 
  749.  function calls. 
  750.  
  751.  Note:  If a function exits to an address other than the return address (where 
  752.  the INT 3 is waiting), you might get unexpected results. Keep track of what 
  753.  happens within the conditional jump and looping constructs of your program. 
  754.  
  755.        ##T 
  756.  
  757.  This single-steps through the code. This does not use the INT 3 type of 
  758.  stepping as 'p' does, but actually steps into any call to a function. 
  759.  
  760.  
  761. ΓòÉΓòÉΓòÉ 12. The Breakpoint (BP) Command ΓòÉΓòÉΓòÉ
  762.  
  763. A breakpoint command is a string of any debugger commands that are executed 
  764. when that breakpoint is hit. Semicolons (;) separate commands from one another. 
  765. All command text is forced to uppercase unless surrounded by single quotation 
  766. marks. Two single or double quotation marks remove their special meaning. 
  767.  
  768. There are two kinds of breakpoints in the Kernel Debugger: temporary (sometimes 
  769. called GO breakpoints) and sticky.  Temporary breakpoints are set when the GO 
  770. command is executed, and are removed when the debugger is entered again for any 
  771. reason (hitting a GO or sticky breakpoint, a trap or fault, and so on). Sticky 
  772. breakpoints are created, removed, and disabled with the commands defined below. 
  773.  
  774. If a passcount greater than 0 is used, the breakpoint must be executed that 
  775. many times before the debugger actually breaks. The default for passcount is 0. 
  776.  
  777. If you set a breakpoint in an LDT segment when a thread other than thread 1 is 
  778. running, that breakpoint will be moved to thread 1 when the current thread ends 
  779. (so that it can still be addressed).  When thread 1 ends, the breakpoint will 
  780. be disabled, and its address will be marked as invalid.  When that task slot is 
  781. reused, the breakpoint can be enabled again. 
  782.  
  783. On an 80386 processor, the debug registers can be used in a sticky breakpoint. 
  784. See the BR command. 
  785.  
  786.        ##BP[n] [<address>] [<passcount>] [<breakpoint commands>] 
  787.  
  788.  This command sets a new breakpoint, or changes an old sticky breakpoint. The 
  789.  "n" is an optional breakpoint number to select an old breakpoint for changing 
  790.  or forcing a new breakpoint to a certain number. If the breakpoint number is 
  791.  omitted, the first available breakpoint number is used. The number must be 
  792.  just after the "BP", with no intervening space. It must be a digit from '0' to 
  793.  '9'. There must be a space after the number. Up to 10 breakpoints can be set. 
  794.  The address is required for all new breakpoints. Either an address or a 
  795.  breakpoint number can be used to change an existing breakpoint. A breakpoint 
  796.  command or passcount can be added or changed with commands such as BP0 "DB 
  797.  DS:ESI;R" or BP2 5. 
  798.  
  799.        ##BR[<bp>] E|W|R|1|2|4 [<addr>] [<passcnt>] ["<bp cmds>"] 
  800.  
  801.  This command sets an 80386 debug register.  Debug registers can be used to 
  802.  break on data reads and writes, and instruction execution.  This is the same 
  803.  action used by a regular breakpoint).  Up to 4 debug registers can be set and 
  804.  enabled at one time.  Disabled BR breakpoints no longer occupy a debug 
  805.  register.  The flag definitions are: 
  806.  
  807.  Flag      Description 
  808.  
  809.  1         One-byte length (default) 
  810.  
  811.  2         Word length on a word boundary 
  812.  
  813.  4         Doubleword length on a doubleword boundary 
  814.  
  815.  E         Break on instruction execution only (one-byte length only) 
  816.  
  817.  W         Break on writes only 
  818.  
  819.  R         Break on reads and writes 
  820.  
  821.  For one-byte breakpoints, the linear address alignment can be anywhere; 
  822.  however, for word-length breakpoints the linear address must be on a word 
  823.  boundary.  For a doubleword-length breakpoint, the linear address must be on a 
  824.  doubleword boundary.  The debugger converts the address to linear, and prints 
  825.  an error message if the alignment is incorrect. 
  826.  
  827.  Only addresses that can be converted to linear (segment, selector, and linear, 
  828.  but not physical) can be used in the BR command address. The rest of the 
  829.  arguments are exactly like a BP command. 
  830.  
  831.       ##BT[<n>] [<address>] 
  832.  
  833.  Sets a time-stamping breakpoint. 
  834.  
  835.       ##BS 
  836.  
  837.  Shows the time-stamp entries. 
  838.  
  839.       ##BL 
  840.  
  841.  This command lists the currently set breakpoints along with the current and 
  842.  original passcount and the breakpoint command, if any.  An "e" after the 
  843.  breakpoint number means that the breakpoint is enabled; a "d" means that it is 
  844.  disabled.  After either one of those, there may be an "i" which indicates that 
  845.  the address was invalid the last time the debugger tried to set or clear the 
  846.  breakpoint. 
  847.  
  848.       ##BC[n],[n],... 
  849.  
  850.  Removes (clears) the list of breakpoint numbers from the debugger's breakpoint 
  851.  table. 
  852.  
  853.       ##BE[n],[n],... 
  854.  
  855.  Enables the list of breakpoint numbers. 
  856.  
  857.       ##BD[n],[n],... 
  858.  
  859.  Disables the list of breakpoint numbers, so the breakpoint is not actually put 
  860.  into the code but is saved until it is enabled. 
  861.  
  862.  
  863. ΓòÉΓòÉΓòÉ 13. Breakpoint Commands ΓòÉΓòÉΓòÉ
  864.  
  865. The following is a list of breakpoint commands: 
  866.  
  867.  ?    Help (?) 
  868.  BC   Break Clear 
  869.  BD   Break Disable 
  870.  BE   Break Enable 
  871.  BL   Break List 
  872.  BP   Breakpoint 
  873.  BR   Break Register 
  874.  BS   Break Show time stamps 
  875.  BT   Break Time stamp 
  876.  C    Compare 
  877.  D    Dump memory 
  878.  DB   Dump memory in Bytes 
  879.  DD   Dump memory in Dwords 
  880.  DG   Dump GDT entries 
  881.  DI   Dump IDT entries 
  882.  DL   Dump LDT entries 
  883.  DW   Dump memory in Words 
  884.  E    Enter 
  885.  F    Fill 
  886.  GO   Go 
  887.  H    Hex 
  888.  I    Input 
  889.  J    Conditional Execution 
  890.  K    Stack trace 
  891.  LA   List Absolute symbols 
  892.  LG   List active Groups 
  893.  LM   List Maps 
  894.  LN   List Near symbols 
  895.  LS   List all Symbols 
  896.  M    Move 
  897.  O    Output 
  898.  P    Ptrace 
  899.  R    Register 
  900.  S    Search 
  901.  T    Trace Point 
  902.  U    Unassemble 
  903.  VC   Clear Interrupt and trap Vector 
  904.  VL   List Interrupt and trap Vector 
  905.  VT   Add Interrupt and trap Vector 
  906.  VS   Add Interrupt and trap Vector 
  907.  WA   Add active map 
  908.  WR   Remove active map 
  909.  Y    Debugger option 
  910.  
  911.  
  912. ΓòÉΓòÉΓòÉ 14. External Commands ΓòÉΓòÉΓòÉ
  913.  
  914. The debug external (dot) commands include the following: 
  915.  
  916.  .?             Help for external commands 
  917.  .B             COM port Baud rate 
  918.  .C             Dump ABIOS Common data area 
  919.  .D             Dump DOS data structures 
  920.  .I             Swap In page 
  921.  .IT            Swap In TSD 
  922.  .K             User stack trace 
  923.  .LM            Print MTE segment table 
  924.  .MA            Memory Arena record dump 
  925.  .MC            Memory Context record dump 
  926.  .ML            Memory ALias record dump 
  927.  .MO            Memory Object record dump 
  928.  .MP            Memory Page frame dump 
  929.  .MV            Memory Virtual page structure dump 
  930.  .P             Print Process information 
  931.  .R             User Register 
  932.  .REBOOT        Restart the system 
  933.  .S             Task context change 
  934.  .T             RAS Trace buffer print 
  935.  
  936.  
  937. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The COMPARE (C) Command ΓòÉΓòÉΓòÉ
  938.  
  939.       ##C <range> <addr> 
  940.  
  941.  This command compares the bytes in the memory location specified by <range> 
  942.  with the corresponding bytes in the memory locations beginning at <addr>.  If 
  943.  all corresponding bytes match, the Kernel Debugger displays its prompt and 
  944.  waits for the next command. If one or more corresponding bytes do not match, 
  945.  each pair of mismatched bytes is displayed. 
  946.  
  947.  
  948. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The DUMP (D) Command ΓòÉΓòÉΓòÉ
  949.  
  950.       ##D [<range>] 
  951.  
  952.  Dumps memory in the last format used. 
  953.  
  954.       ##DA [<range>] 
  955.  
  956.  Dumps memory in ASCII format only. 
  957.  
  958.       ##DB [<range>] 
  959.  
  960.  Dumps memory in bytes and ASCII. 
  961.  
  962.       ##DW [<range>] 
  963.  
  964.  Dumps memory in words. 
  965.  
  966.       ##DD [<range>] 
  967.  
  968.  Dumps memory in doublewords. 
  969.  
  970.       ##DG[A] [<range>] 
  971.  
  972.  This command dumps the global descriptor table (GDT). The "A" option causes 
  973.  all the entries to be dumped (not just the valid entries).  The default is to 
  974.  display only the valid GDT entries.  A range of entries or just one GDT entry 
  975.  can be displayed.  If the command is passed an LDT selector, it displays "LDT" 
  976.  and the appropriate LDT entry. 
  977.  
  978.       ##DI[A] [<range>] 
  979.  
  980.  This command dumps the interrupt descriptor table.  The A option causes all 
  981.  the entries to be dumped (not just the valid entries).  The default is to 
  982.  display just the valid IDT entries.  A range of entries or just one IDT entry 
  983.  can be displayed. 
  984.  
  985.       ##DL[A|P|S|H] [<range>] 
  986.  
  987.  This command dumps the local descriptor table.  The A option causes all the 
  988.  entries to be dumped (not just the valid entries).  The default is to display 
  989.  just the valid LDT entries.  A range of entries or just one LDT entry can be 
  990.  displayed.  If the command is passed a GDT selector, it displays "GDT" and the 
  991.  appropriate GDT entry. 
  992.  
  993.  The options P, S, and H are used to dump private, shared, or huge segment 
  994.  selectors respectively.  To dump the huge segment selectors, give the shadow 
  995.  selector, followed by the maximum number of selectors reserved for that 
  996.  segment, plus 1. 
  997.  
  998.       ##DP[A|D] [<range>] 
  999.  
  1000.  This command dumps the page directory and page tables.  Page tables are always 
  1001.  skipped if the corresponding page directory entry is not present.  Page 
  1002.  directory entries appear with an asterisk next to the page frame, and are 
  1003.  dumped once preceding a 4-megabyte region. As a general rule, you can ignore 
  1004.  any lines beginning with an asterisk. 
  1005.  
  1006.  The A option dumps all present page directory and page table entries; the 
  1007.  default is to skip page directory and page table entries that are zero.  A 
  1008.  zero page table entry means that the page is uncommitted. 
  1009.  
  1010.  The D option dumps only page directory entries.  If a count is given as part 
  1011.  of the optional range, it is interpreted as a page directory entry count.  For 
  1012.  example: 
  1013.  
  1014.     ##dp ff000 l4
  1015.      linaddr   frame   pteframe  state res Dc Au CD WT Us rW Pn state
  1016.     %000ff000* 00343  frame=00343  2    0  D  A        U  W  P  resident
  1017.     %000ff000  000ff  frame=000ff  1    0  c  A        U  W  P  uvirt
  1018.     %00100000  002ae  frame=002ae  0    0  c  A        U  W  P  pageable
  1019.     %00101000  00215  vp id=0083c  0    0  c  u        U  W  n  pageable
  1020.     %00102000         vp id=0083d  0    0  c  u        U  W  n  pageable
  1021.  
  1022.                           bit   bit
  1023.                           set  clear
  1024.                           ---  -----
  1025.                    key:    D    c    Dirty / clean
  1026.                            A    u    Accessed / unaccessed
  1027.                            U    s    User / supervisor
  1028.                            W    r    Writable / read-only
  1029.                            P    n    Present / not-present
  1030.  
  1031.  The pteframe field contains the contents of the high-order 20 bits in the PTE. 
  1032.  If the page is present, that value is the high-order 20 bits of the physical 
  1033.  address that the page maps. To find out information about that physical 
  1034.  address, you can issue the .MP command. If the page is not present, the 
  1035.  pteframe field contains an index into the Virtual Page (VP) structure. The .MV 
  1036.  command can dump information from that structure. A non present page might 
  1037.  still be cross-linked to a page of physical memory via the VP, and if it is, 
  1038.  that physical address is in the frame column. 
  1039.  
  1040.  An exception is that uvirt pages (noted in the state column) are direct 
  1041.  mappings of physical memory, without any other page manager structures 
  1042.  associated with them. 
  1043.  
  1044.       ##DT [<addr>] 
  1045.  
  1046.  This command dumps the TSS.  If no address is given, it dumps the current TSS 
  1047.  pointed to by the TR register, extracting the type (16-bit or 32-bit) from the 
  1048.  descriptor access byte. If an address is given, the type is extracted from the 
  1049.  386env flag. 
  1050.  
  1051.       ##DX 
  1052.  
  1053.  This command dumps the 80286 loadall buffer. 
  1054.  
  1055.  
  1056. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The ENTER (E) Command ΓòÉΓòÉΓòÉ
  1057.  
  1058.       ##E <addr> [<list>] 
  1059.  
  1060.  This command enters one or more byte values into memory at the specified 
  1061.  <addr>.  If the optional <list> is given, the command replaces the byte at the 
  1062.  given address and the bytes at each subsequent address until all values in the 
  1063.  list have been used. If no <list> is given, the command prompts for a 
  1064.  replacement value. 
  1065.  
  1066.  If an error occurs, all byte values remain unchanged. 
  1067.  
  1068.  If you do not supply a <list>, the Kernel Debugger prompts for a new value at 
  1069.  <addr> by displaying this address and its current value followed by a dot (.). 
  1070.  You can then replace the value, skip to the next value, return to a previous 
  1071.  value, or exit the command by following these steps: 
  1072.  
  1073.    o  To replace the byte value, simply type the new value after the current 
  1074.       value.  Make sure you type a 1-digit or 2-digit hexadecimal number.  The 
  1075.       command ignores extra trailing digits or other characters. 
  1076.  
  1077.    o  To skip to the next byte, press the Spacebar.  Once you have skipped to 
  1078.       the next byte, you can change its value or skip to the next byte.  If you 
  1079.       skip beyond an 8-byte boundary, the Kernel Debugger starts a new display 
  1080.       line by displaying the new address and value. 
  1081.  
  1082.    o  To return to the preceding byte, type a hyphen (-). When you return to 
  1083.       the preceding byte, the Kernel Debugger starts a new display line with 
  1084.       the address and value of that byte. 
  1085.  
  1086.    o  To exit the E command, press Return. You can exit the command at any 
  1087.       time. 
  1088.  
  1089.  
  1090. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The FILL (F) Command ΓòÉΓòÉΓòÉ
  1091.  
  1092.       ##F <range> <list> 
  1093.  
  1094.  This command fills the addresses in the given <range> with the values in the 
  1095.  <list>.  If the range specifies more bytes than the number of values in the 
  1096.  list, the list is repeated until all bytes in the range are filled.  If <list> 
  1097.  has more values than the number of bytes in the range, the command ignores any 
  1098.  extra values. 
  1099.  
  1100.  
  1101. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The GO (G) Command ΓòÉΓòÉΓòÉ
  1102.  
  1103.        ##G[S][T][=<start-address>][<break-address>],,, 
  1104.  
  1105.  This command passes execution control to the program at the given 
  1106.  <start-address>.  Execution continues to the end of the code or until a 
  1107.  <break-address> is encountered.  The debug code also stops at any breakpoints 
  1108.  set using the Breakpoint Set command. 
  1109.  
  1110.  If no <start-address> is given, the command passes execution to the address 
  1111.  specified by the current values of the CS and IP registers. The equal sign (=) 
  1112.  can be used only when a <start-address> is given. 
  1113.  
  1114.  If a <break-address> is given, it must specify an instruction address (that 
  1115.  is, the address must contain the first byte of an instruction opcode).  Up to 
  1116.  ten addresses can be given at one time. The addresses can be given in any 
  1117.  order.  Only the first address encountered during execution causes a break. 
  1118.  All others are ignored.  If you attempt to set more than ten breakpoints, an 
  1119.  error message is displayed. 
  1120.  
  1121.  The S option prints the time (in PERFVIEW timer ticks) from when the system is 
  1122.  started with GS until the next entry is made in the debugger. No attempt is 
  1123.  made to calculate and remove debugger overhead from the measurement. 
  1124.  
  1125.  The T option allows trapped exceptions to resume at the original trap handler 
  1126.  address without having to unhook the exception. Instead of issuing the vcp d; 
  1127.  t; and vsp d commands, you can use the T option of the GO command. 
  1128.  
  1129.  When execution of the debug code reaches a breakpoint, the kernel debugger 
  1130.  normally displays the current values of the registers and flags.  It also 
  1131.  displays the next instruction to be executed. If the default command (Z) has 
  1132.  been changed to something other than the REGISTER (R) command, the debugger 
  1133.  executes the command list set by the last ZS command. 
  1134.  
  1135.  
  1136. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The HELP/PRINT (?) Command ΓòÉΓòÉΓòÉ
  1137.  
  1138.       ##?[<expr>]|'string' 
  1139.  
  1140.  This command prints help if no arguments are given. If an expression is given, 
  1141.  it prints the value of the evaluated expression in all bases. If a string is 
  1142.  given, it prints the string on the console. 
  1143.  
  1144.  
  1145. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Hex (H) Command ΓòÉΓòÉΓòÉ
  1146.  
  1147.       ##H <value1> <value2> 
  1148.  
  1149.  This command displays the sum and difference of two hexadecimal numbers. The 
  1150.  debugger adds <value1> to <value2> and displays the result. It then subtracts 
  1151.  <value2> from <value1> and displays that result. The results are displayed on 
  1152.  one line and are always hexadecimal. See the "Help/Print Expression" command 
  1153.  for a more general expression display. 
  1154.  
  1155.  
  1156. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The INPUT (I) Command ΓòÉΓòÉΓòÉ
  1157.  
  1158.       ##I <port> 
  1159.  
  1160.  This command reads and displays 1 byte from the given input <port>. The <port> 
  1161.  can be any 16-bit port address. 
  1162.  
  1163.  
  1164. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The List Near Symbol Command (LN) Command ΓòÉΓòÉΓòÉ
  1165.  
  1166.       ##LN [<addr>] 
  1167.  
  1168.  This command lists the nearest symbol both forward from and backward to the 
  1169.  address passed.  The default is the current disassembly address. All the 
  1170.  active maps are searched. 
  1171.  
  1172.  There is the possibility that there will be duplicates when <addr> is 
  1173.  specified as a selector:offset. Make sure that you have selected the correct 
  1174.  slot (with the .S command) before you issue the LN command with a 
  1175.  selector:offset. 
  1176.  
  1177.  
  1178. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The List Groups (LG) Command ΓòÉΓòÉΓòÉ
  1179.  
  1180.       ##LG [<mapname>] 
  1181.  
  1182.  This command lists the selector or segment and the name for each group in the 
  1183.  active maps or the specified map. 
  1184.  
  1185.  
  1186. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The List Maps (LM) Command ΓòÉΓòÉΓòÉ
  1187.  
  1188.       ##LM 
  1189.  
  1190.  This command lists all the current symbol files that are loaded and shows 
  1191.  which ones are active. 
  1192.  
  1193.  
  1194. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The List Absolute Symbols (LA) Command ΓòÉΓòÉΓòÉ
  1195.  
  1196.       ##LA [<mapname>] 
  1197.  
  1198.  This command lists all the absolute symbols in the active maps or the 
  1199.  specified map. 
  1200.  
  1201.  
  1202. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The List Symbols (LS) Command ΓòÉΓòÉΓòÉ
  1203.  
  1204.       ##LS <addr> 
  1205.  
  1206.  This command lists all the symbols in the group that the address is in. 
  1207.  
  1208.  
  1209. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Add/Remove Active Map (WA/WR) Commands ΓòÉΓòÉΓòÉ
  1210.  
  1211.       ##WA <mapname> | * 
  1212.  
  1213.       ##WR <mapname> | * 
  1214.  
  1215.  "WA" adds a map to the active list.  "WR" removes it. 
  1216.  
  1217.  
  1218. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Conditional Execution (J) Command ΓòÉΓòÉΓòÉ
  1219.  
  1220.       ##J <expr> [<command list>] 
  1221.  
  1222.  This command executes the command list if the expression evaluates to TRUE 
  1223.  (nonzero).  Otherwise, it continues to the next command in the command line 
  1224.  (not including the ones in the "command list"). The command list must be in 
  1225.  single or double quotation marks if there is more than more command (separated 
  1226.  by ";"). A single command, or no command, can also be used without quotation 
  1227.  marks. This command can be used in breakpoint commands to conditionally break 
  1228.  when an expression becomes true, or even in the default command (Z). 
  1229.  
  1230.  The command BP 167:1454 "J AX == 0; G" breaks when AX equals 0 when this 
  1231.  breakpoint is hit. 
  1232.  
  1233.  The command BP 167:1452 "J BY (DS:SI+3) == 40 'R; G';DG DS" prints the 
  1234.  registers and continues execution, if when this breakpoint is hit the byte 
  1235.  pointed to by "DS:SI+3" is equal to 40.  Otherwise, it prints the descriptor 
  1236.  table entry in DS. 
  1237.  
  1238.  The command BP 156:1455 "J (MSW AND 1) == 1 'G'" breaks when the breakpoint is 
  1239.  reached in real mode.  BP 156:1455 "J (MSW AND 1)" is a shortcut that does the 
  1240.  same thing (like "C" Boolean expressions). 
  1241.  
  1242.  See the default command (Z) for more examples. 
  1243.  
  1244.  
  1245. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Stack Trace (K) Command ΓòÉΓòÉΓòÉ
  1246.  
  1247.       ##K[S|B] [<SS:EBP>] [<CS:EIP>] 
  1248.  
  1249.  This command threads through the BP chain on the stack and prints the address, 
  1250.  4 words or doublewords of parameters, and any symbol found for the address. 
  1251.  The starting stack frame address (SS:EBP) and the initial code segment 
  1252.  (CS:EIP) can be specified.  Defaults are SS:EBP and CS:EIP.  The "S" (Small) 
  1253.  option indicates that the frame is 16 bits wide, and the "B" (Big) option 
  1254.  indicates that the frame is 32 bits wide.  The default depends on the D bit in 
  1255.  the CS selector. 
  1256.  
  1257.  
  1258. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Move (M) Command ΓòÉΓòÉΓòÉ
  1259.  
  1260.       ##M <range> <addr> 
  1261.  
  1262.  This command moves the block of memory specified by <range> to the location 
  1263.  starting at <addr>. 
  1264.  
  1265.  All moves are guaranteed to be performed without data loss, even when the 
  1266.  source and destination blocks overlap.  This means the destination block is 
  1267.  always an exact duplicate of the original source block.  If the destination 
  1268.  block overlaps some portion of the source block, the original source is 
  1269.  changed. 
  1270.  
  1271.  To prevent data loss, this command copies data from the source block's lowest 
  1272.  address first whenever the source is at a higher address than the destination. 
  1273.  If the source is at a lower address, this command copies data from the 
  1274.  source's highest address first. 
  1275.  
  1276.  
  1277. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Output (O) Command ΓòÉΓòÉΓòÉ
  1278.  
  1279.       ##O <port> <byte> 
  1280.  
  1281.  This command sends the given <byte> to the specified output <port>.  The 
  1282.  <port> can be any 16-bit port address. 
  1283.  
  1284.  
  1285. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Ptrace (P) Command ΓòÉΓòÉΓòÉ
  1286.  
  1287.       ##P[N|T] [=<start-address>] [<count>] 
  1288.  
  1289.  This command executes the instruction at the given <start-address>, and then 
  1290.  displays the current values of the all the registers and flags (or whatever 
  1291.  the Z command has been set to). 
  1292.  
  1293.  The difference between PTRACE and TRACE commands is that PTRACE stops after 
  1294.  instructions such as CALL, REP MOVSB, and so on, instead of tracing into the 
  1295.  call or each rep string operation. 
  1296.  
  1297.  If the optional <start-address> is given, the command starts execution at the 
  1298.  given address.  Otherwise, it starts execution at the instruction pointed to 
  1299.  by the current CS and IP registers.  The equal sign (=) may be used only if a 
  1300.  <start-address> is given. 
  1301.  
  1302.  If the optional <count> is given, the command continues to execute <count> 
  1303.  instructions before stopping.  The command displays the current values of the 
  1304.  registers and flags for each instruction before executing the next. 
  1305.  
  1306.  The "N" option suppresses the register display, so that only the assembly line 
  1307.  is displayed.  This only works if the "default command" (see the Z command) is 
  1308.  an "R" (the normal setting). 
  1309.  
  1310.  The "T" option allows the original trap handler address to be traced into 
  1311.  without having to unhook the exception. Instead of issuing the "vcp d; t; vsp 
  1312.  d" commands, you can use the "T" option of the PTRACE command. 
  1313.  
  1314.  
  1315. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Register (R) Command ΓòÉΓòÉΓòÉ
  1316.  
  1317.       ##R[T][<register-name> [<value>]] 
  1318.  
  1319.  This command displays the contents of a CPU register and allows the contents 
  1320.  to be changed to a new value. 
  1321.  
  1322.  The T option toggles the "regterse" flag (see the Y command). 
  1323.  
  1324.  If no <register-name> is given, the command displays all the registers, flags, 
  1325.  and the instruction at the address pointed to by the current CS and IP 
  1326.  register values. 
  1327.  
  1328.  If a <register-name> is given, the command displays the current value of the 
  1329.  given register, and prompts for a new value.  If both a <register-name> and 
  1330.  <value> are given, the command changes the register to the given value. 
  1331.  
  1332.  The <register-name> can be any one of the following names: 
  1333.  
  1334.    o  AX, BX, CX, DX, SI, DI, BP, SP, IP, PC - general registers. 
  1335.  
  1336.    o  DS, ES, SS, CS - segment registers. 
  1337.  
  1338.    o  GDTB - GDT base as a linear address. 
  1339.  
  1340.    o  GDTL - GDT limit. 
  1341.  
  1342.    o  IDTB - IDT base as a linear address. 
  1343.  
  1344.    o  IDTL - IDT limit. 
  1345.  
  1346.    o  TR, LDTR - TR, LDTR registers. 
  1347.  
  1348.    o  IOPL - input/output privilege level portion of flag registers. 
  1349.  
  1350.    o  F - flag register. 
  1351.  
  1352.    o  MSW - Machine status word. 
  1353.  
  1354.  The 80386 <register-names> are the following (in addition to the above): 
  1355.  
  1356.    o  EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP - extended general registers. 
  1357.  
  1358.    o  FS, GS - segment registers. 
  1359.  
  1360.    o  EF - extended flag register. 
  1361.  
  1362.    o  CR0, CR2, CR3 - control registers. 
  1363.  
  1364.    o  DR0, DR1, DR2, DR3, DR6, DR7 - debug registers. 
  1365.  
  1366.    o  TR6, TR7 - test registers. 
  1367.  
  1368.  IP and PC name the same register - the Instruction Pointer. F is a special 
  1369.  name for the Flags register. 
  1370.  
  1371.  To change a register value, supply name of the register when you enter the 
  1372.  REGISTER command.  If you do not also supply a value, the command displays the 
  1373.  name of the register, its current value, and a colon prompt.  Type the new 
  1374.  value, and press Return.  If you do not want to change the value, just press 
  1375.  Return.  If you enter a name that is not allowed, the command displays an 
  1376.  error message. 
  1377.  
  1378.  To change a flag value, supply the register name F when you enter the REGISTER 
  1379.  command.  The command displays the current value of each flag as a two-letter 
  1380.  name.  The following is a table of flag values: 
  1381.  
  1382.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1383.   Γöé          Values for the Flag Register                          Γöé
  1384.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1385.   Γöé FLAG             Γöé SET                  Γöé CLEAR                Γöé
  1386.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1387.   Γöé Overflow         Γöé OV                   Γöé NV                   Γöé
  1388.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1389.   Γöé Direction        Γöé DN (Decrement)       Γöé UP (Increment)       Γöé
  1390.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1391.   Γöé Interrupt        Γöé EI (Enabled)         Γöé DI (Disabled)        Γöé
  1392.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1393.   Γöé Sign             Γöé NG (Negative)        Γöé PL (Plus)            Γöé
  1394.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1395.   Γöé Zero             Γöé ZR                   Γöé NZ                   Γöé
  1396.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1397.   Γöé Aux Carry        Γöé AC                   Γöé NA                   Γöé
  1398.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1399.   Γöé Parity           Γöé PE (Even)            Γöé PO (Odd)             Γöé
  1400.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1401.   Γöé Carry            Γöé CY                   Γöé NC                   Γöé
  1402.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1403.   Γöé Nested Task      Γöé NT                   Γöé (toggles)            Γöé
  1404.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1405.  
  1406.  At the end of the list of values, the command displays a hyphen (-). When you 
  1407.  see the hyphen, enter new values for the flags you want to change, and then 
  1408.  press Return.  You can enter flag values in any order.  Spaces between values 
  1409.  are not required.  Flags for which new values are not entered remain 
  1410.  unchanged.  If you do not want to change any flags, just press Return. 
  1411.  
  1412.  If you enter a name other than those shown above, the command prints an error 
  1413.  message.  The flags up to the error are changed; flags at and after the error 
  1414.  are not changed. 
  1415.  
  1416.  Changing the MSW (Machine Status Word) is the same as changing the flag 
  1417.  registers, but with the following flag names: 
  1418.  
  1419.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1420.   Γöé          Values for the Machine Status Word                Γöé
  1421.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1422.   Γöé FLAG                             Γöé SET    Γöé CLEAR          Γöé
  1423.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1424.   Γöé Protected Mode                   Γöé PM     Γöé (toggles)      Γöé
  1425.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1426.   Γöé Monitor Processor Extension      Γöé MP     Γöé (toggles)      Γöé
  1427.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1428.   Γöé Emulate Processor Extension      Γöé EM     Γöé (toggles)      Γöé
  1429.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1430.   Γöé Task Switched                    Γöé TS     Γöé (toggles)      Γöé
  1431.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1432.  
  1433.  "Toggles" means that if the flag is set, using the flag name in the REGISTER 
  1434.  command clears it.  If the flag is clear, using the flag name in the REGISTER 
  1435.  command sets it. 
  1436.  
  1437.  
  1438. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Search (S) Command ΓòÉΓòÉΓòÉ
  1439.  
  1440.       ##S <range> <list> 
  1441.  
  1442.  This command searches the given <range> of memory locations for the byte 
  1443.  values given in <list>.  If the bytes in the list are found, the command 
  1444.  displays the address of each occurrence of the list.  Otherwise, it displays 
  1445.  nothing. 
  1446.  
  1447.  The <list> can have any number of bytes.  Each must be separated by a space or 
  1448.  comma.  If the list contains more than one byte, this command does not display 
  1449.  an address unless the bytes beginning at that address exactly match the value 
  1450.  and order of the bytes in the list. 
  1451.  
  1452.  
  1453. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Trace (T) Command ΓòÉΓòÉΓòÉ
  1454.  
  1455.       ##T[A|C|N|S|T|X][=<start-address>][<count>][<addr>] 
  1456.  
  1457.  This command executes the instruction at the given <start-address>, and then 
  1458.  displays the current values of all the registers and flags. 
  1459.  
  1460.  If the optional <start-address> is given, the command starts execution at the 
  1461.  given address.  Otherwise, it starts execution at the instruction pointed to 
  1462.  by the current CS and IP registers.  The equal sign (=) may be used only if a 
  1463.  <start-address> is given. 
  1464.  
  1465.  If the optional <count> is given, the command continues to execute a number of 
  1466.  instructions equal to <count> before stopping. The command displays the 
  1467.  current values of the registers and flags for each instruction before 
  1468.  executing the next instruction. 
  1469.  
  1470.  The A option allows the user to specify an ending address for the trace. 
  1471.  Instructions are traced until [<addr>] is reached. 
  1472.  
  1473.  The C option suppresses all output, and counts instructions traced.  An end 
  1474.  address is required for this command. 
  1475.  
  1476.  The N option suppresses the register display, so that only the assembly line 
  1477.  is displayed.  This only works if the "default command" (see the Z command) is 
  1478.  an R (the normal setting). 
  1479.  
  1480.  The S (special trace) option is identical to the C option, except that the 
  1481.  instruction and count are displayed for every call and the return from that 
  1482.  call. 
  1483.  
  1484.  The T option allows the original trap handler address to be traced into 
  1485.  without having to unhook the exception. Instead of issuing the vcp d; t; and 
  1486.  vsp d commands, you can use the T option of the TRACE command. 
  1487.  
  1488.  The X option forces the debugger to trace regions of code known to be 
  1489.  untraceable (such as, _PGSwitchContext). 
  1490.  
  1491.  
  1492. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Unassemble (U) Command ΓòÉΓòÉΓòÉ
  1493.  
  1494.        ##U [<range>] 
  1495.  
  1496.  This command displays the instructions in a mnemonic format. All the  80386 
  1497.  and  80387 opcodes can be displayed. 
  1498.  
  1499.  If given a <range>, the specified address is displayed for the number of bytes 
  1500.  specified.  If the <range> contains the L option (for example, u 90:234 l3), 
  1501.  this specifies the number of lines to display. 
  1502.  
  1503.  
  1504. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Interrupt and Trap Vector (VL) Command ΓòÉΓòÉΓòÉ
  1505.  
  1506.        ##VL[N | P | V | R | F] 
  1507.  
  1508.  This command lists the real- and protected-mode vectors that the debugger 
  1509.  intercepts. Vectors that have been set with VT (rather than with VS) are 
  1510.  printed with an asterisk following the vector number. VLR lists only the real 
  1511.  mode vectors, and VLP lists only the protected mode vectors.  VL lists both, 
  1512.  as follows: 
  1513.  
  1514.       R 0 1 2 3 4 5 6
  1515.       V 0 1 2
  1516.       P 0 1 2 3 4 5 6 7 8* 9 A B
  1517.  
  1518.  The N (Noisy) option lists the traps that beep when hit. 
  1519.  
  1520.  The F (Fatal) option causes the kernel to route the faults that are fatal to a 
  1521.  process to the debugger instead of displaying the popup message.  For GP 
  1522.  faults, "VSF D" is the same a "VSP D".  For page faults, "VSP E" traps all 
  1523.  ring 3 and ring 2 page faults, and "VSF E" traps only the invalid page faults. 
  1524.  
  1525.       ##VT[N | P | V | R | F] n[,n,..] 
  1526.  
  1527.  This command adds a new vector that the debugger intercepts. VTR installs a 
  1528.  debugger handler in the real mode IDT. VTP installs a debugger handler in the 
  1529.  protected mode IDT. VSV or VTV intercepts V86 mode exceptions or traps. 
  1530.  
  1531.  The "N" option causes the intercepted traps to beep when hit. 
  1532.  
  1533.  The "F" (Fatal) option causes the kernel to route the faults that are fatal to 
  1534.  a process to the debugger instead of displaying the popup message.  For GP 
  1535.  faults, "VSF D" is the same a "VSP D".  For page faults, "VSP E" traps all 
  1536.  ring 3 and ring 2 page faults, and "VSF E" traps only the invalid page faults. 
  1537.  
  1538.       ##VS[N | P | V | R | F] n[,n,..] 
  1539.  
  1540.  This command is the same as VT, except that VS does not intercept ring 0 
  1541.  interrupts. The VSV and VTV commands intercept V86 mode exceptions or traps. 
  1542.  
  1543.  The "N" option causes the intercepted traps to beep when hit. 
  1544.  
  1545.  The "F" (Fatal) option causes the kernel to route the faults that are fatal to 
  1546.  a process to the debugger instead of displaying the popup message.  For GP 
  1547.  faults, "VSF D" is the same a "VSP D".  For page faults, "VSP E" traps all 
  1548.  ring 3 and ring 2 page faults, and "VSF E" traps only the invalid page faults. 
  1549.  
  1550.       ##VC[N | P | V | R | F] n,[n],.. 
  1551.  
  1552.  This command clears the vectors indicated, reinstalling whatever address was 
  1553.  in the vector before the debugger obtained the vector. 
  1554.  
  1555.  The "N" option causes the affected traps to not beep when hit. It does not 
  1556.  clear the trap itself. 
  1557.  
  1558.  The "F" (Fatal) option causes the kernel to route the faults that are fatal to 
  1559.  a process to the debugger instead of displaying the popup message.  For GP 
  1560.  faults, "VSF D" is the same a "VSP D".  For page faults, "VSP E" traps all 
  1561.  ring 3 and ring 2 page faults, and "VSF E" traps only the invalid page faults. 
  1562.  
  1563.  Note:  If you want to intercept general protection faults before the operating 
  1564.  system does, then you can issue "VTP D" before the fault is hit, examine the 
  1565.  information about the fault, and issue "VCP D" and "G" to let the system GP 
  1566.  handler get control and end the process. Alternatively, you can issue the "VCP 
  1567.  D" command after hitting the fault, and trace into the exception handler.  The 
  1568.  "TT" and "GT" commands do this automatically. 
  1569.  
  1570.  
  1571. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Debugger Option (Y) Command ΓòÉΓòÉΓòÉ
  1572.  
  1573.       ##Y[?] [386env|dislwr|regterse] 
  1574.  
  1575.  This command allows the debugger configuration to be changed. The "?" prints 
  1576.  the current options supported.  The "Y" command by itself prints the current 
  1577.  state of the options.  The "Y" command and a flag name sets or toggles an 
  1578.  options flag. The flags are as follows: 
  1579.  
  1580.  386env      32-bit environment (toggles) 
  1581.  
  1582.  dislwr      lowercase disassembly (toggles) 
  1583.  
  1584.  regterse    terse register set (toggles) 
  1585.  
  1586.  All these flags toggle their state when set, and are printed only when the 
  1587.  option is on. 
  1588.  
  1589.  The "386env" flag controls the size of addresses, registers, and so on when 
  1590.  displayed.  When this option is on, addresses, registers, and so on are 
  1591.  printed in 32-bit formats; otherwise they are printed in 16-bit formats.  This 
  1592.  flag has nothing to do with the processor in which the debugger is executing. 
  1593.  It only concerns the display sizes. 
  1594.  
  1595.  The "dislwr" flag controls the disassembler's lowercase option. When the flag 
  1596.  is on, disassembly is in lowercase. 
  1597.  
  1598.  The "regterse" flag controls the number of registers displayed in the register 
  1599.  dump command.  In the 32-bit format, when the "regterse" flag is on, only the 
  1600.  first three lines are displayed (instead of the normal six-line plus 
  1601.  disassembly-line display).  In the 16-bit format (386env off), only the first 
  1602.  two lines of the normal three-line display (plus the disassembly line) are 
  1603.  printed. 
  1604.  
  1605.  
  1606. ΓòÉΓòÉΓòÉ 15. Using Default Commands ΓòÉΓòÉΓòÉ
  1607.  
  1608.       ##Z 
  1609.  
  1610.  This command executes the default command. The default command is a string of 
  1611.  debugger commands that are executed any time the debugger is entered and there 
  1612.  is no breakpoint command attached to the entry.  It starts as only the "R" 
  1613.  command, but any string of commands can be used. 
  1614.  
  1615.       ##ZL 
  1616.  
  1617.  This command lists the default command. 
  1618.  
  1619.       ##ZS <string> 
  1620.  
  1621.  This command changes the default command.  If there are any errors (too long), 
  1622.  it returns to the R command. 
  1623.  
  1624.  If you want to process through all the INT 3s in your application or test 
  1625.  program, you can use the following command: 
  1626.  
  1627.       ZS "J (BY CS:EIP) == CC 'G';R."
  1628.  
  1629.  This restarts execution every time you enter the debugger on an INT 3. 
  1630.  
  1631.  A watchpoint can be set up as follows: 
  1632.  
  1633.       ZS "J (WO 40:1234) == 0EED 'r'; T"
  1634.  
  1635.  This command traces until the word at 40:1234 is equal to hex 0EED. This will 
  1636.  not work if you are tracing through the mode-switching code in the operating 
  1637.  system or other sections of code that cannot be traced. 
  1638.  
  1639.  
  1640. ΓòÉΓòÉΓòÉ 16. External Debugger Commands ΓòÉΓòÉΓòÉ
  1641.  
  1642. These commands are part of the debugger but are specific to the environment in 
  1643. which the debugger is running.  The following commands are for the OS/2 
  1644. environment. 
  1645.  
  1646.  
  1647. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Help (.?) Command ΓòÉΓòÉΓòÉ
  1648.  
  1649.        ##.? 
  1650.  
  1651.  This command prints the help menu for the external debugger commands. 
  1652.  
  1653.  
  1654. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The COM Port BAUD Rate (.B) Command ΓòÉΓòÉΓòÉ
  1655.  
  1656.        ##.B <baud rate> [<port addr>] 
  1657.  
  1658.  This command sets the baud rate of the debugging port. Valid values for the 
  1659.  baud rate are 150, 300, 600, 1200, 2400, 4800, 9600 and 19200.  Because the 
  1660.  default base of numbers for the debugger is 16, you must add the suffix "T" to 
  1661.  a decimal (base 10) number to indicate a decimal value.  For example, if you 
  1662.  want to debug over a 1200-baud line, the correct command is: 
  1663.  
  1664.       .B 1200T
  1665.  
  1666.  The port address option can be "1" for COM1, or "2" for COM2. Anything else is 
  1667.  taken as a base port address.  During initialization, if there is no COM2, the 
  1668.  debugger checks for COM1 and then any other COM port address in the ROM data 
  1669.  area, and uses it as the console. 
  1670.  
  1671.  
  1672. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Dump ABIOS Common Data Area (.C) Command ΓòÉΓòÉΓòÉ
  1673.  
  1674.        ##.C 
  1675.  
  1676.  This command dumps the ABIOS common data area. 
  1677.  
  1678.  
  1679. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Dump OS/2 Data Structures (.D) Command ΓòÉΓòÉΓòÉ
  1680.  
  1681.        ##.D <data structure name> [<addr>] 
  1682.  
  1683.  This command displays a few common OS/2 data structures. The data structures 
  1684.  supported are: 
  1685.  
  1686.  Name        Description 
  1687.  
  1688.  SFT         System file table entry 
  1689.  
  1690.  VPB         Volume parameter block 
  1691.  
  1692.  DPB         Disk parameter block 
  1693.  
  1694.  CDS         Current Directory Structure 
  1695.  
  1696.  KSEM        Internal Kernel Semaphore 
  1697.  
  1698.  DT          Disk Trace 
  1699.  
  1700.  DEV         Device driver header 
  1701.  
  1702.  REQ         Device driver request packet 
  1703.  
  1704.  MFT         Master file table entry 
  1705.  
  1706.  BUF         File system buffer 
  1707.  
  1708.  BPB         BIOS parameter block 
  1709.  
  1710.  SEM32       32-bit Semaphore structure 
  1711.  
  1712.  MUXQ        32-bit Semaphore MuxQ chain 
  1713.  
  1714.  OPENQ       32-bit Semaphore OpenQ chain 
  1715.  
  1716.  
  1717. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Swap in TSD or Page (.I/.IT) Commands ΓòÉΓòÉΓòÉ
  1718.  
  1719.        ##.I[D|B] [<addr>] 
  1720.  
  1721.       If only ".I" is given, the page enclosing that address is swapped in. 
  1722.       The address may include an optional task slot number override, as in 
  1723.       %3|20000. 
  1724.  
  1725.        ##.IT[D|B] [<slot>] 
  1726.  
  1727.  The ".IT" command swaps in the corresponding task's TSD.  The "D" option 
  1728.  queues a single swap-in request to be acted upon at task time by the KDB 
  1729.  daemon thread. If the "D" option is not given, this command is restricted to 
  1730.  being executed in user mode (ring 3 or ring 2) or in kernel mode if it is not 
  1731.  interrupt time, and if the thread is not blocked when swapping or leaving the 
  1732.  kernel (InDos is 0).  The ".I[T]" command checks for all these conditions, and 
  1733.  prints an error. 
  1734.  
  1735.  
  1736. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The User Stack Trace (.K) Command ΓòÉΓòÉΓòÉ
  1737.  
  1738.        ##.K[<slot> | # | *] 
  1739.  
  1740.  This command threads through the BP chain on the user stack of the slot 
  1741.  specified, and prints the address, 4 words or doublewords of parameters, and 
  1742.  any symbol found for the address.  The default starting point is taken from 
  1743.  the user SS:EBP and CS:EIP of the debugger's default slot (the one selected 
  1744.  with .S).  The S (Small) option indicates that the frame is 16 bits wide, and 
  1745.  the B (Big) option indicates that the frame is 32 bits wide. The default 
  1746.  depends on the D bit in the user's CS. 
  1747.  
  1748.  
  1749. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Print Module Table Entry Segment Table (.LM) Command ΓòÉΓòÉΓòÉ
  1750.  
  1751.        ##.LM[O][L|P|V|X] [<hobmte|laddr|"modulename">] 
  1752.  
  1753.  This command prints module table entries (MTEs) and their associated object 
  1754.  and segment table entries. 
  1755.  
  1756.  The "O" option suppresses the object or segment table display. 
  1757.  
  1758.  The "L" option displays only library (.DLL) MTEs. 
  1759.  
  1760.  The "P" option displays only Physical Device Driver (PDD) MTEs. 
  1761.  
  1762.  The "V" option displays only Virtual Device Driver (VDD) MTEs. 
  1763.  
  1764.  The "X" option displays only executable (.EXE) MTEs. 
  1765.  
  1766.  If a nonzero HOBMTE is given, only those MTEs with a matching HOBMTE are 
  1767.  printed.  If a nonzero linear address is given, only the MTE pointed to by the 
  1768.  linear address is printed.  If a quoted string is given, only those MTEs with 
  1769.  a matching module name are printed. The module names for A:\BAR.DLL and 
  1770.  C:\FOO\BAR.EXE are both "BAR".  No drive, path, or extension information 
  1771.  should be given. 
  1772.  
  1773.  
  1774. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Memory Arena Record Dump (.MA) Command ΓòÉΓòÉΓòÉ
  1775.  
  1776.        ##.MA[A|B|C|F|H|L|M|R] [<har|laddr>] | [<har|laddr> L<number of 
  1777.       entries>] 
  1778.  
  1779.  This command displays the virtual memory manager's arena records. If no handle 
  1780.  or linear address is given, the entire table is displayed.  If a linear 
  1781.  address is given, it is considered a pointer to an arena record.  One record 
  1782.  or a range of records can be displayed. 
  1783.  
  1784.  The "A" option displays all contexts (the default is the current context 
  1785.  only). 
  1786.  
  1787.  The "B" option displays only busy (allocated) entries. This is the default. 
  1788.  
  1789.  The "F" option displays only free (unallocated) entries. 
  1790.  
  1791.  The "C" option finds the corresponding object record, and displays the arena, 
  1792.  object, alias and context record chains. 
  1793.  
  1794.  The "H" option follows hash links, displaying entries. 
  1795.  
  1796.  The "L" option follows forward links, displaying entries. 
  1797.  
  1798.  The "R" option follows reverse links, displaying entries. 
  1799.  
  1800.  The "M" option causes all arena records whose linear address range encloses 
  1801.  the given linear address to be displayed.  A linear address must also be 
  1802.  given, and no count is allowed.  Context information is ignored, so if the 
  1803.  linear address is valid in multiple contexts, multiple arena records are 
  1804.  displayed.  A physical address may be given instead of a linear address to 
  1805.  allow non present linear addresses to get past the debugger's expression 
  1806.  analyzer.  If a selector address type is used, it must be converted to a 
  1807.  linear address on the command line. 
  1808.  
  1809.  If you ever need to find out what option owns a selector because of a GP fault 
  1810.  in some unknown LDT or GDT segment or memory object, one of the following 
  1811.  commands is useful: 
  1812.  
  1813.  
  1814.         .M
  1815.       or
  1816.         .MAMC CS:EIP
  1817.  
  1818.  The .MAMC CS:EIP, command displays the arena record and memory object record 
  1819.  (and the owner) of the code segment. It also follows the context record chains 
  1820.  and displays them.  The "CS" can be substituted with any selector, and the 
  1821.  "EIP" with any offset.  This command converts the selector:offset into a 
  1822.  linear address automatically, so the resulting address can be used to find and 
  1823.  interpret the arena records and memory object records. 
  1824.  
  1825.  Since ".M" defaults to ".MAMC" when no options are given, and since specifying 
  1826.  the "M" option to any ".M" command uses "CS:EIP" for the default, ".M" is the 
  1827.  same as ".MAMC CS:EIP". 
  1828.  
  1829.  
  1830. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Memory Contect Record Dump (.MC) Command ΓòÉΓòÉΓòÉ
  1831.  
  1832.        ##.MC[B|C|F] [<hco|laddr>] | [<hco|laddr> L<number of entries>] 
  1833.  
  1834.  This command displays the virtual memory manager's context records.  If no 
  1835.  handle or linear address is given, the entire table is displayed.  If a linear 
  1836.  address is given, it is considered to be a pointer to a context record.  One 
  1837.  record or a range of records can be displayed. 
  1838.  
  1839.  The "B" option displays only busy (allocated) entries. This is the default. 
  1840.  
  1841.  The "F" option displays only free (unallocated) entries. 
  1842.  
  1843.  The "C" option also follows context record chains and displays them. 
  1844.  
  1845.  
  1846. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Memory Alias Record Dump (.ML) Command ΓòÉΓòÉΓòÉ
  1847.  
  1848.        ##.ML[C] [<hal|laddr>] | [<hal|laddr> L<number of entries>] 
  1849.  
  1850.  This command displays the virtual memory manager's alias records. If no handle 
  1851.  or linear address is given, the entire table is displayed.  If a linear 
  1852.  address is given, it is considered to be a pointer to an alias record.  One 
  1853.  record or a range of records can be displayed. 
  1854.  
  1855.  The "B" option displays only busy (allocated) entries. This is the default. 
  1856.  
  1857.  The "F" option displays only free (unallocated) entries. 
  1858.  
  1859.  The "C" option finds the corresponding object record, and displays the arena, 
  1860.  object, alias and context record chains. 
  1861.  
  1862.  
  1863. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Memory Object Record Dump (.MO) Command ΓòÉΓòÉΓòÉ
  1864.  
  1865.        ##.MO[B|C|F|M|N|P|S|V] [<hob|laddr>] | [<hob|laddr> L<number of 
  1866.       entries>] 
  1867.  
  1868.  This command displays the virtual memory manager's memory object records.  If 
  1869.  no handle or linear address is given, the entire table is displayed.  If a 
  1870.  linear address is given, it is considered a pointer to an object record.  One 
  1871.  record or a range of records can be displayed. 
  1872.  
  1873.  This command attempts to display which process, MTE or PTDA owns the segment. 
  1874.  It displays the owner as a short ASCII string when appropriate.  It displays 
  1875.  the PID of the process and, if possible, the name of the module that owns this 
  1876.  segment.  Code segments normally have only the module name and no process ID. 
  1877.  If the segment is an MTE, PTDA or LDT, this command displays the object name, 
  1878.  the process ID (if the segment is a PTDA) and the module name, if possible. 
  1879.  
  1880.  Here are a few examples of the owners that this command can display: 
  1881.  
  1882.  Owner       Description 
  1883.  
  1884.  free        Free memory. 
  1885.  
  1886.  devhlp      Allocated by the AllocPhys devhlp. 
  1887.  
  1888.  idevice     Installable device driver memory. 
  1889.  
  1890.  system      System-owned memory. 
  1891.  
  1892.  dosexe      The initial memory arena when the operating system started. This 
  1893.              includes all of the system code and data segments. 
  1894.  
  1895.  mte         A module table entry. 
  1896.  
  1897.  ptda        A per task data arena. 
  1898.  
  1899.  ldt         A local descriptor table. 
  1900.  
  1901.  If it only has a PID or a module name, then this piece of memory is owned by 
  1902.  the process or module. 
  1903.  
  1904.  The "B" option causes in-use (busy) object records to be displayed. 
  1905.  
  1906.  The "F" option causes free object records to be displayed. 
  1907.  
  1908.  The "C" option displays the arena, object, alias and context record chains. 
  1909.  
  1910.  The "M" option causes all pseudo object records with an exactly matching 
  1911.  linear address to be displayed.  A linear address must also be given, and no 
  1912.  count is allowed.  If a selector address type is used, it must be converted to 
  1913.  a linear address on the command line.  A physical address may be given instead 
  1914.  of a linear address to allow non present linear addresses to get past the 
  1915.  debugger's expression analyzer. 
  1916.  
  1917.  The "N" option causes non pseudo object records to be displayed. 
  1918.  
  1919.  The "P" option causes pseudo object records to be displayed. 
  1920.  
  1921.  The "S" option causes object records with the semaphore busy or wanted to be 
  1922.  displayed. 
  1923.  
  1924.  The "V" option causes object record linear addresses to be displayed.  It also 
  1925.  disables the owner interpretation. 
  1926.  
  1927.  
  1928. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Memory Page Frame Dump (.MP) Command ΓòÉΓòÉΓòÉ
  1929.  
  1930.        ##.MP[B|F|H|L|R|S] [<frame|laddr>] | [<frame|laddr> L<number of 
  1931.       entries>] 
  1932.  
  1933.  This command displays the page manager's page frame structures. If no handle 
  1934.  or linear address is given, the entire table is displayed.  If a linear 
  1935.  address is given, it is considered to be a pointer to a page frame structure. 
  1936.  One record or a range of records can be displayed. 
  1937.  
  1938.  The "B" option displays only busy (allocated) entries. This is the default. 
  1939.  
  1940.  The "F" option displays only free (unallocated) entries. 
  1941.  
  1942.  The "H" option follows hash links, displaying entries. 
  1943.  
  1944.  The "L" option follows forward links, displaying entries. 
  1945.  
  1946.  The "R" option follows reverse links, displaying entries. 
  1947.  
  1948.  This data structure contains per-physical-page information.  To find out the 
  1949.  owner of a particular physical page, issue .MP FrameNumber, where FrameNumber 
  1950.  is the physical address shifted right by 12 bits (take off 3 hex zeros).  If 
  1951.  the page is not free, the pVP field contains a flat pointer to the virtual 
  1952.  page structure.  Issue .MV %pVP, where pVP is the value from the .MP dump, to 
  1953.  get the contents of the VP.  The Hob field of the VP is a handle to the Object 
  1954.  Record.  Issue .MO Hob to dump it.  This displays a readable string for the 
  1955.  owner on the right of the display (see the .MO command). Issuing the .MA 
  1956.  command for the Har field in the object record gives the base virtual address 
  1957.  of the object containing the page (under "va").  Use the HobPg field of the VP 
  1958.  to get the page offset within the object. 
  1959.  
  1960.  
  1961. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Memory Virtual Page Frame Dump (.MV) Command ΓòÉΓòÉΓòÉ
  1962.  
  1963.        ##.MV[B|F|L|R] [<vpid|laddr>] | [<swapid|laddr> L<number of entries>] 
  1964.  
  1965.  This command displays the swap manager's swap frame structures. If no handle 
  1966.  or linear address is given, the entire table is displayed.  If a linear 
  1967.  address is given, it is considered to be a pointer to a swap frame structure. 
  1968.  One record or a range of records can be displayed. 
  1969.  
  1970.  See the .MP command for an example. 
  1971.  
  1972.  The "B" option displays only busy (allocated) entries. This is the default. 
  1973.  
  1974.  The "F" option displays only free (unallocated) entries. 
  1975.  
  1976.  The "L" option follows forward links, displaying entries. 
  1977.  
  1978.  The "R" option follows reverse links, displaying entries. 
  1979.  
  1980.  
  1981. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Print Process Status (.P) Command ΓòÉΓòÉΓòÉ
  1982.  
  1983.        ##.P[B|U] [<slot> | # | *] 
  1984.  
  1985.  This command displays the current status of the process and thread. The 
  1986.  asterisk (*) by the slot number denotes the currently executing task or the 
  1987.  last task to have blocked. The number sign (#) marks what the debugger 
  1988.  recognizes as the current task is (set by the .S command). If "#", "*", or a 
  1989.  slot number is used on the command line, only the corresponding slot's 
  1990.  information is displayed. 
  1991.  
  1992.  Without the "B" or "U" option, this command prints the PID, parent PID, 
  1993.  command subtree number, thread number, state, priority, block ID, PTDA 
  1994.  address, TCB offset, dispatch ESP, screen group and name of the process or 
  1995.  thread. 
  1996.  
  1997.  The "B" option displays the detailed blocked information. The handlesem entry 
  1998.  is for the current virtual memory manager handle semaphores owned by this 
  1999.  process. The child entry is for a child process that is being executed. It is 
  2000.  printed after all the threads in the executing task (and their handlesem 
  2001.  entries) have been printed. 
  2002.  
  2003.  The "U" option displays user state information, which includes the CS:EIP and 
  2004.  SS:ESP at the time the kernel was entered, along with the number of arguments 
  2005.  that were passed, their PTDA offset, and the offset of the register stack 
  2006.  frame. 
  2007.  
  2008.  
  2009. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The User Register (.R) Command ΓòÉΓòÉΓòÉ
  2010.  
  2011.        ##.R [<slot> | # | *] 
  2012.  
  2013.  The .R command displays the contents of the user's CPU registers, flags, and 
  2014.  the next instruction to be executed for a specified slot. This command is 
  2015.  available to the user at the time of entry to the kernel. 
  2016.  
  2017.  If no parameter is given, or if (#) is on the command line, the debugger's 
  2018.  current slot (selected by the .S command) is used. If (*) is on the command 
  2019.  line, the currently scheduled slot (or the last one to block) is used. 
  2020.  Alternatively, if there is a number on the command line, it is taken as the 
  2021.  slot to use. 
  2022.  
  2023.  
  2024. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The REBOOT (.REBOOT) Command ΓòÉΓòÉΓòÉ
  2025.  
  2026.        ##.REBOOT 
  2027.  
  2028.  This command warm-starts the machine. The whole string .REBOOT must be typed. 
  2029.  
  2030.  
  2031. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Task Context Change (.S) Command ΓòÉΓòÉΓòÉ
  2032.  
  2033.        ##.S[S] [<slot> | *] 
  2034.  
  2035.  This command changes what the debugger thinks the current task context is.  If 
  2036.  no slot number is passed, it prints the current task number.  This allows 
  2037.  dumping of some process-specific data (the LDT or stack) for a task other than 
  2038.  the current task.  The "S" option also changes the SS and ESP to the new 
  2039.  task's PTDA selector and dispatch ESP value.  The original SS and ESP are 
  2040.  automatically restored when the debugger stops, or when the ".SS" command is 
  2041.  used to switch back to the current task.  The (*) slot number changes the 
  2042.  debugger's current task number to the real system task number. 
  2043.  
  2044.  
  2045. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The RAS Trace Buffer Print (.T) Command ΓòÉΓòÉΓòÉ
  2046.  
  2047.        ##.T [<count>] [maj=<xx> [min=<yy>]] 
  2048.  
  2049.  This command dumps the RAS trace buffer, optionally dumping only events with 
  2050.  the specified major and minor event codes. 
  2051.  
  2052.  
  2053. ΓòÉΓòÉΓòÉ 17. Setting Useful Breakpoints ΓòÉΓòÉΓòÉ
  2054.  
  2055. There are many actions that can be invoked when you use a combination of 
  2056. breakpoint commands.  You can easily set up the debugger to stop at a certain 
  2057. label, print information about the current system millisecond, current process, 
  2058. and executing file, and then continue. For example, this would be very useful 
  2059. in analyzing the performance of a subsystem .DLL. Another use would be to set a 
  2060. breakpoint on a file-read label in the file system, and dump information about 
  2061. which file is being read, where it is being read from, how much of the file is 
  2062. being read, and what is reading it. 
  2063.  
  2064. In order to do this, you must know some internal information about the kernel 
  2065. and other system components, such as labels of various application programming 
  2066. interface (API) functions or worker routines. 
  2067.  
  2068. One way to keep some release independence is to base breakpoints from function 
  2069. labels with an offset.  These change much less often than the linear addresses 
  2070. of the functions. An example is as follows: 
  2071.  
  2072.  
  2073.     BP _LDRGetMte +63 "DA %EDX L EAX +1; G"
  2074.  
  2075. This command places a breakpoint at the symbol _LDRGetMte, offset by hex 63. 
  2076. Whenever that breakpoint is hit, the debugger dumps (in ASCII) the memory at 
  2077. the linear address stored in register EDX, for a length contained in register 
  2078. EAX plus one byte. The program then continues executing. 
  2079.  
  2080. Of course this offset within the function may change, but it is easier to find 
  2081. the new offset if it does than to use linear addresses for your breakpoints. 
  2082.  
  2083. The effect of this breakpoint is to display the name of any executable file 
  2084. (such as one with a file type of .EXE, .DLL, or .SYS) that is started with 
  2085. DosExecPgm, DosStartSession, or DosLoadModule, or imported from any other 
  2086. executable file. This is very useful when debugging problems in applications. 
  2087.  
  2088. A series of actions that can help you profile your code to see how often you 
  2089. are taking page faults on pieces of code follows: 
  2090.  
  2091.    1. Unassemble at the label _ldrgetpage for approximately 30 instructions 
  2092.  
  2093.    2. Look for a call to _ldrvalidatemtehandle 
  2094.  
  2095.    3. Set a breakpoint on the instruction immediately following that call 
  2096.       (where execution would go upon return from the call) as follows: 
  2097.  
  2098.  
  2099.    BP% address" . lm% eax ;G "
  2100.  
  2101.  This breakpoint will cause the loader to display the name of the code module 
  2102.  (DLL or EXE) that code is being read from. For example, all code that is ever 
  2103.  executed is referenced at least once (the first time it is loaded). However, 
  2104.  if you are seeing excessively long code load times and a large amount of what 
  2105.  looks to be thrashing, you may want to use this breakpoint. Also, if you have 
  2106.  code residing on remote drives, you may want to use this breakpoint to see how 
  2107.  much you are hitting the code on the remote drive to possibly reconfigure it. 
  2108.  
  2109.  A breakpoint you can use to profile your code is: 
  2110.  
  2111.  
  2112.     BP xxxxxx "DD SISData+4 L1; G"
  2113.  
  2114.     where xxxxxx is the address or label you wish to profile.
  2115.  
  2116.  This breakpoint will give you a running millisecond counter in hexadecimal. If 
  2117.  you want to tell the time it takes between two points in the code, add this to 
  2118.  the breakpoints and the time will be displayed when it hits the points. This 
  2119.  will help in narrowing down the slow area of code. Be careful when analyzing 
  2120.  the results, however, as although the timer is reported in milliseconds, it is 
  2121.  only updated every 16 milliseconds. 
  2122.  
  2123.  When the Presentation Manager Interface sets error information, you can query 
  2124.  for it through the debugger by executing the following breakpoint: 
  2125.  
  2126.  
  2127.     BP _winseterrorinfo
  2128.  
  2129.  When this breakpoint is hit, the first parameter after the return address on 
  2130.  the stack is the error code being set. 
  2131.  
  2132.  If you happen to press Ctrl+C while the speaker is sounding a tone, that tone 
  2133.  will continue until the speaker is shut off. The command: 
  2134.  
  2135.  
  2136.    0  61 41
  2137.  
  2138.  will output the instruction to turn the speaker port off. 
  2139.  
  2140.  Using the debugger, you can also see which keystrokes are being input to the 
  2141.  Presentation Manager single input queue. The breakpoint: 
  2142.  
  2143.  
  2144.    BP putinsqp "dw si 17; G"
  2145.  
  2146.  will show you the keyboard scan codes before PMWIN gets them. This is helpful 
  2147.  when tracking the direction of keystrokes. 
  2148.  
  2149.  You can also look at the processor's registers before they are affected by the 
  2150.  OS/2 trap handler. By executing: 
  2151.  
  2152.  
  2153.    BP trap$systemfatalfault
  2154.  
  2155.  you can stop the system before the trap handler is invoked. 
  2156.  
  2157.  To look at the device driver header chain, you can use the following 2 
  2158.  commands: 
  2159.  
  2160.  
  2161.    .D dev devhead
  2162.  
  2163.  This command will display the device driver information starting at the first 
  2164.  device driver in the chain. 
  2165.  
  2166.  
  2167.    .D dev 'devnext'
  2168.  
  2169.  This will query the device driver chain, showing the installed device drivers. 
  2170.  
  2171.  If you ever need to break in just before the system reboots, use this: 
  2172.  
  2173.  
  2174.    BP w_shutdown
  2175.  
  2176.  To see which slots (threads) are being dispatched, you can look inside the 
  2177.  scheduler by: 
  2178.  
  2179.  
  2180.    BP _schgetnextrunner "dw tasknumber l1; G"
  2181.  
  2182.  This will give you the slot number of each thread being dispatched. This is 
  2183.  valuable to track performance issues to see if any one process is getting a 
  2184.  disproportionately large share of the processor. 
  2185.  
  2186.  To interrupt a device driver just before it initializes, you can use: 
  2187.  
  2188.  
  2189.    BP syiInitializeDeviceDriver
  2190.  
  2191.  This will stop just before the driver initializes so you can trace through the 
  2192.  initialization routine. 
  2193.  
  2194.  Another useful breakpoint is one that tells you what kernel calls you are 
  2195.  executing. There is a routine called "sci" that is used in all OS/2 kernel 
  2196.  calls. By setting the following breakpoint you can have it report what kernel 
  2197.  calls you are making. 
  2198.  
  2199.  
  2200.    BP sci "ln wo(ss:esp)"
  2201.  
  2202.  This breakpoint says to break on sci (system call interface) and list the near 
  2203.  symbol representing the name of the kernel call. The kernel call is determined 
  2204.  by looking at the return value on the stack. This is more effective than just 
  2205.  stopping and listing near symbols because this method displays just the name 
  2206.  of the routine and makes tracing a series of kernel calls much easier. 
  2207.  
  2208.  If you need to look into the functions dealing with the graphics engine 
  2209.  (especially if you are writing a presentation driver such as a printer or 
  2210.  display driver) you can set the following breakpoint: 
  2211.  
  2212.  
  2213.     BP dispatch32
  2214.  
  2215.  This breakpoint is in PMGRE.DLL, and when it is encountered you should look at 
  2216.  the return address. Next, unassemble at that address less approximately 20 
  2217.  bytes.  You are looking for the first doubleword pushed onto the stack before 
  2218.  the call. This should be the doubleword representing the command flags and the 
  2219.  engine function number. The command flags are the high order word and the 
  2220.  function number is the low order word of the doubleword. You could look at the 
  2221.  stack frame to get this, but because this is the first dword pushed, it is the 
  2222.  last dword in the frame due to the 32-bit calling conventions. Because the DDI 
  2223.  stack frames are variable-sized, you may have to do some searching to find the 
  2224.  end of the frame. You can do this too, but unassembling before the call works 
  2225.  just as well and may be easier. 
  2226.  
  2227.  For 16-bit presentation drivers, you would want to set the breakpoint as 
  2228.  follows: 
  2229.  
  2230.  
  2231.     BP dispatch16
  2232.  
  2233.  Since the 16-bit calling conventions put the function number first, you can 
  2234.  simply look at the stack frame on this one. 
  2235.  
  2236.  Another useful breakpoint is as follows: 
  2237.  
  2238.  
  2239.     BP _LDRNewExe "G %(DW(SS:ESP)); DD _pgSwappablePages L 3; G"
  2240.  
  2241.  This command places a breakpoint at the symbol _LDRNewExe. When that 
  2242.  breakpoint is reached, the program continues executing until the caller is 
  2243.  returned to. The debugger then displays the number of pages of swappable 
  2244.  memory in the system, followed by the number of fixed (resident) pages, 
  2245.  followed by the number of pages of discardable memory (read-only or 
  2246.  execute-only pages). The program then continues executing. 
  2247.  
  2248.  The effect of this breakpoint is to display the hex number of pages that are 
  2249.  in use by the whole system after every executable program is started. 
  2250.  
  2251.  The term "G %(DW(SS:ESP))" means "Go (G) to the linear address (%) that is the 
  2252.  doubleword (DW) at the top of the stack (SS:ESP) and stop". The operators "WO" 
  2253.  and "BY" are similar to "DW". "WO" means "word," and "BY" means "byte." This 
  2254.  type of setup can be useful when displaying parameters for a function call as 
  2255.  well, for example: 
  2256.  
  2257.  
  2258.       BP _LdrOpenNewExe "DA %(DW(SS:ESP+4)); G"
  2259.  
  2260.  When this breakpoint is executed, the debugger dumps ASCII (DA) starting at 
  2261.  the linear address (%) given in the doubleword (DW) at SS:ESP plus 4 bytes 
  2262.  (the doubleword at the top of the stack is the address for _LdrOpenNewExe to 
  2263.  return to). The program then continues executing. 
  2264.  
  2265.  The effect of this breakpoint is to display (in ASCII) the name of every 
  2266.  executable loaded module that actually opens a file. The difference between 
  2267.  this breakpoint and the one given earlier is that the earlier one displays the 
  2268.  names even if the module was attached to instead of newly opened and loaded. 
  2269.  This breakpoint only gives the names of the newly opened modules.  By setting 
  2270.  both breakpoints and subtracting the names, you can determine the imported 
  2271.  modules. 
  2272.  
  2273.  A series of commands that can be useful in determining the amount of memory an 
  2274.  application requires is as follows: 
  2275.  
  2276.  
  2277.    .PU  (pick a thread that is in the process you wish to examine)
  2278.    .SS n (where 'n' is the thread or slot number you picked)
  2279.    DL   (list all valid LDT selectors (all 16-bit segments))
  2280.  
  2281.  If the DL command listing stops with an address not present or invalid, issue 
  2282.  the ".ID x" command (where 'x' is the address) and then the G (Go) command. 
  2283.  When the system stops again, the LDT page will be present.  Reissue the ".SS 
  2284.  n" and DL commands, and you will get a more complete listing of the LDT 
  2285.  selectors.  An example of the output follows: 
  2286.  
  2287.         # .PU
  2288.           ... (generates a lot of information like...)
  2289.    Slot Pid  Ord  pPTDA    Name    pstkframe  CS:EIP        SS:ESP     cbargs
  2290.    0012 0006 0012 7d31ccb0 FOO.EXE 7d102f50 d02f:00002501 0b3f:00007eee 0008
  2291.    ...  ...  ...  ...      ...     ...      ...           ...           ...
  2292.  
  2293.         # .SS 12
  2294.         # DL
  2295.           ... (try it and stop at %7b176000...)
  2296.         # .ID %7b176000
  2297.           task|addr 0012|7b176000 queued, g to continue
  2298.         # G
  2299.           ... (stops at INT3 in tasking...)
  2300.           0170:fff629f4 cc             int     3
  2301.         # .SS 12
  2302.         # DL
  2303.           0007  Data    Bas=7b175000 Lim=0000ffff DPL=3 P  RO
  2304.           000f  Data    Bas=00010000 Lim=00001677 DPL=3 P  RW    A
  2305.           0017  Code    Bas=00020000 Lim=00003197 DPL=3 P  RE    A
  2306.           001f  Data    Bas=00030000 Lim=00001fff DPL=3 P  RW    A
  2307.           ...   ...     ...          ...          ...   .  ..    .
  2308.  
  2309.  The first entry (0007 Data ...) points to the process' LDT itself, and should 
  2310.  not be counted when adding up the amount of memory the application itself is 
  2311.  using.  However, it is part of the system overhead that is used for the 
  2312.  process, and should be attributed as such. 
  2313.  
  2314.  The following breakpoints give you a great deal of information about the 
  2315.  startup of an application: 
  2316.  
  2317.  BP g_tkExecPgm              "? 'ExecPgm'; G" 
  2318.  
  2319.  BP g_w_loadmodule           "? 'LoadModule'; G" 
  2320.  
  2321.  BP h_w_QAppType             "? 'QryApplType'; DA DS:DX; G" 
  2322.  
  2323.  BP _ldrGetMte +63           "DA %EDX ; G" 
  2324.  
  2325.  BP _ldrOpenNewExe           "DA %(DW(SS:ESP+4)); G" 
  2326.  
  2327.  BP _load_error              "DD SS:ESP L 3; G" 
  2328.  
  2329.  BP h_w_getprocaddr          "? 'GetProcAddr'; G" 
  2330.  
  2331.  BP h_w_getprocaddr +23      "? 'by ordinal'; ? DI; G" 
  2332.  
  2333.  BP h_w_getprocaddr +25      "? 'by name'; DA AX:DI; G" 
  2334.  
  2335.  These nine breakpoints give you a great deal of information about how a 
  2336.  program loads and starts executing. These breakpoints can be placed into a 
  2337.  KDB.INI file on the system being tested to allow you to determine which binary 
  2338.  files are loaded and executed. Please again note that these offsets may change 
  2339.  in subsequent releases of the OS/2 kernel and loader. Some of the possible 
  2340.  types of files are the following: 
  2341.  
  2342.  File Type            File 
  2343.  .DLL        Dynamic link library 
  2344.  .EXE        Executable program 
  2345.  .FON        Static font file 
  2346.  .PSF        Dynamic font file 
  2347.  .QPR        Queue printer driver 
  2348.  .PDR        Printer driver 
  2349.  .SYS        Physical device driver 
  2350.  .VDD        Virtual device driver 
  2351.  
  2352.  The next two breakpoints inform the debugger that the specified label was 
  2353.  passed. This allows you to interpret the successive breakpoints accurately. 
  2354.  
  2355.     1. BP g_tkExecPgm     "? 'DosExecPgm'; G"
  2356.    2. BP g_w_loadmodule  "? 'DosLoadModule'; G"
  2357.  
  2358.  The next breakpoint prints the name of the routine being executed, and prints 
  2359.  the name of the file being queried. 
  2360.  
  2361.  
  2362.    3. BP h_w_QAppType    "? 'DosQueryAppType'; DA DS:DX; G"
  2363.  
  2364.  A program issues DosQueryAppType (QAT) when it has to determine the 
  2365.  application type of an executable file. For example, when you type 'FREDDY' at 
  2366.  a command prompt and press Enter, the system program CMD.EXE has to find out 
  2367.  whether the file 'FREDDY' is a .EXE file, a .CMD file, a .COM file, or some 
  2368.  other type of file. 
  2369.  
  2370.  Some information can be derived from the file's extension. The DOS command 
  2371.  processor works this way. However, you may still need to determine whether a 
  2372.  .EXE file is a DOS application, a 16-bit OS/2 Version 1.3 application, a 
  2373.  32-bit OS/2 application, or a  Windows application. DosQueryAppType (QAT) 
  2374.  attempts to determine this in a way that is very similar to what happens when 
  2375.  the program is actually loaded and executed. 
  2376.  
  2377.  Sometimes, DosQueryAppType (QAT) is issued to verify that the file exists. For 
  2378.  example, SysInit (the thread that loads all the device drivers) has to 
  2379.  determine whether a device driver exists, and whether the file contains a 
  2380.  valid device driver. SysInit issues DosQueryAppType (QAT) for all of the 
  2381.  BASEDEV= and DEVICE= statements in the CONFIG.SYS file. 
  2382.  
  2383.  Sometimes, the QAT type does not need to open the file. If the Shell queries 
  2384.  the type of a file several times in quick succession, the first QAT call 
  2385.  determines the type of the file, and then saves it for a few cycles. If 
  2386.  another QAT call is made immediately for the same file, the 
  2387.  previously-determined type is returned. This value is cleared when any other 
  2388.  file-system access is made, such as when a file is deleted. 
  2389.  
  2390.  To see whether a file was actually opened for a loader or tasking call, see 
  2391.  breakpoint number 5. 
  2392.  
  2393.  Breakpoint number 4 prints the name of any file being loaded, read, attached 
  2394.  to, or otherwise referred to (for example, imported) in the loader. 
  2395.  
  2396.  
  2397.    4. BP _ldrGetMte +63  "DA %EDX ; G"
  2398.  
  2399.  If breakpoint number 1, 2, or 3 immediately precedes breakpoint number 4, then 
  2400.  breakpoint number 4 indicates the name of the primary module being executed by 
  2401.  DosExecPgm, or loaded by DosLoadModule (DLM), or queried by DosQueryAppType 
  2402.  (QAT). 
  2403.  
  2404.  Breakpoint number 5 displays the name of any file being opened for execution 
  2405.  by the loader. This breakpoint, along with breakpoint number 6, allows the 
  2406.  debugger to find a large number of observed problems. 
  2407.  
  2408.  
  2409.    5. BP _ldrOpenNewExe   "DA %(DW(SS:ESP+4)) ; G"
  2410.    6. BP _load_error      "DD SS:ESP L 3; G"
  2411.  
  2412.  Breakpoint number 6 is the error handler for this area. Many error codes are 
  2413.  not returned through a base-pointer chained stack frame through several levels 
  2414.  of function calls. Instead, a special stack frame is created when the loader 
  2415.  is entered, and the stack offset to this frame is preserved. When an error 
  2416.  occurs, _load_error() is called with two parameters,an error code and an 
  2417.  optional MTE handle. In breakpoint number 6, the debugger displays the return 
  2418.  address from the location the error was detected, the error code for what 
  2419.  happened, and either a 0 or a module table entry (MTE) handle for where the 
  2420.  error was found. File BSEERR.H contains the Control Program error codes. 
  2421.  Common error codes are 2 (ERROR_FILE_NOT_FOUND) and 193 
  2422.  (ERROR_BAD_EXE_FORMAT). If an MTE handle is supplied, issue the '.lm[o] 
  2423.  handle' command to obtain more information. 
  2424.  
  2425.  After _load_error() finishes processing, it clears the stack of everything 
  2426.  above the special stack frame. It then returns directly to the original 
  2427.  caller, without executing any intervening code. This is efficient, and it 
  2428.  avoids a large amount of error-handling code in each function. 
  2429.  
  2430.  The next three breakpoints are used to determine what is being retrieved from 
  2431.  a .DLL after a successful call to DosLoadModule (DLM). Breakpoint number 7 
  2432.  displays the label 'DosGetProcAddr', followed by information about the .DLL 
  2433.  being queried, including its name. 
  2434.  
  2435.  Breakpoint number 8 displays the ordinal number of the code or data being 
  2436.  sought in the .DLL. Breakpoint number 9 displays the name of the code or data 
  2437.  being sought in the .DLL. Breakpoints number 8 and 9 are mutually exclusive. 
  2438.  
  2439.  
  2440.    7. BP h_w_getprocaddr  "? 'DosGetProcAddr'; .LM EAX; G"
  2441.    8. BP h_w_getprocaddr +23 "? 'by ordinal'; ? DI; G"
  2442.    9. BP h_w_getprocaddr +25 "? 'by name'; DA AX:DI; G"
  2443.  
  2444.  Breakpoints number 7, 8, and 9 do not provide information that is being 
  2445.  imported from a .DLL. To do this, more information about the internal 
  2446.  operation of the loader is required. 
  2447.  
  2448.  The following is an example that uses these breakpoints: 
  2449.  
  2450.  
  2451.   LoadModule
  2452.  
  2453.   C:\OS2\DLL\TIMESNRM.PSF
  2454.   43 3a 5c 4f 53 32 5c 44-4c 4c 5c 54 49 4d 45 53 C:\OS2\DLL\TIMESNRM.PSF.
  2455.   QryApplType
  2456.  
  2457.   C:\OS2\PMSHELL.EXE
  2458.   43 3a 5c 4f 53 32 5c 50-4d 53 48 45 4c 4c 2e 45 C:\OS2\PMSHELL.EXE
  2459.   QryApplType
  2460.  
  2461.   04a8:00000002 C:\OS2\PMSHELL.EXE
  2462.   QryApplType
  2463.  
  2464.   04a8:00000002 C:\OS2\PMSHELL.EXE
  2465.   ExecPgm
  2466.  
  2467.   C:\OS2\PMSHELL.EXE
  2468.   LoadModule
  2469.  
  2470.   BVSCALLS
  2471.   GetProcAddr
  2472.  
  2473.   by ordinal
  2474.  
  2475.   0003H 3T 3Q 0000000000000011Y '.' TRUE
  2476.   LoadModule
  2477.  
  2478.   PMSDMRI
  2479.   LoadModule
  2480.  
  2481.   C:\OS2\DLL\PMATM.DLL
  2482.   GetProcAddr
  2483.  
  2484.   by name
  2485.  
  2486.   04a8:00000002 FONT_DRIVER_DISPATCH_TABLE
  2487.   LoadModule
  2488.  
  2489.   DISPLAY
  2490.   LoadModule
  2491.  
  2492.   C:\OS2\DLL\DISPLAY.DLL
  2493.   LoadModule
  2494.  
  2495.   PMCTLS
  2496.  
  2497.   LoadModule
  2498.  
  2499.   SPL1B
  2500.   LoadModule
  2501.  
  2502.   SPL1D
  2503.   53 50 4c 31 44                  SPL1D
  2504.   0030:00006724  fff8b6c3 00000002 00000000 (this is what _load_error() displays)
  2505.  
  2506.  
  2507. ΓòÉΓòÉΓòÉ 18. Debugging Kernel Device Drivers ΓòÉΓòÉΓòÉ
  2508.  
  2509. There are some structures in the Kernel Debugger that are useful when you are 
  2510. debugging a kernel device driver. You can issue the following commands to refer 
  2511. to these structures. 
  2512.  
  2513.       ##.D DEV DS:0 
  2514.  
  2515.       This command displays the header of the device driver. It helps you 
  2516.       determine which device driver you are debugging. 
  2517.  
  2518.       ##.D REQ ES:BX 
  2519.  
  2520.       This command displays the kernel request packet. This packet is passed 
  2521.       between the file system and a kernel device driver. Issue this command at 
  2522.       the strategy entry point or exit point of the device driver. This command 
  2523.       helps you determine which request the device driver has just finished 
  2524.       processing, or is about to process. 
  2525.  
  2526.       ##.MAMC 
  2527.  
  2528.       This command displays the module name of the program that is currently 
  2529.       executing. This helps you determine the owner of the process that 
  2530.       trapped. 
  2531.  
  2532.       ##VSF* 
  2533.  
  2534.       This command sets the trap vectors. This causes the Kernel Debugger to 
  2535.       stop at the instruction that is about to cause a trap. 
  2536.  
  2537.  
  2538. ΓòÉΓòÉΓòÉ 19. Debugging VM Start Sessions ΓòÉΓòÉΓòÉ
  2539.  
  2540. Before you begin kernel debugging in a VM Start session, you must establish 
  2541. interrupt vectors 1 and 3. Issue the command DD %%0 to see what the vectors 
  2542. should be, and then issue the following commands to set them to their correct 
  2543. values: 
  2544.  
  2545.  
  2546.       E &0:4 12 67 00 1d
  2547.       E &0:c 57 67 00 1d
  2548.  
  2549. To debug a trap 6 or an incorrect-output problem, set a breakpoint at the 
  2550. VMINT21 entry point. 
  2551.  
  2552. You can find the segment of FSFILTER by looking at the INT 20h or INT 21h 
  2553. vectors (0:80 and 0:84, respectively). The offset of VMINT21 is hex 330. Trace 
  2554. through all of the INT 21 calls until the error is observed. Run the test again 
  2555. to the last successful INT 21, then begin stepping through the code until the 
  2556. error is found. 
  2557.  
  2558. A method of eliminating FSFILTER as the component with the problem is to set up 
  2559. a test case that is executed from the diskette. This way, you can execute a VM 
  2560. Start session without installing FSFILTER. If the problem still occurs, then 
  2561. FSFILTER is not the cause of the problem. 
  2562.  
  2563.  
  2564. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Debugging the CMD.EXE ΓòÉΓòÉΓòÉ
  2565.  
  2566. A problem that appears to be in CMD.EXE is usually located in a different 
  2567. program. Due to the way in which the Kernel Debugger works, CMD.EXE symbols are 
  2568. often shown when they should not be. This can happen when a trap occurs in an 
  2569. application that was started from the command prompt. 
  2570.  
  2571. You can issue a List Near Symbol (LN) command at the debug console. However, 
  2572. there are probably no symbols for the application, so the Kernel Debugger 
  2573. displays the closest symbols. These symbols are usually from CMD.EXE (the 
  2574. parent process). 
  2575.  
  2576. Therefore, you should first issue the Print Process Status (.P #) command. This 
  2577. command shows which process actually trapped. If the line does not show "CMD" 
  2578. on the right-hand side, the program that trapped is not CMD.EXE. 
  2579.  
  2580.  
  2581. ΓòÉΓòÉΓòÉ 20. Debugging a Remote System ΓòÉΓòÉΓòÉ
  2582.  
  2583. The OS/2 Kernel Debugger allows OS/2 developers to diagnose problems quickly, 
  2584. but only if they have access to the system that demonstrates the problem. 
  2585. Installing a modem on the target debug system allows the developers to call the 
  2586. target system by telephone to interact with it. 
  2587.  
  2588. Although the Kernel Debugger will work with nearly any modem, configuration 
  2589. details are unique to each modem.  This section will describe the setup of 
  2590. several modems, and give general guidelines for setting up other modems. 
  2591.  
  2592. In addition to installing the Kernel Debugger on your own system you will need 
  2593. the following items: 
  2594.  
  2595.    o  Target system with both RETAIL and DEBUG Kernels 
  2596.    o  Modem 
  2597.    o  Modem data cable 
  2598.    o  Analog dial-in telephone line 
  2599.    o  Communications software 
  2600.  
  2601.  Analog Dial-In Lines 
  2602.  Communication Software 
  2603.  Configuring for Remote Debug 
  2604.  Modems 
  2605.  Modem Data Cables 
  2606.  Limitations 
  2607.  The Target System 
  2608.  Trouble-Shooting 
  2609.  
  2610.  
  2611. ΓòÉΓòÉΓòÉ <hidden> Debug Support - The Target System ΓòÉΓòÉΓòÉ
  2612.  
  2613. The target system is the computer you wish to debug. This computer should have 
  2614. the Kernel Debugger and symbols installed on it. However, if you want to use 
  2615. the target system to configure the modem you must configure the modem before 
  2616. you install the Kernel Debugger.  The debugger interferes with communications 
  2617. programs running on the same serial port.  If you have another computer 
  2618. available, you can configure the modem on that computer, and then move the 
  2619. modem to the target system. 
  2620.  
  2621.  
  2622. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Modems ΓòÉΓòÉΓòÉ
  2623.  
  2624. Most asynchronous modems are suitable for use as a remote-debug modem.  For 
  2625. best performance, the modem should: 
  2626.  
  2627.    o  Support auto-answer operation 
  2628.  
  2629.    o  Support locked DTE speed at 9600 bps 
  2630.  
  2631.    o  Allow connections at CCITT V.32 (9600 bps) and V.22bis (2400 bps) 
  2632.  
  2633.    o  Support error-correction (MNP or V.42) 
  2634.  
  2635.    o  Save configuration in case of a power-outage. 
  2636.  
  2637.  
  2638. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Modem Data Cables ΓòÉΓòÉΓòÉ
  2639.  
  2640. The configuration of the cable used to connect the modem to the target system 
  2641. is not important.  Any serial data cable should have the connections required 
  2642. by the Kernel Debugger.  Ensure that you do not use a null-modem cable.  A 
  2643. null-modem cable is made to connect a DTE to a DTE (a computer is DTE, and a 
  2644. modem is DCE).  A normal cable connects a DTE to a DCE.  Use either a 25-to-25 
  2645. pin cable (for connection to the built-in serial port on a PS/2) or a 25-to-9 
  2646. pin cable (for connection to a 9-pin serial port). 
  2647.  
  2648. Required connections for remote debug cable: 
  2649.  
  2650.  
  2651. 25-to-25 Pin Cable
  2652.  
  2653.  
  2654.          MODEM        COMPUTER
  2655.          DB25P         DB25J
  2656.  
  2657.           ΓöîΓöÇΓöÉ           ΓöîΓöÇΓöÉ
  2658.           Γöé2Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ2Γöé
  2659.           Γöé3Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ3Γöé
  2660.           Γöé7Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ7Γöé
  2661.           ΓööΓöÇΓöÿ           ΓööΓöÇΓöÿ
  2662.  
  2663.  
  2664. 25-to-9 Pin Cable
  2665.  
  2666.  
  2667.          MODEM        COMPUTER
  2668.          DB25P         DB9J
  2669.  
  2670.           ΓöîΓöÇΓöÉ           ΓöîΓöÇΓöÉ
  2671.           Γöé2Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ3Γöé
  2672.           Γöé3Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ2Γöé
  2673.           Γöé7Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ5Γöé
  2674.           ΓööΓöÇΓöÿ           ΓööΓöÇΓöÿ
  2675.  
  2676. Note:  The 25-to-9 pin cable reverses pins 2 and 3.  Do not confuse this with a 
  2677. null-modem cable. The signals on a 25-to-9 pin cable are normally reversed. 
  2678.  
  2679.  
  2680. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Analog Dial-In Lines ΓòÉΓòÉΓòÉ
  2681.  
  2682. In order to call the modem and connect to the target system, you will need a 
  2683. standard voice-grade telephone line that can be direct-dialed. A connection can 
  2684. be made if the line must go through a switchboard, but it makes it more 
  2685. difficult for the person doing the debugging.  Digital telephone lines will not 
  2686. work with the modem. 
  2687.  
  2688.  
  2689. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Communications Software ΓòÉΓòÉΓòÉ
  2690.  
  2691. Use any terminal software that can communicate at 9600 bps, such as the Softerm 
  2692. Custom software that comes with the OS/2 operating system. 
  2693.  
  2694.  
  2695. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Configuring Remote Debug ΓòÉΓòÉΓòÉ
  2696.  
  2697. After you have assembled the required items, follow these steps to prepare the 
  2698. target system for remote debugging: 
  2699.  
  2700.    1. Connect the modem to the target system. 
  2701.  
  2702.       Connect one end of the serial cable to the modem, and the other end to 
  2703.       the serial port on the target system.  If the target system has more than 
  2704.       one serial port, connect the cable to the port configured as COM2 (the 
  2705.       Kernel Debugger uses COM2 by default).  With PS/2 systems, the Reference 
  2706.       Diskette can tell you which port is configured as COM2.  Connect the 
  2707.       telephone line to the modem, and turn on the modem. 
  2708.  
  2709.    2. Program the modem for DEBUG operation: 
  2710.  
  2711.       Programming the modem may be a complex process, depending on the type of 
  2712.       modem and the intended use. There are two ways to program the modem: 
  2713.  
  2714.         o  Quick programming for single debug use 
  2715.  
  2716.         o  Full programming for "permanent" debug use 
  2717.  
  2718.           The "quick" method is simple, but the modem will not be programmed to 
  2719.           recover from loss of power or repeated calls.  The "full" method 
  2720.           allows the modem to be programmed once, and then used whenever 
  2721.           debugging is needed. 
  2722.  
  2723.           The "quick" programming is performed by the Kernel Debugger itself. 
  2724.           When the Kernel Debugger boots, it will find and process the file 
  2725.           "KDB.INI" in the root directory of the startup drive.  This file can 
  2726.           contain startup commands for the debugger, one of which can be a 
  2727.           modem initialization string. For this reason, the modem must be 
  2728.           connected and turned on when the target machine is started, and 
  2729.           cannot be turned off until debugging is complete. To use "quick" 
  2730.           programming, create a KDB.INI file in the root directory of the 
  2731.           startup drive (using the OS/2 System Editor).  The first line of the 
  2732.           file should be: 
  2733.  
  2734.            .B 9600t 2 (Set debugger for 9600 bps, comm port 2) 
  2735.  
  2736.           The second line is the modem initialization string, which is unique 
  2737.           to each type of modem.  The commands in the initialization string 
  2738.           must: 
  2739.  
  2740.         o  Activate auto-answer 
  2741.  
  2742.         o  Lock the DTE at 9600 bps 
  2743.  
  2744.         o  Activate XON/XOFF flow control 
  2745.  
  2746.         o  Ignore the DTR signal (not supplied by the Kernel Debugger) 
  2747.  
  2748.         o  Suppress result codes 
  2749.  
  2750.           The last line of the KDB.INI file can contain other debugging 
  2751.           commands.  The last command should be G, which tells the debugger to 
  2752.           continue running after processing the KDB.INI file. Without the G, 
  2753.           the debugger will stop after processing the KDB.INI file, and you 
  2754.           will have to manually enter the G to continue. 
  2755.  
  2756.           The "quick" programming strings for several popular modems are as 
  2757.           follows. The string is in the form: ? "modem string", which instructs 
  2758.           the Kernel Debugger to send the quoted string to the modem during 
  2759.           initialization. 
  2760.  
  2761.            ? "AT&F E0 Q1 &B1 &H2 &I2 &D0 S0=1" 
  2762.                 US Robotics HST and Dual Standard 
  2763.  
  2764.            ? "AT&F2 E0 Q2 &D0 &K4 S0=1" 
  2765.                 Supra FAX/Modem V.32bis 
  2766.  
  2767.            ? "AT&F E0 Q1 &D0 \Q1 S0=1" 
  2768.                 Intel 14.4EX 
  2769.  
  2770.           To use "Full" programming, you will configure the modem with the same 
  2771.           features as in "quick" programming, but the settings will be stored 
  2772.           in the modem's firmware (or set in modem switches). However, 
  2773.           determining how to store these settings can be difficult. A thorough 
  2774.           study of the modem manual may be required.  To program the modem, use 
  2775.           a terminal emulation program (for example, the SOFTERM program that 
  2776.           is supplied with OS/2). When programming the modem, set the terminal 
  2777.           program for 9600 bps operation, and type the appropriate modem 
  2778.           string.  Since the initialization string instructs the modem to 
  2779.           suppress result codes, the modem will not return a response. The 
  2780.           "FULL" programming strings for several modems are: 
  2781.  
  2782.            AT&F &B1 &H2 &I2 &W 
  2783.                 US Robotics HST and Dual Standard 
  2784.  
  2785.            AT&F2 E0 Q2 &D0 &K4 S0=1 &W 
  2786.                 Supra FAX/Modem V.32bis 
  2787.  
  2788.            AT&F E0 Q1 &D0 \Q1 S0=1 &W 
  2789.                 Intel 14.4EX 
  2790.  
  2791.           Note:  The US Robotics and HST Dual Standard do not store all 
  2792.           settings, but have external switches instead.  After programming the 
  2793.           modem, set the switches as follows: 
  2794.  
  2795.             1=ON               (DTR forced ON) 
  2796.             2=don't care       (result code type) 
  2797.             3=OFF              (result code suppressed) 
  2798.             4=ON               (command echo suppressed) 
  2799.             5=OFF              (auto-answer enabled) 
  2800.             6=don't care       (carrier detect function) 
  2801.             7=ON               (result code in originate mode only) 
  2802.             8=ON               (AT commands enabled) 
  2803.             9=ON               (don't disconnect for +++) 
  2804.            10=OFF              (load NVRAM at power-on) 
  2805.            QUAD=OFF            (normal connect - ON if null modem cable used) 
  2806.  
  2807.  When the modem is connected and programmed, the system will be ready for 
  2808.  remote debugging.  Re-start the system with the Kernel Debugger installed. 
  2809.  When the telephone rings, the debug modem will answer the phone and establish 
  2810.  connection with the caller.  The modem-to-kernel speed should remain at 9600 
  2811.  bps (the default speed used by the Kernel Debugger), but the modem-to-modem 
  2812.  speed can be whatever is used by the remote modem. If both modems support 
  2813.  error correction, correction will be used. 
  2814.  
  2815.  
  2816. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Limitations ΓòÉΓòÉΓòÉ
  2817.  
  2818. Since the modem communicates with the target system at 9600 bps, but can 
  2819. communicate with the remote modem at any speed, the modem must use flow control 
  2820. to avoid data overruns.  The only flow control supported by the Kernel Debugger 
  2821. is XON/XOFF. The only problem this causes is when the remote user wants to 
  2822. pause a continuous data display by pressing Ctrl+S.  If the modem has also sent 
  2823. a Ctrl+S, the one from the user will be ignored.  You may have to press Ctrl+S 
  2824. several times before the display pauses.  This is not a problem if the remote 
  2825. user's communications program supports a "scroll-back buffer," in which case 
  2826. there is no reason to pause the display with Ctrl+S. 
  2827.  
  2828.  
  2829. ΓòÉΓòÉΓòÉ <hidden> Debug Support - Trouble-Shooting ΓòÉΓòÉΓòÉ
  2830.  
  2831. If, after following these directions, you cannot establish a remote debug 
  2832. connection, this guide may help: 
  2833.  
  2834. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2835. ΓöéSymptom             ΓöéProblem             ΓöéSolution            Γöé
  2836. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2837. ΓöéModem rings but     ΓöéModem is not set forΓöécheck modem         Γöé
  2838. Γöédoesn't answer      Γöéauto-answer         Γöéprogramming (look   Γöé
  2839. Γöé                    Γöé                    Γöéfor AA light on     Γöé
  2840. Γöé                    Γöé                    Γöémodem).             Γöé
  2841. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2842. Γöé                    ΓöéPhone line not      ΓöéPlug in telephone   Γöé
  2843. Γöé                    Γöéconnected to modem  Γöéline to modem.      Γöé
  2844. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2845. ΓöéModem answers, but  ΓöéRETAIL kernel       ΓöéRemove RETAIL kernelΓöé
  2846. ΓöéKernel Debugger doesΓöéinstalled           Γöéand install DEBUG   Γöé
  2847. Γöénot respond         Γöé                    Γöékernel.             Γöé
  2848. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2849. Γöé                    ΓöéData cable not      ΓöéConnect data cable  Γöé
  2850. Γöé                    Γöéconnected properly  Γöéfrom modem to targetΓöé
  2851. Γöé                    Γöé                    Γöémachine.  plug into Γöé
  2852. Γöé                    Γöé                    ΓöéCOM2 if target      Γöé
  2853. Γöé                    Γöé                    Γöémachine has more    Γöé
  2854. Γöé                    Γöé                    Γöéthan one serial     Γöé
  2855. Γöé                    Γöé                    Γöéport.               Γöé
  2856. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2857. Γöéremote modem sees   ΓöéModem not locked at Γöécheck modem         Γöé
  2858. Γöémeaningless data on Γöé9600 bps            Γöéconfiguration.      Γöé
  2859. Γöéscreen, unable to   Γöé                    Γöé                    Γöé
  2860. Γöécontrol debug       Γöé                    Γöé                    Γöé
  2861. Γöésession             Γöé                    Γöé                    Γöé
  2862. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2863. Γöé                    ΓöéKernel Debugger not ΓöéAdd .B 9600T to     Γöé
  2864. Γöé                    Γöéoperating at 9600   ΓöéKDB.INI file (createΓöé
  2865. Γöé                    Γöébps                 Γöéfile if needed, in  Γöé
  2866. Γöé                    Γöé                    Γöéroot directory of   Γöé
  2867. Γöé                    Γöé                    Γöéboot drive). Re-bootΓöé
  2868. Γöé                    Γöé                    Γöétarget machine.     Γöé
  2869. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2870.  
  2871.  
  2872. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  2873.  
  2874. Trademark of the IBM Corporation. 
  2875.  
  2876.  
  2877. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  2878.  
  2879. See the section Debugging a Remote System. 
  2880.  
  2881.  
  2882. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  2883.  
  2884. Trademark of the Intel Corporation. 
  2885.  
  2886.  
  2887. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  2888.  
  2889. Trademark of the Intel Corporation. 
  2890.  
  2891.  
  2892. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  2893.  
  2894. Trademark of the Intel Corporation. 
  2895.  
  2896.  
  2897. ΓòÉΓòÉΓòÉ <hidden>  ΓòÉΓòÉΓòÉ
  2898.  
  2899. Trademark of the Microsoft Corporation.