6958 lines
271 KiB
Plaintext
6958 lines
271 KiB
Plaintext
CHAPTER 1 - Introduction
|
||
|
||
01.01 Product Description
|
||
01.02 Using This Manual
|
||
01.03 System Requirements
|
||
|
||
01.01 Product Description
|
||
|
||
Soft-ICE is a software debugging tool that provides hardware-level
|
||
debugging capabilities to PCDOS and MSDOS debuggers.
|
||
|
||
Soft-ICE uses 80386 protected mode to run DOS in a virtual machine.
|
||
This gives Soft-ICE complete control of the DOS environment. Soft-ICE
|
||
uses 80386 protected mode features, such as paging, I/O privilege
|
||
level, and break point registers, to add hardware-level break points
|
||
your existing DOS debugger.
|
||
|
||
Soft-ICE was designed with three goals in mind:
|
||
|
||
* To utilize the 80386 virtual machine capability to debugging
|
||
features that are impossible or prohibitively slow with
|
||
software-only debuggers (e.g., real time hardware-level break
|
||
points, memory protection, breaking out of hung programs, etc.).
|
||
* To work with existing debuggers. We wanted to provide a tool that
|
||
worked with existing tools. We designed Soft-ICE in such a way
|
||
that you don't have to learn a new debugger to get powerful
|
||
hardware debugging capabilities.
|
||
* To be a user-friendly program with a window that pops up
|
||
instantly and does not get in the way. All of the Soft-ICE
|
||
commands were designed to fit in a small window so that
|
||
information on the screen behind Soft-ICE could still be viewed.
|
||
Dynamic on-line help assists users who only use Soft-ICE
|
||
occasionally.
|
||
|
||
The Soft-ICE program features:
|
||
|
||
* real time break points on memory reads/writes, port reads/writes,
|
||
memory ranges, and interrupts
|
||
* back trace history ranges
|
||
* symbolic and source level debugging
|
||
* an environment that works with existing debuggers
|
||
* full EMM 4.0 support
|
||
* backfilling to raise base memory past 640K for monochrome systems
|
||
* a window that can pop up at any time
|
||
* the ability to break out by keystroke even if interrupts are
|
||
disabled
|
||
* debugger code that is isolated by 80386 protected mode. This
|
||
prevents an errant program from modifying or destroying Soft-ICE;
|
||
even if DOS clobbered, Soft-ICE will still work
|
||
* the ability to configure Soft-ICE to use no memory in the lower
|
||
640K if the system has more than 640K
|
||
* user-friendly dynamic help
|
||
* the ability to be used as a stand-alone debugger. This ability is
|
||
useful if you are debugging loadable device drivers, interrupt
|
||
handlers, or boot sequences where traditional debuggers can't go,
|
||
if your debugger suffers from re-entrancy problems
|
||
* a soft boot capability that allows debugging with non-DOS
|
||
operating systems or self-booting programs
|
||
* a simple installation, with no DIP switches to set no I/O ports
|
||
taken up, and no memory address space conflicts
|
||
|
||
NOTE : Soft-ICE will work with real address mode programs only. It
|
||
will not work with programs that use 80286 or 80386 protected mode
|
||
instructions.
|
||
|
||
01.02 Using This Manual
|
||
|
||
The Soft-ICE manual is divided into four main sections:
|
||
|
||
* Learning Soft-ICE (Section I)
|
||
* Commands (Section II)
|
||
* Support Features (Section lII)
|
||
* Advanced Topics (Section IV)
|
||
|
||
Soft-ICE can be used for most debugging problems after reading Section
|
||
I, Learning Soft-ICE, and a little experimentation. Soft-ICE's
|
||
user-friendly on-line help can be used to reference command
|
||
descriptions and syntax.
|
||
|
||
The Learning Soft-ICE section contains installation instructions, a
|
||
description of the user interface, and a tutorial. The tutorial is
|
||
designed to get you up and running quickly.
|
||
|
||
The Commands section describes all of the Soft-ICE commands. The
|
||
command descriptions are organized by functional group with an
|
||
alphabetic index for reference.
|
||
|
||
The Support Features section covers advanced loading options, symbolic
|
||
and source level debugging, and EMM 4.0 capability.
|
||
|
||
The Advanced Topics section covers topics such as using Soft-ICE with
|
||
DOS loadable drivers and using Soft-ICE with non-DOS operating
|
||
systems.
|
||
|
||
Throughout the manual, especially in the tutorial and the command
|
||
section, examples are given that require you to give data to Soft-ICE.
|
||
When the directions specify that you "press" a key, such as the key,
|
||
you should press the key labelled. When the directions tell you to
|
||
"enter" a phrase, such as WIN, you should type in the specified
|
||
letters, then press the ENTER key.
|
||
|
||
01.03 System Requirements
|
||
|
||
Soft-ICE works with the IBM Series II Model 70 and 80, Compaq 80386
|
||
and 80386SX computers, AT compatible and 80386 co-processor cards.
|
||
Soft-ICE will only work with 80386 XT co-processors if they are AT
|
||
compatible.
|
||
|
||
Soft-ICE works best with extended memory, but works fine with
|
||
conventional memory systems.
|
||
|
||
Soft-ICE does not use DOS or ROM BIOS for its video output and
|
||
keystroke input. Therefore the video must be compatible with one of
|
||
the following: MDA, Hercules, CGA, EGA, or VGA. Soft-ICE also has
|
||
support for a two- monitor configuration, which can be very helpful
|
||
when debugging video- intensive programs.
|
||
CHAPTER 2 - Getting Started
|
||
|
||
02.01 The Diskettes
|
||
02.02 Loading Soft-ICE
|
||
02.02.01 Loading Without Extended Memory
|
||
02.02.02 Loading With Extended Memory
|
||
02.02.03 Configuring Soft-ICE for a Customized Installation
|
||
02.03 Unloading Soft-ICE
|
||
02.04 Reloading Soft-ICE
|
||
|
||
02.01 The Diskettes
|
||
|
||
Soft-ICE comes on either a 5 1/4" diskette or a 3 1/2" diskette.
|
||
|
||
When you run Soft-ICE, the name of the person that your copy of
|
||
Soft-ICE is licensed to is displayed on the screen as a deterrent to
|
||
software pirates. The Soft-ICE diskette is not physically
|
||
copy-protected for your convenience. For our convenience, we
|
||
appreciate your high regard for our licensing agreement. It is
|
||
important to make a duplicate copy to be used only for backup in case
|
||
the original diskette is damaged.
|
||
|
||
A directory of a Soft-ICE diskette will show the following files:
|
||
|
||
S-ICE.EXE is the Soft-ICE program.
|
||
S-ICE.DAT is the Soft-ICE initialization file.
|
||
LDR.EXE is the Soft-ICE program and symbol file loader.
|
||
MSYM.EXE is the Soft-ICE symbol file creation program.
|
||
|
||
EMMSETUP.EXE is a program that allows you to customize the way your
|
||
system uses expanded memory.
|
||
UPTIME.EXE sets the time to that of the real time clock.
|
||
|
||
README.SI is a text file containing information about Soft-ICE
|
||
that did not make it into this manual.
|
||
|
||
SAMPLE.EXE is a short demonstration program that is used with the
|
||
tutorial.
|
||
|
||
SAMPLE.ASM is the assembly language source file for the
|
||
demonstration program.
|
||
SAMPLE.SYM is the symbol file for the demonstration program.
|
||
|
||
02.02 Loading Soft-ICE
|
||
|
||
Before running Soft-ICE, copy all of the files on the distribution
|
||
diskette to your hard disk.
|
||
|
||
These files should be placed in a directory that is accessible through
|
||
your alternate path list.
|
||
|
||
S-ICE.EXE can be loaded as a device driver in CONFIG.SYS or can be run
|
||
as a program from the command line. To use many of Soft-ICE's
|
||
features, S- ICE.EXE must be loaded as a device driver in CONFIG.SYS.
|
||
|
||
Note : If you do not have extended memory, Soft-ICE can NOT loaded as
|
||
a device driver. Instead, it must be run from the DOS prompt.
|
||
|
||
02.02.01 Loading Without Extended Memory
|
||
|
||
When no extended memory is present, Soft-ICE loads it at the highest
|
||
memory location possible. The memory used by Soft-ICE is then 'mapped
|
||
out', making it invisible to DOS programs. Since the total memory
|
||
visible to DOS its programs is less after Soft-ICE loads, it is
|
||
recommended that you load Soft-ICE before any TSR's or control
|
||
programs.
|
||
|
||
If you do not have extended memory, simply enter: S-ICE
|
||
|
||
02.02.02 Loading With Extended Memory
|
||
|
||
Loading Soft-ICE with extended memory can be done in one of two ways:
|
||
|
||
1. Install S-ICE,EXE as a driver in CONFIG,SYS, This method is
|
||
necessary if you will be using one the following capabilities:
|
||
|
||
* Sharing memory with program that use extended memory by using ROM
|
||
BIOS calls (VDISK.SYS, RAMDRIVE.SYS, HIMEM.SYS, cache programs,
|
||
etc.)
|
||
* Using Soft-ICE's EMM 4,0 capability,
|
||
* Using Soft-ICE for symbolic or source level debugging.
|
||
* Using back trace ranges.
|
||
* Using Soft-ICE with other Nu-Mega products such as Magic CV.
|
||
|
||
When loaded as a driver, Soft-ICE allocates a portion of extended
|
||
memory for itself and its associated components so there can be no
|
||
memory conflicts. S-ICE.EXE must be loaded in CONFIG.SYS before any
|
||
other driver that allocates extended memory is loaded (e.g.,
|
||
VDISK.SYS, RAMDRIVE.SYS). Generally Soft-ICE works best if it is the
|
||
first loadable device driver installed in CONFIG.SYS. For users that
|
||
are new to Soft-ICE it is advisable to load Soft-ICE as the first
|
||
driver in CONFIG.SYS with the following statement:
|
||
|
||
device=drive:\path\S-ICE.EXE /SYM 50
|
||
|
||
Drive and path specify the directory where S-ICE.EXE is located. This
|
||
statement will load Soft-ICE at system initialization and will be
|
||
adequate for the tutorial. However, Soft-ICE will not be installed for
|
||
some of its more powerful features such as EMM 4.0. You can
|
||
reconfigure Soft-ICE with those features enabled after you have
|
||
experimented a bit. If you already have experience with Soft-ICE or
|
||
would like to set up Soft-ICE with those features immediately, please
|
||
read chapter 6 (Soft-ICE Initialization Options).
|
||
|
||
Caution : When installing any new device driver for the first time on
|
||
your system, it is advisable to have a boot diskette available This
|
||
precautionary measure is for the unlikely event that The default setup
|
||
of the device driver is not compatible with your system.
|
||
|
||
If you are not sure how to edit your CONFIG.SYS file, refer to your
|
||
system user's guide or your text editor user's guide for instructions.
|
||
After you have modified your CONFIG.SYS file, you must reboot your
|
||
system to have the changes take effect.
|
||
|
||
2. Run Soft-ICE from the DOS Prompt by typing S-ICE. Before actually
|
||
loading, Soft-ICE will display a loading message and prompt. To
|
||
prevent this prompt, place the word EXTENDED in the S-ICE.DAT file.
|
||
See section 6.4 for more information on the S-ICE.DAT file. Using this
|
||
method, S-ICE.EXE is automatically loaded into the top of extended
|
||
memory, whether or not anything else is already there. If you know you
|
||
will not have any other programs using extended memory, this method is
|
||
acceptable. When loaded with this method, Soft-ICE occupies ZERO bytes
|
||
of conventional memory. The command you use is:
|
||
|
||
S-ICE
|
||
|
||
Notes : You can NOT enable all of Soft-ICE's features when Loading
|
||
from the command line. If you will be using Soft-ICE as a stand-alone
|
||
debugger, it is recommended to Load Soft-ICE from CONFIG.SYS.
|
||
|
||
If you want to load Soft-ICE as a device driver, but don't want
|
||
Soft-ICE to be resident all of the time, you should use the /UN
|
||
loading switch. Refer to section 6.3.1 for more information.
|
||
|
||
02.02.03 Configuring Soft-ICE for a Customized Installation
|
||
|
||
You can customize Soft-ICE with Soft-ICE loading switches in
|
||
CONFIG.SYS and with the Soft-ICE initialization file S-ICE.DAT. The
|
||
CONFIG.SYS loading switches allow you to customize how the extended
|
||
memory will be reserved by Soft-ICE. The initialization file S-ICE.DAT
|
||
allows you to specify configuration options, assign commands to
|
||
function keys, and define an auto-start string. An auto-start string
|
||
is used to execute a series of commands that you use every time you
|
||
install Soft-ICE. for more information about customizing Soft-ICE,
|
||
refer to chapter 6.
|
||
|
||
02.03 Unloading Soft-ICE
|
||
|
||
Occasionally you may need to unload Soft-ICE. A typical reason for
|
||
unloading Soft-ICE is to run a program that uses 80286 or 80386
|
||
protected mode instructions. To unload Soft-ICE, enter:
|
||
|
||
S-ICE /U
|
||
|
||
This command places the machine back in real address mode. If Soft-ICE
|
||
was initially loaded from CONFIG.SYS When the memory is still reserved
|
||
for Soft-ICE and can not be used by other software. If Soft-ICE was
|
||
initially loaded from the command line, unloading frees up the memory
|
||
consumed by S- ICE.EXE.
|
||
|
||
Caution : If you have any backfilled memory in your system, or if
|
||
expanded memory is currently being used, unloading Soft-ICE could
|
||
crash your system.
|
||
|
||
02.04 Reloading Soft-ICE
|
||
|
||
Soft-ICE can be re-loaded at any time even if it had initially been
|
||
loaded in CONFIG.SYS. If Soft-ICE had initially been loaded in
|
||
CONFIG.SYS then the original configuration options (EMM 4.0, symbols
|
||
and source...) are still in effect. To reload Soft-ICE, enter:
|
||
|
||
S-ICE
|
||
CHAPTER 3 - Debugging In 30 Minutes
|
||
|
||
03.01 Introduction
|
||
03.02 Popping Up the Window
|
||
03.03 Returning From the Window
|
||
03.04 Changing the Window Size
|
||
03.05 Moving the Window
|
||
03.06 Line Editing Keystrokes
|
||
03.07 Interactive Status Line
|
||
03.08 Command Syntax
|
||
03.08.01 Specifying Memory Addresses
|
||
03.09 Function Keys
|
||
03.10 Help
|
||
03.11 Tutorial
|
||
|
||
03.01 Introduction
|
||
|
||
All interaction with Soft-ICE takes place through a window that can be
|
||
popped up at any time. All Soft-ICE commands fit in a small window,
|
||
but the window can be enlarged to full screen. You will typically use
|
||
the small window when using Soft-ICE as an assistant to another
|
||
debugger, and the large window when using Soft-ICE in stand-alone
|
||
mode.
|
||
|
||
The window initially comes up in full screen mode if you are using the
|
||
Soft-ICE configuration file (S-ICE DAT) that was included on the
|
||
distribution diskette.
|
||
|
||
03.02 Popping Up the Window
|
||
|
||
You can bring up the window at any time after installing Soft-ICE. You
|
||
initially bring up Soft-ICE by pressing the CTRL D keys. However, this
|
||
sequence can be changed by using the ALTKEY command (see section 5.8).
|
||
|
||
03.03 Returning From the Window
|
||
|
||
Return to the original display by using the X command or the key
|
||
sequence that you used to invoke Soft-ICE. Any break points that you
|
||
set while working in Soft-ICE will be armed at this point.
|
||
|
||
03.04 Changing the Window Size
|
||
|
||
You can modify both the width and the height of the Soft-ICE window.
|
||
Changing the window size is particularly useful in stand-alone mode
|
||
when you are displaying code memory.
|
||
|
||
The window height can vary from 8 to 25 lines tall. To change the
|
||
window height, use the following key sequences:
|
||
|
||
ALT UP : makes the window taller
|
||
ALT DOWN : makes the window shorter
|
||
|
||
To change the window width, use the WIN command (see section 5.9).
|
||
Entering WIN with no parameters toggles between the following two
|
||
modes:
|
||
|
||
WIDE mode : full screen width
|
||
NARROW mode : 46 characters wide
|
||
|
||
Some commands (D, E, R, U) take advantage of the extra width by
|
||
displaying more information when the window is in wide mode.
|
||
|
||
03.05 Moving the Window
|
||
|
||
The Soft-ICE window is movable and can be positioned anywhere on the
|
||
screen. This is particularly useful when the window is in narrow mode.
|
||
Move the window anytime you need to view information on the screen
|
||
behind the window. The following key sequences move the window:
|
||
|
||
CTRL UP : moves the window one row up
|
||
CTRL DOWN : moves the window one row down
|
||
CTRL RIGHT : moves the window one column right
|
||
CTRL LEFT : moves the window one column left
|
||
|
||
03.06 Line Editing Keystrokes
|
||
|
||
Soft-ICE's easy-to-use line editor allows you to recall and edit
|
||
previous commands. The line editor functions are similar to those of
|
||
the popular CED line editor. The following key sequences help you edit
|
||
commands in the command window :
|
||
|
||
LEFT : moves the cursor to the right
|
||
RIGHT : moves the cursor to the left
|
||
INS : toggles insert mode
|
||
DEL : deletes the current character
|
||
HOME : moves the cursor to start of the line
|
||
END : moves the cursor to the end of the line
|
||
UP : displays the previous command
|
||
DOWN : displays the next command
|
||
SHIFT : scroll one line up in display
|
||
SHIFT : scroll one line down in display
|
||
PAGE UP : scroll one page up in display
|
||
PAGE DN : scroll one page down in display
|
||
BKSP : deletes the previous character
|
||
ESC : cancels the current command
|
||
|
||
There are special key assignments when the cursor is in the data
|
||
window or the code window. These are described in the sections for the
|
||
E and EC command respectively. One special assignment of note is the
|
||
SHIFT UP and SHIFT DOWN keys while the cursor is in the code window.
|
||
These keys are re-assigned so they have the functions that UP and DOWN
|
||
normally have. This way you can recall previous commands while the
|
||
cursor is in the code window.
|
||
|
||
03.07 Interactive Status Line
|
||
|
||
A status line at the bottom of the window provides interactive help
|
||
with command syntax.
|
||
|
||
03.08 Command Syntax
|
||
|
||
Soft-ICE is a command-driven debugging tool. To interact with
|
||
Soft-ICE, you enter commands, which can optionally be modified by
|
||
parameters.
|
||
|
||
All commands are text strings that are one to six characters in length
|
||
and are case insensitive. AlI parameters are either ASCII strings or
|
||
expressions.
|
||
|
||
Expressions are typically numbers, but can also be combinations of
|
||
numbers and operators (e.g., + - / *). All numbers are displayed in
|
||
hexadecimal format. Byte parameters are 2 digits long, word parameters
|
||
are 4, and double word parameters are 2 word parameters separated by a
|
||
colon (:). Here are some examples of parameters:
|
||
|
||
12 : byte parameter
|
||
10FF : word parameter
|
||
E000:0100 : double word parameter
|
||
|
||
Registers can be used in place of bytes or words in an expression. For
|
||
example, the command 'U CS:IP-10' will start unassembling instructions
|
||
ten bytes before the current instruction pointer address. The
|
||
following register name may be used in an expression: AL, AH, AX, BL,
|
||
BH, BX, CL, CH, CX, DL, DH, DX, DI, SI, BP, SP, IP, CS, DS, ES, SS, or
|
||
FL
|
||
|
||
03.08.01 Specifying Memory Addresses
|
||
|
||
Many Soft-ICE commands require memory addresses as parameters. A
|
||
memory address is a value that is made of two 16-bit words, separated
|
||
by a colon. The first word is the segment address, and the second word
|
||
is the segment offset.
|
||
|
||
Public symbols can be used in place of an address in any Soft-ICE
|
||
command. The public symbols must have been loaded with the Soft-ICE
|
||
program loader (LDR.EXE). See chapter 7 (Symbols and Source) for a
|
||
complete description of using public symbols.
|
||
|
||
The Soft-ICE expression evaluator recognizes several special
|
||
characters in conjunction with addresses. These special characters
|
||
are:
|
||
|
||
$ : Current CS:IP.
|
||
@address : Double Word Indirection
|
||
.number : Source Line Number
|
||
|
||
The $ character can be used in place of CS:IP when typing the address
|
||
of the current instruction pointer.
|
||
|
||
The @ character allows you to refer to the double word pointed to by
|
||
the address. You can have multiple levels of @'s.
|
||
|
||
If the . character precedes an address, the address will be
|
||
interpreted as a source line number in the current file, rather than
|
||
an actual address. This is only valid when source files are loaded.
|
||
The address is interpreted as a decimal number in this case. Examples:
|
||
|
||
U.1234 : This command starts unassembling instructions at source
|
||
line 1234 decimal.
|
||
U $-10 : This command unassembles instructions starting 10 bytes
|
||
prior to the current instruction pointer.
|
||
G @SS:SP : Assume you are at the first instruction of an interrupt
|
||
routine. Entering this command will set a temporary break
|
||
point at the return address on the stack and skip the
|
||
interrupt routine.
|
||
|
||
03.09 Function Keys
|
||
|
||
Function keys can be assigned to any command string that can be typed
|
||
into Soft-ICE. Function keys can be assigned from the command line or
|
||
pre-initialized through the Soft-ICE definition file S-ICE.DAT.
|
||
|
||
The default S-ICE.DAT that comes on the Soft-ICE distribution diskette
|
||
has definitions for all 12 function keys. You can change any of these
|
||
definitions at any time. They are intended as examples, but they are
|
||
designed to make easy for users of Microsoft's CodeView, Thee default
|
||
assignments are:
|
||
|
||
F1 : Displays general help "^H;"
|
||
F2 : Toggles the register window "^WR;"
|
||
F3 : Changes current source mode "^SRC;"
|
||
F4 : Restores screen "^RS;"
|
||
F5 : Returns to your program "^X;"
|
||
F6 : Toggles cursor between command window code window "^EC;"
|
||
F7 : Goes to current cursor line "^HERE;"
|
||
F8 : Single steps "^T;"
|
||
F9 : Sets break point at current cursor line "^BPX;"
|
||
F10 : Program steps "^P;"
|
||
F11 : Go to return address (large model) "^G @SS:SP;"
|
||
F12 : Displays Soft-ICE version number "^VER;"
|
||
|
||
A caret (^) preceding a command makes it invisible, a semi-colon (;)
|
||
following a command represents a carriage return. You can display the
|
||
current function key assignments by entering the command:
|
||
|
||
FKEY
|
||
|
||
To use a function key simply press the function key instead of
|
||
entering the command. To program function keys see section 5.8 for a
|
||
description of the FKEY command, or chapter 6 for a description of
|
||
pre-initializing function keys in S-ICE.DAT.
|
||
|
||
03.10 Help
|
||
|
||
The help command displays a short description, a syntax expression,
|
||
and an example of each command. To display help information, enter:
|
||
|
||
? or H : displays short descriptions of all commands and operators
|
||
? command or H command : displays more detailed information on the
|
||
specified command, syntax, and an example
|
||
? expression or H expression : displays the value of the expression
|
||
in hexadecimal, decimal and ASCII
|
||
|
||
03.11 Tutorial
|
||
|
||
The following tutorial demonstrates a few of the features Soft-ICE and
|
||
gives you the opportunity to try using Soft-ICE. Soft-ICE can be used
|
||
in conjunction with another debugger or as a stand-alone debugger. The
|
||
tutorial demonstrates using Soft-ICE as an assistant to the DOS
|
||
debugger, DEBUG, and then shows how Soft-ICE can be used as a
|
||
stand-alone debugger with source and symbols loaded. DEBUG can be
|
||
found on the PCDOS or MSDOS system diskette. If you do not have DEBUG,
|
||
you can use another debugger in its place, or Soft-ICE can be used as
|
||
a stand-alone debugger.
|
||
|
||
Users who need to use Soft-ICE for a reverse engineering project, or
|
||
for debugging DOS loadable device drivers or Terminate and Stay
|
||
Resident programs should go through this tutorial too. Even though
|
||
examples of these types of programs are not demonstrated directly, you
|
||
will get an overview of debugging with Soft-ICE. It is recommended
|
||
that you experiment with Soft-ICE and your particular environment
|
||
before beginning a real project.
|
||
|
||
A short assembly language program with a subtle flaw is used to
|
||
demonstrate hardware-style break points. The sample program has been
|
||
kept intentionally short and to-the-point for those not very familiar
|
||
with assembly language. The tutorial is designed to give you a peek at
|
||
Soft-ICE features. Feel free to experiment on your own after going
|
||
through the tutorial.
|
||
|
||
Since Soft-ICE is very flexible, it allows you to load in the way that
|
||
is best for your system. Go through the installation procedures in
|
||
section 2.2 before continuing with the tutorial.
|
||
|
||
If you do not have extended memory on your system, you must load
|
||
Soft-ICE from the command line. When loading Soft-ICE from the command
|
||
line you can not load symbols or source files. In this case you must
|
||
improvise in the last section of the tutorial where Soft-ICE is used
|
||
as a stand-alone debugger.
|
||
|
||
Soft-ICE can be loaded from the DOS prompt or loaded as a device
|
||
driver in CONFIG.SYS. For the purpose of this tutorial you should
|
||
install Soft-ICE in CONFIG.SYS with at least 50K of extended memory
|
||
reserved for symbols and source files. Soft-ICE should be the first
|
||
device driver installed in CONFIG.SYS. The device installation line
|
||
should look like:
|
||
|
||
DEVICE = drive: path\S -ICE.EXE /SYM 50
|
||
|
||
The /SYM 50 parameter instructs Soft-ICE to reserve 50 kilobytes of
|
||
extended memory for symbols and source file This is not enough to
|
||
solve most real world problems, but will work for our sample program.
|
||
You must re-boot your system after placing this line in CONFIG.SYS.
|
||
|
||
When you re-boot your system Soft-ICE displays a copyright notice, a
|
||
registration number, the name of the person who owns this copy of
|
||
Soft-ICE, and the amount a extended memory reserved for each Soft-ICE
|
||
component. On a system with 384K of extended memory the initial screen
|
||
looks like:
|
||
|
||
Soft-ICE Exact /Out Rage Pirates Registration # SI123456
|
||
(C) Nu-Mega Technologies 1987-1989 All Rights Reserved.
|
||
Soft-ICE Version 2.00
|
||
Soft-ICE is loaded from 00132000H up to 00160000H.
|
||
50K of symbol space reserved.
|
||
10K of back trace space reserved.
|
||
200 K of extended memory available.
|
||
|
||
The "Soft-ICE is loaded ..." message tells you the exact area of
|
||
memory that Soft-ICE and its components are occupying. If you are on a
|
||
Compaq or Compaq clone and have included the word COMPAQ in your
|
||
S-ICE.DAT file you would also see a message saying "Using high memory
|
||
from XXXXXXXX to 00FE0000H".
|
||
|
||
The next line tells you how much symbol space has been reserved. This
|
||
space is used for both symbols and source files.
|
||
|
||
The next line tells you how much memory has been reserved for back
|
||
trace history. This amount defaults to 10K. This memory area is used
|
||
by the SNAP command and the BPR command with the T or TW options.
|
||
|
||
The last line tells you how much memory is left for regular extended
|
||
memory. This memory can be used by other programs, such as HIMEM,
|
||
SMARTDRIVE, VDISK, etc.
|
||
|
||
Change directories to the hard drive directory where you loaded all
|
||
the files from your distribution diskette. Remember, this directory
|
||
must be accessible from your alternate path list.
|
||
|
||
Before we get into heavy debugging, let's bring the Soft-ICE window up
|
||
and give it a test drive. Clear the screen by entering : CLS and bring
|
||
up the Soft-ICE window by pressing : CTRL D.
|
||
|
||
The Soft-ICE window is now on the screen. If you have file S-ICE.DAT
|
||
accessible from your path then the Soft-ICE window will occupy the
|
||
entire screen. It will be divided into four sections. From top to
|
||
bottom, these sections are the register window, the data window, the
|
||
code window, and the command window. If S-ICE.DAT was not found then
|
||
you will have a small window in the center of the screen. This also
|
||
means that other components needed for the tutorial have not been
|
||
loaded.
|
||
|
||
If the small window is visible you should:
|
||
|
||
1. Exit from Soft-ICE by entering X.
|
||
2. Unload Soft-ICE by entering S-ICE /U.
|
||
3. Copy the file S-ICE.DAT from the distribution diskette to a
|
||
directory accessible from your current path.
|
||
4. Restart the demo.
|
||
|
||
We will now switch to the small window. The small window is very
|
||
convenient for using Soft-ICE as an assistant to another debugger.
|
||
Enter : WIN
|
||
|
||
This will make a small command window in the center of the screen.
|
||
Several Soft-ICE commands are visible on this screen. These are
|
||
remnants of the initialization string in S-ICE.DAT that originally set
|
||
up Soft-ICE in the full screen mode. You will notice a prompt symbol
|
||
(:) and a status line at the bottom of the window.
|
||
|
||
The Soft-ICE window can be moved around on the screen, and the window
|
||
size can be adjusted. Move the window around the screen by pressing:
|
||
|
||
CTRL UP : moves the window one row up
|
||
CTRL DOWN : moves the window one row down
|
||
CTRL RIGHT : moves the window one column right
|
||
CTRL LEFT : moves the window one column left
|
||
|
||
Change the window size so that it fills the whole screen by entering :
|
||
WIN. You will notice that the original screen is back. Change back to
|
||
the small window by entering WIN again. Make the window taller or
|
||
shorter by pressing :
|
||
|
||
ALT UP : makes the window taller
|
||
ALT DOWN : makes the window shorter
|
||
|
||
Now try what comes naturally when you're in front of a new program and
|
||
you don't have the foggiest notion of what to do next, ask for help.
|
||
Get a help display by entering : ?
|
||
|
||
Notice how the display stops and waits for a keystroke before
|
||
scrolling any information off the screen. Look at the status line at
|
||
the bottom of the window. The status line displays the instructions:
|
||
"Any Key To Continue, ESC to Cancel ". Now press any key to continue
|
||
displaying more the help information. Continue pressing the key until
|
||
the prompt (:) reappears.
|
||
|
||
Scroll back through the help information by pressing : SHIFT.
|
||
Previously displayed information in the command window can be scrolled
|
||
with the shift up, shift down, page up and page down keys. Try a
|
||
variety of these keys to scroll through the help information.
|
||
|
||
The Soft-ICE help facility gives you an overview of each command. If
|
||
you enter a question mark (?) followed by a command name, you see a
|
||
display showing the command syntax, a short description of the
|
||
command, and an example. Try experimenting with help by entering
|
||
commands in this format: ? command.
|
||
|
||
For example, ? ALTKEY. Pay attention to the status line prompts on the
|
||
bottom line of the screen if you get confused.
|
||
|
||
The help command also allows you to evaluate hexadecimal expressions.
|
||
For example, enter : ? 10*2+42. The resulting display shows you the
|
||
value of the expression, first in hexadecimal, then decimal, then in
|
||
ASCII representation : 0062 00098 "b"
|
||
|
||
We brought up the window with the CTRL D key sequence. That's all
|
||
right for some, but you may prefer to use another key sequence. We are
|
||
now going to enter a command to change the key sequence required to
|
||
bring up the window. We'll do this one step at a time, so you can get
|
||
used to the status line at the bottom of the window.
|
||
|
||
Type the letter 'A'. The status line displays a list of all the
|
||
commands starting with the letter 'A'. Finish typing the word
|
||
'ALTKEY'. The status line now displays a short description of the
|
||
/ALTKEY command Press the space bar. The status line now shows the
|
||
required syntax for the /ALTKEY command. Type the letters 'ALT D' then
|
||
press ENTER to enter the entire command : ALTKEY ALTD
|
||
|
||
You just changed the window pop up key sequence to ALT D. From now on,
|
||
you must press the ALT D key sequence to pop up the window. This is
|
||
assumed throughout the remainder of the tutorial. Now let's test the
|
||
previous command. To exit from the window, press : ALT D
|
||
|
||
The Soft-ICE window just disappeared. To return to the Soft-ICE
|
||
window, release the ALT key, then press: ALT D The window returned.
|
||
|
||
To see some previous commands, press: the UP key a few times. Notice
|
||
that Soft-ICE remembers commands that have been entered. Try editing
|
||
one just for fun. Some of the editing keys are:
|
||
|
||
INS : toggles insert mode
|
||
DEL : deletes the current character
|
||
HOME : moves the cursor to start of the line
|
||
END : moves the cursor to the end of the line
|
||
LEFT : Moves the cursor one column to the right
|
||
RIGHT : Moves the cursor one column to the left
|
||
|
||
When insert mode is on, notice that the cursor is in a block shape.
|
||
|
||
Now that you are somewhat familiar with the environment let's try some
|
||
more commands. Erase the command you were editing by pressing the HOME
|
||
key, then pressing the DEL key until the command is gone. Enter : WR.
|
||
|
||
The WR command makes the register window visible. The register window
|
||
displays the contents of the 8086 registers. Notice that the register
|
||
values reflect the location where the code was executing when you
|
||
invoked Soft-ICE.
|
||
|
||
The WR command is assigned to the function key F2 in the Soft-ICE
|
||
initialization file S-ICE.DAT. Press the F2 key several times and you
|
||
will see the register window toggle on and off. Leave the register
|
||
window visible.
|
||
|
||
Extend the vertical size of the Soft-ICE window by holding down the
|
||
ALT and the until the window is the entire length of the screen.
|
||
Notice the values of the CS and IP registers in the register window,
|
||
then enter : MAP
|
||
|
||
The MAP command displays a system memory map. The area of the current
|
||
instruction pointer (CS:IP) is highlighted. If you have a complex
|
||
memory map you may have to press a key a few times until the until the
|
||
prompt reappears.
|
||
|
||
Now try the following sequence a few times, noticing the (CS:IP)
|
||
registers in the register window. ALT D, release ALT and D, ALT D
|
||
|
||
Each time you bring the Soft-ICE window back up you will notice that
|
||
the CS and IP registers have changed. When CS and IP change you can
|
||
enter the MAP command again to see if the instruction pointer now
|
||
points to a different area. This little exercise demonstrates that
|
||
Soft-ICE is a system level debugger that pops up wherever the
|
||
instruction pointer happens to be when you press the Soft-ICE hot key
|
||
sequence. The instruction pointer is continuously changing because
|
||
there is a lot of activity happening behind the scenes even when you
|
||
are at the DOS prompt, such as timer interrupts, DOS device driver
|
||
polling, DOS busy waiting other interrupts, etc.
|
||
|
||
Press the F12 function key. The F12 function key defaults to be
|
||
assigned to the Soft-ICE VER command. It displays the Soft-ICE
|
||
copyright message and the version number.
|
||
|
||
We will now assign the F12 function key to the Soft-ICE RS command.
|
||
Enter : RS. This will temporarily show the program screen without the
|
||
Soft-ICE window. Press the space bar to get back to get back the
|
||
Soft-ICE window. Enter : FKEY F12 RS;
|
||
|
||
This assigns the RS command to the F12 key. The semi-colon represents
|
||
the ENTER key. Press the F12 key. Repeat this a few times to toggle
|
||
between the Soft-ICE window and the program screen. Now make sure the
|
||
Soft-ICE window is displayed, by pressing the F12 key if necessary.
|
||
You will notice RS displayed several times in the window. There is one
|
||
occurrence for each time you pressed the F12 key to show the program
|
||
screen.
|
||
|
||
Clear the Soft-ICE window by entering : CLS. Enter : FKEY F12 ^RS;.
|
||
The ^ symbol assigns the RS command to the F12 key, but makes it an
|
||
invisible command. Press the F12 key several times. Notice that the RS
|
||
command no longer displays in the Soft-ICE window. You can also assign
|
||
a sequence of Soft-ICE commands to a function key. Remember to place a
|
||
carriage return between each command.
|
||
|
||
Now let's prepare to use Soft-ICE as an assistant to the MSDOS DEBUG
|
||
utility. Get rid of the register window by pressing the F2 then shrink
|
||
the window size down to about 6 lines by Using ALT. Enter : ACTION
|
||
INT3
|
||
|
||
This command tells Soft-ICE to generate interrupt 3's when break point
|
||
conditions are met. That's how Soft-ICE will communicate with DEBUG.
|
||
The default setting is HERE. ACTION HERE will cause control to return
|
||
directly to Soft-ICE. Use ACTION HERE when using Soft-ICE as a
|
||
stand-alone debugger.
|
||
|
||
For those of you not using DEBUG with this tutorial you might have to
|
||
improvise now. CODEVIEW works with ACTION NMI. Most other debuggers
|
||
will work with ACTION set to INT3. If your debugger doesn't, and you
|
||
need help improvising, refer to the complete description ACTION (see
|
||
section 5.4).
|
||
|
||
To make the Soft-ICE window disappear again, enter : X. This is an
|
||
alternative method to exit from Soft-ICE. This especially useful in
|
||
function key definitions.
|
||
|
||
Now that you are familiar with some of the basics of using Soft-ICE,
|
||
let's learn some details by debugging the sample program (SAMPLE.ASM).
|
||
SAMPLE.ASM is a simple program written in assembly language by a
|
||
programmer named Jed. The program reads a keystroke from DOS and
|
||
displays a message telling whether the keystroke was a space.
|
||
|
||
To run the program SAMPLE, at the DOS prompt, enter : SAMPLE
|
||
|
||
Now press the space bar. Press several keys. Jed's program obviously
|
||
has a problem! Jed has spent hours studying this source code and is
|
||
certain there are no flaws in his logic. However, Jed borrowed some
|
||
'helper' routines from his friend Jake (get_key, is_space?). Jed is
|
||
somewhat suspect these routines but he cannot find the bug. The source
|
||
code for Jed's program looks like this:
|
||
|
||
Page 55,80
|
||
Title Sample
|
||
|
||
DATA Segment Public 'Data'
|
||
pad db 12H dup(O)
|
||
char db 0
|
||
answer db 0
|
||
space_msg db 'The Character is a SPACE',0DH,0AH,'$'
|
||
no_space_msg db 'The Character is NOT a'
|
||
db 'SPACE',0DH,0AH,'$'
|
||
DATA Ends
|
||
|
||
STACK Segment Stack 'Stack'
|
||
Dw 128 Dup (?) ;Program stack
|
||
STACK Ends
|
||
|
||
CODE Segment Public 'Code'
|
||
Assume CS:CODE,DS:DATA,ES:Nothing,SS:STACK
|
||
|
||
start:
|
||
mov ax,DATA ; Set up segments
|
||
mov es,ax
|
||
mov ds,ax
|
||
|
||
main_loop: ; Main Program Loop
|
||
call get_key
|
||
call is_space
|
||
cmp answer,0
|
||
je no_space
|
||
|
||
; It's a space, so display the space message
|
||
mov ah,9
|
||
mov dx,offset space_msg
|
||
int 21H
|
||
jmp main_loop
|
||
|
||
; It's NOT a space, so display the no space message
|
||
no_space:
|
||
mov ah,9
|
||
mov dx,offset no_space_msg
|
||
int 21H
|
||
jmp main_loop
|
||
|
||
;----------------------------------------------------------;
|
||
; JAKE'S ROUTINES ;
|
||
;----------------------------------------------------------;
|
||
; Get Key Routine (one of Jake's routines)
|
||
|
||
get_key proc
|
||
mov ah,8
|
||
int 21H
|
||
mov char,al
|
||
ret
|
||
get_key endp
|
||
|
||
; Check if character is a space (one of Jake's routines)
|
||
is_space proc
|
||
cmp char,20H
|
||
jne not_space
|
||
mov answer, 1
|
||
ret
|
||
not_space:
|
||
mov cs:answer,0
|
||
ret
|
||
is_space endp
|
||
|
||
CODE Ends
|
||
|
||
End.
|
||
|
||
Jed has been using DEBUG but has not been able to pinpoint the
|
||
problem. As a recommendation from his nephew Jethro, Jed has purchased
|
||
Soft-ICE. He was somewhat reluctant to use it because he had tried a
|
||
hardware-assisted debugger but could never get it working quite right.
|
||
He was willing to try Soft-ICE because he could continue to use DEBUG
|
||
-- the only debugger he really understood.
|
||
|
||
Press CTRL C to break out of the program. Enter the following
|
||
commands:
|
||
|
||
DEBUG drive:\pathname\SAMPLE. EXE
|
||
U
|
||
R
|
||
|
||
In the hours Jed has spent trying to find this elusive bug, he has had
|
||
the suspicion that something is overwriting his code in some subtle
|
||
way. With Soft-ICE, Jed decides to set a range break point across his
|
||
code segment. Press : ALT D. The Soft-ICE window is back. Move the
|
||
window (by using CTRL and the Arrow keys) until DEBUG's register
|
||
display is visible.
|
||
|
||
It's time to set our first break point. Enter : BPR code-seg:0
|
||
code-seg:25 W
|
||
|
||
Code-seg is the value in the CS register as displayed by the DEBUG R
|
||
command.
|
||
|
||
The BPR command sets a memory-range break point. The length of Jed's
|
||
code segment is 25H bytes, so the memory range specified goes from the
|
||
beginning of his code segment to the end. The W tells Soft-ICE to
|
||
break on a write. We want to catch any unexpected writes to Jed's
|
||
code.
|
||
|
||
Enter : BL
|
||
|
||
The BL command displays all break points. The display from BL looks
|
||
similar to the following display :
|
||
|
||
0) BPR code-seg:0000 code-seg:0025 W C = 01
|
||
|
||
The 0 is the identifier for this break point. The range and W are
|
||
displayed as they were entered, and the count (since none was
|
||
specified) defaults to one. Now comes the moment of truth. Press ALT D
|
||
The window disappears again. To run SAMPLE from DEBUG, enter : G.
|
||
|
||
Press the space bar. Ok so far. Now press a non-space key. Our break
|
||
point just woke up DEBUG. The registers and single unassembled
|
||
instruction are displayed. Enter : U cs:address
|
||
|
||
Address is the value of the IP register minus 10 hexadecimal. Since
|
||
DEBUG is rather primitive, the value of the IP register minus 10
|
||
hexadecimal must be calculated by hand. The instruction pointer is
|
||
pointing one instruction past the instruction that caused the break
|
||
point. By going back ten hexadecimal instructions, DEBUG should sync
|
||
up. The instruction at offset 3BH is:
|
||
|
||
CS:
|
||
MOV BYTE PTR [13],0
|
||
|
||
Jed says,"There it is! I just knew Jake's helper routines were the
|
||
problem! His code segment override instruction is writing a zero byte
|
||
right over my code! Who knows what that's doing!". Enter : U 0
|
||
|
||
Location 13H happens to be the offset of a conditional jump
|
||
instruction. The relative offset of the conditional jump is being set
|
||
to zero. If you are an 8086 guru, you obviously know that the JE will
|
||
ALWAYS fall through if the relative offset is zero. What a subtle BUG!
|
||
|
||
Now we will take a quick look at how this problem would be solved
|
||
using Soft-ICE as a stand-alone debugger. But first we must exit from
|
||
debug.
|
||
|
||
Before exiting the debugger, it's always a good idea to disable all
|
||
the break points, unless ACTION is set to HERE. If you do not do this,
|
||
when a break point occurs and ACTION tries to return to a debugger
|
||
that is not loaded, the results are unpredictable. We've changed the
|
||
ACTION to INT3, so we have to disable the break point. To bring up the
|
||
window, press : ALT D. List the break point by entering : BL
|
||
|
||
Notice that the break point description line is highlighted. The
|
||
highlighted break point is the last break point that occurred. Notice
|
||
that the break point number is 0. To disable break point zero, enter :
|
||
BD 0
|
||
|
||
List the break point again by entering : BL. The asterisk (*) after
|
||
the break point number shows that the break point is disabled. To
|
||
clear the break point, enter : BC 0
|
||
|
||
Enter BL again. Notice that there are no break point lines displayed.
|
||
Exit from Soft-ICE, then exit from the debugger, by entering :
|
||
|
||
X
|
||
Q
|
||
|
||
The next part of the tutorial demonstrates how Soft-ICE can be used to
|
||
find the same problem as a stand-alone debugger. Soft-ICE will be used
|
||
as a source level debugger. To prepare Soft-ICE to debug at source
|
||
level it must have been installed in your CONFIG.SYS file, and
|
||
extended memory allocated for symbols and source files. Soft-ICE can
|
||
only be used as a source level debugger if you have extended memory on
|
||
your system. If you do not have extended memory you may still want to
|
||
read through the rest of the tutorial to see the capabilities of
|
||
Soft-ICE with extended memory. If you have not loaded S-ICE.EXE in
|
||
your CONFIG.SYS file with memory reserved for symbols, do so at this
|
||
time.
|
||
|
||
To debug the sample program with Soft-ICE as a stand-alone debugger we
|
||
must use the Soft-ICE program loader (LDR.EXE). To load the sample
|
||
program (SAMPLE.EXE), the symbol file (SAMPLE.SYM) and the source file
|
||
(SAMPLE.ASM) enter at the DOS prompt :LDR SAMPLE
|
||
|
||
You are now in Soft-ICE with SAMPLE.EXE loaded into memory. Notice
|
||
that Soft-ICE occupies the full screen. Soft-ICE switches to its wide
|
||
mode whenever a program loaded. The source from SAMPLE.ASM should be
|
||
visible in the code window. In addition, the register window and the
|
||
DATA windows are visible.
|
||
|
||
Step through one instruction by pressing F10. Notice that the reverse
|
||
video bar moves to the next instruction to be executed after a program
|
||
step.
|
||
|
||
Press F6. This places the cursor in the code window. Now experiment
|
||
with the Up, Down, pageUp, and pageDn keys to move the cursor and
|
||
scroll the source file. Move the cursor down to line 42 with the DOWN
|
||
key. Press F9.
|
||
|
||
We have just set an execution break point on line 42. The line should
|
||
be highlighted, showing you that a break point has been set on it.
|
||
Enter : BL. This shows the break point that we have just set.
|
||
|
||
Now press ALT D. This exits Soft-ICE, and causes the sample program to
|
||
execute until it encounters the break point on line 42. Soft-ICE
|
||
should immediately come back, with the reverse video bar on line 42.
|
||
|
||
Press F6 again. This will bring the cursor back to the command window.
|
||
Now enter : BC *. This will clear all the break points (there should
|
||
only be one set). Now exit from Soft-ICE by pressing ALT D. You are
|
||
back to the sample program. Type a few keys just to make sure it is
|
||
still broken.
|
||
|
||
Now pop Soft-ICE back up with ALT D. Since the bug has already
|
||
occurred, we want to restart the program. Enter : EXIT RD. This
|
||
command forces the sample program to exit. The R tells Soft-ICE to
|
||
restore the interrupt vectors to the state they were when the sample
|
||
program was loaded with LDR. The D tells Soft-ICE to delete any
|
||
currently pending break points. The R and the D are not necessary in
|
||
this case, but it is good to get in the habit of specifying them when
|
||
exiting a program that was loaded with LDR.EXE.
|
||
|
||
You are now back at the DOS prompt. Reload the program by entering :
|
||
LDR SAMPLE.EXE
|
||
|
||
Notice the suffix.EXE was specified this time. When the suffix is
|
||
specified, Soft-ICE does not attempt to load a symbol file or source
|
||
file. In this case the symbol file and source file are already in
|
||
memory. Enter : SYM. This displays the public symbols of the sample
|
||
program. Press Esc to get back to the prompt.
|
||
|
||
We will now set a range break point similar to the one we set while
|
||
using Soft-ICE as an assistant to debug. This time we will use symbols
|
||
to set the break point. Enter : BPR START .82 W. This will set a range
|
||
break point in our code segment from the symbol START to line 82 of
|
||
the source file. Enter : BL. You can verify that the break point has
|
||
been set properly.
|
||
|
||
Press ALT D. Press a non-space key. We're back in Soft-ICE. Notice
|
||
that the current instruction (the line with the reverse video bar) is
|
||
the instruction after the one that caused the break point.
|
||
|
||
To see the actual code press the F3 key. This places Soft-ICE in mixed
|
||
mode. Notice that the reverse video bar covers 2 lines. This is the
|
||
actual code line and the source code line of the current instruction.
|
||
Press the F3 key again. We are now in code mode. No source lines are
|
||
visible. The instruction above the reverse video bar is the
|
||
instruction that caused the range break point to go off. Press the F3
|
||
key again to get back to source mode.
|
||
|
||
Now we will fix the bug in the sample program. Exit the sample program
|
||
and go back to the DOS prompt by entering : EXIT RD. Re-load the
|
||
sample program by entering : LDR SAMPLE. EXE. Set the code window in
|
||
code mode by pressing the F3 key twice.
|
||
|
||
Un-assemble at the broken routine by entering : U not_space.
|
||
|
||
We will now use the Soft-ICE interactive assembler to fix the problem.
|
||
Enter: A not_space. Soft-ICE will prompt you with the address. Enter:
|
||
NOP
|
||
|
||
Press ENTER to exit from the assembler. Notice in the code window that
|
||
there is a NOP instruction in place of the CS over-ride at offset
|
||
003BH. Press the F3 key to get back to source mode, (the source code
|
||
of course is not modified). Press ALT D to run the mended sample
|
||
program. Enter spaces and some non-spaces characters. It works! You
|
||
fixed the bug! To get out of Jed's program, and return to DOS, press :
|
||
CTRL C
|
||
|
||
Now we're going to demonstrate another feature of Soft-ICE. Enter :
|
||
LDR SAMPLE.EXE. This will load the sample program in one more time.
|
||
Enter : RIP HANG_EXAMPLE
|
||
|
||
The first two displayed instructions are:
|
||
|
||
CLI
|
||
JMP $
|
||
|
||
Notice that the jump instruction jumps to itself. This infinite loop
|
||
would normally hang the system in an unrecoverable fashion. Enter :
|
||
BREAK ON. We have just turned on BREAK mode. BREAK mode will cause the
|
||
system to run slightly slower, but will allow Soft-ICE to come up even
|
||
when the system would normal be hung.
|
||
|
||
Exit from Soft-ICE by pressing ALT D. Your system is now hung. For
|
||
those non-believers, press : CTRL ALT DEL
|
||
|
||
Nothing happens! It is definitely hung. Now press ALT D. The Soft-ICE
|
||
window is back! To get out of the infinite loop, enter : EXIT RD. You
|
||
are now back at DOS. Try a few directories to get a feel for the
|
||
performance degradation. Many people feel comfortable leaving BREAK ON
|
||
as a configuration default.
|
||
|
||
Turn BREAK mode off again by entering : BREAK OFF. Do a few
|
||
directories to get a comparison of the speed. That's it! Have fun!
|
||
It's time to start experimenting and debugging on your own. Browse
|
||
through the rest of the manual and refer to specific sections when
|
||
necessary.
|
||
CHAPTER 4 - Using Break Point Commands
|
||
|
||
04.00 Notationnal Conventions
|
||
04.01 Introduction
|
||
04.02 Setting Break Points
|
||
04.03 Manipulating Break Points
|
||
|
||
04.00 Notationnal Conventions
|
||
|
||
Section II contains syntax listings for each Soft-ICE command, and
|
||
explanations and examples for each command. All numbers are in
|
||
hexadecimal; any number can be an expression using +,-,/,*, or
|
||
registers. All commands are case-insensitive. Words that are in
|
||
italics the command syntax statements must be replaced by an actual
|
||
value, rather than typing in the italicized word.
|
||
|
||
The following notational conventions are used throughout this section
|
||
|
||
[ ]
|
||
Brackets enclose an optional syntax item.
|
||
< >
|
||
Angle brackets enclose a list of items or choices.
|
||
x | y
|
||
Vertical bars separate alternatives. Use item x or item y.
|
||
count
|
||
Count is a byte value that specifies the number of time break
|
||
point conditions must be met before the actual break point
|
||
occurs. If no count is specified, the default value is 1. Each
|
||
time the Soft-ICE window is brought up, the counts are reset to
|
||
the values originally specified.
|
||
verb
|
||
Verb is a value that specifies what type access the break point
|
||
will apply to. It can be set to 'R' for reads, 'W' for write RW'
|
||
for reads and writes, or 'X' for execute.
|
||
address
|
||
Address is a value that is made of two 16-bit words, separated by
|
||
a colon. The first word is the segment address, and the second
|
||
word is the segment offset. The addresses can be constructed of
|
||
registers expressions, and symbols. The address may also contain
|
||
the special characters "$", ".", and "@". See section 3-8
|
||
(Command Syntax) for a description of these special characters.
|
||
break-#
|
||
Break-number is an identification number that identifies the
|
||
break point to use when you are manipulating break points e.g.,
|
||
editing, deleting, enabling, or disabling them). The break-number
|
||
can be a hexadecimal digit from 0 to F.
|
||
list
|
||
List is a series of break-# separated by commas or spaces.
|
||
mask
|
||
Mask is a bitmask that is represented as: combination of 1's,
|
||
0's, and X's. X's are don't-care bits.
|
||
GT, LT GT and LT
|
||
Command qualifiers that unsigned comparisons of values.
|
||
|
||
Example : BPIO 21 W EQ M 1XXX XXXX
|
||
|
||
This command will cause a break point to occur if port 21H is written
|
||
to with the high order bit set.
|
||
|
||
04.01 Introduction
|
||
|
||
Soft-ICE has break point capability that has traditionally only been
|
||
available with hardware debuggers. The power and flexibility of the
|
||
80386 chip allows advanced break point capability without additional
|
||
hardware.
|
||
|
||
Break points can be set on memory location reads and writes, memory
|
||
range reads and writes, program execution and port accesses. Soft-ICE
|
||
assigns a one-digit hexadecimal number (0-F) to each break point. This
|
||
break-number is used to identify break points when you set delete,
|
||
disable, enable, or edit them.
|
||
|
||
All of Soft-ICE's break points are sticky. That means they don't
|
||
disappear automatically after they've been used; you must
|
||
intentionally clear or disable them using the BC or the BD commands.
|
||
Soft-ICE can handle 16 break points at one time. You can have up to
|
||
ten break points of a single type except for break points on memory
|
||
location (BPMs), of which you can only have four, due to restrictions
|
||
of the 80386 processor.
|
||
|
||
Break points can be specified with a count parameter. The count
|
||
parameter tells Soft-ICE how many times the break point should be
|
||
ignored before the break point action occurs.
|
||
|
||
04.02 Setting Break Points
|
||
|
||
BPM, BPMB, BPMW, BPMD Set break point on memory access or execution
|
||
BPR Set break point on memory range
|
||
BPIO Set break point on I/O port access
|
||
BPINT Set break point on interrupt
|
||
BPX Set/clear break point on execution
|
||
CSIP Set CS:IP range qualifier
|
||
BPAND Wait for multiple break points to occur
|
||
|
||
Set break point on memory access or execution
|
||
|
||
Syntax :
|
||
|
||
BPM[size]address[verb][qualifier value][C=count]
|
||
|
||
Size :
|
||
B(yte), W(ord), D(oubleword)
|
||
The size is actually a range covered by this break point.
|
||
For example, if double word is used, and the third byte of
|
||
the double is modified, then a break point will occur. The
|
||
size is also important if the optional qualifier is
|
||
specified (see below).
|
||
Verb :
|
||
R, W, RW, or X
|
||
Qualifier :
|
||
EQ(ual), NE (Not Equal), GT (Greater than), LT (Less Than),
|
||
M (Mask)
|
||
These qualifiers are only applicable to the read and write
|
||
break points.
|
||
Value
|
||
A byte, word, or double word value, depending on the size
|
||
specified.
|
||
|
||
Comments :
|
||
|
||
The BPM commands allow you to set a break point on memory reads
|
||
or writes or execution.
|
||
|
||
If a verb is not specified, RW is the default. If a size is not
|
||
specified, byte is the default.
|
||
|
||
All of the verb types except X cause the program to execute the
|
||
instruction that caused the break point. The current CS:IP will
|
||
be the instruction after the break point. If the verb type is X,
|
||
the current CS:IP will be the instruction where the break point
|
||
was set.
|
||
|
||
If R is specified, then the break point will occur on read access
|
||
and on write operations that do not change the value of the
|
||
memory location.
|
||
|
||
If the verb type is R, W or RW, executing an instruction at the
|
||
specified address will not cause the break point action to occur.
|
||
|
||
Notes :
|
||
|
||
If BPMW is used, the specified address must start on a word
|
||
boundary. If BPMD is used, the specified address must point to a
|
||
double word boundary.
|
||
|
||
Example :
|
||
|
||
BPM 1234:SI W EQ 10 C=3
|
||
|
||
This command defines a break point on memory byte access. The
|
||
third time that 10 hexadecimal is written to location 1234:SI,
|
||
the break point action will occur.
|
||
|
||
BPM CS:1235 X
|
||
|
||
This command defines a break point on execution. The break point
|
||
action will occur the first time that the instruction at address
|
||
CS:1235 is reached. The current CS:IP will be the instruction
|
||
where the break point was set.
|
||
|
||
BPMW DS:FOO W EQ M 0XXX XXXX XXXX XXX1
|
||
|
||
This command defines a word break point on memory write. The
|
||
break point action will occur the first time that location DS:FOO
|
||
has a value written to it that sets the high order bit to 0 and
|
||
the low order bit to 1. The other bits can be any value.
|
||
|
||
BPM DS:1000 W GT 5
|
||
|
||
This command defines a byte break point on memory write. The
|
||
break point action will occur the first time that location
|
||
DS:1000 has a value written to it that is greater than 5.
|
||
|
||
Set break point on memory range
|
||
|
||
Syntax :
|
||
|
||
BPR start-address end-address [verb] [C=count]
|
||
|
||
Start-address, end-address :
|
||
start-address and end-address specify memory range.
|
||
Verb :
|
||
R, W, RW, T or TW
|
||
|
||
Comments :
|
||
|
||
The BPR command allows you to set a break point across a range of
|
||
memory.
|
||
|
||
All of the verb types except T or TW cause the program to execute
|
||
the instruction that caused the break point. The current CS:IP
|
||
will be the instruction after the break point.
|
||
|
||
There is no range break point on execution. If a range break
|
||
point is desired on execution, R must be used. An instruction
|
||
fetch is considered a read for range break points.
|
||
|
||
If a verb is not specified, W is the default.
|
||
|
||
The range break point will degrade system performance in certain
|
||
circumstances. Any read or write within the 4K page that contains
|
||
the break point range is analyzed by Soft-ICE. This performance
|
||
degradation is usually not noticeable, however, degradation could
|
||
be extreme in exception cases.
|
||
|
||
The T and TW verbs enable back trace ranges on the specified
|
||
range. They do not cause break points, but instead log
|
||
instruction information that can be displayed later with the SHOW
|
||
or TRACE commands. For more information on back trace ranges, see
|
||
chapter 9.
|
||
|
||
Example :
|
||
|
||
BPR B000:0 B000:1000 W
|
||
|
||
This command defines a break point on memory range. The break
|
||
point will occur if there are any writes to the monochrome
|
||
adapter video memory region.
|
||
|
||
Set break point on I/O port access
|
||
|
||
Syntax :
|
||
|
||
BPIO port [verb] [qualifier value] [C=count]
|
||
|
||
Port :
|
||
A byte or word value.
|
||
Verb :
|
||
R (IN), W (OUT), or RW
|
||
Qualifier :
|
||
EQ(ual), NE (Not Equal), GT (Greater than), LT (Less Than),
|
||
M (Mask)
|
||
|
||
Comments :
|
||
|
||
The BPIO command allows you to set a break point on I/O port
|
||
reads or writes.
|
||
|
||
If value is specified, it is compared with the actual data value
|
||
read or written by the IN or OUT instruction causing the break
|
||
point. The value may be a byte or a word. If the I/O is to a byte
|
||
port, then the lower 8 bits are used in the comparison.
|
||
|
||
The instruction pointer (CS:IP) will point to the instruction
|
||
after the IN or OUT instruction that caused the break point.
|
||
|
||
If a verb is not specified, RW is the default.
|
||
|
||
Example :
|
||
|
||
BPIO 21 W NE FF
|
||
|
||
This command defines a break point on I/O port access. The break
|
||
point will occur if the interrupt controller one mask register is
|
||
written with a value other than FFH.
|
||
|
||
BPIO 3FE R EQ M 11XX XXXX
|
||
|
||
This command defines a byte break point on I/O port read. The
|
||
break point action will occur the first time that I/0 port 3FE is
|
||
read with a value that has the two high order bits set to 1. The
|
||
other bits can be any value.
|
||
|
||
Set break point on interrupt
|
||
|
||
Syntax :
|
||
|
||
BPINT int-number [ < AL | AH | AX >= value] [C = count]
|
||
|
||
Int-number :
|
||
Interrupt number from 0 - FF hex
|
||
Value :
|
||
A byte or a word value
|
||
|
||
Comments :
|
||
|
||
The BPINT command allows breaking on the execution of a hardware
|
||
or a software interrupt. By optionally qualifying the AX register
|
||
with a value, specific DOS or BIOS calls can be easily isolated.
|
||
|
||
If no value is specified, a break point will occur when the
|
||
interrupt specified by int-number occurs. This interrupt can be a
|
||
hardware, software, or internal interrupt.
|
||
|
||
The optional value is compared with the specified register (AH,
|
||
AL, or AX) when the interrupt occurs. If the value matches the
|
||
specified register, then the break point will occur.
|
||
|
||
When the break point occurs, if the interrupt was a hardware
|
||
interrupt, the instruction pointer (CS:IP) will point to the
|
||
first instruction within the interrupt routine. The INT? command
|
||
can be used to see where execution was when the interrupt
|
||
occurred. If the interrupt was a software interrupt, when the
|
||
break point occurs, the instruction pointer (CS:IP) will point to
|
||
the INT instruction causing the interrupt.
|
||
|
||
Example :
|
||
|
||
BPINT 21 AH=4C
|
||
|
||
This command defines a break point on interrupt 21H The break
|
||
point will occur when DOS function call 4CH (terminate program)
|
||
is called.
|
||
|
||
Set/Clear break point on execution
|
||
|
||
Syntax :
|
||
|
||
BPX [address] [C=count]
|
||
|
||
Comments :
|
||
|
||
The BPX command allows you to set or clear a point-and-shoot
|
||
execution break point in source. When the cursor is in the code
|
||
window the address is not required. The execution break point is
|
||
set at the address of the current cursor location. If an
|
||
execution break point has already been set at the address of the
|
||
current cursor location, then the break point is cleared.
|
||
|
||
If the code window is not visible or the cursor is not in the
|
||
code window then the address must be specified. If an offset only
|
||
is specified then the current CS register value used as the
|
||
segment.
|
||
|
||
Technical Note :
|
||
|
||
BPX uses an interrupt 3 style of break point unless the specified
|
||
address is ROM. This is used instead of a break point register to
|
||
make more execution break points available. If your circumstances
|
||
require the use of a break point register for some reason (code
|
||
not loaded yet for example) you can set an execution break point
|
||
with the BPM command.
|
||
|
||
Example :
|
||
|
||
BPX.1234
|
||
|
||
This sets an execution break point at source line 1234.
|
||
|
||
Set CS:IP range qualifier
|
||
|
||
Syntax :
|
||
|
||
CSIP [OFF | [NOT] start-address end-address]
|
||
|
||
NOT :
|
||
When NOT is specified, the break point will only occur if
|
||
the CS:IP pointer is outside the specified range.
|
||
OFF :
|
||
Turns off CS:IP checking
|
||
|
||
Comments :
|
||
|
||
The CSIP command causes a break point to be dependent upon the
|
||
location of the instruction pointer when the break point
|
||
conditions are met. This function is often useful when a program
|
||
is suspected of accidentally modifying code outside of its
|
||
boundaries.
|
||
|
||
When break point conditions are met, the CS:IP registers are
|
||
compared with a specified range. If they are within the range,
|
||
the break point is activated. To activate the break point when
|
||
CS:IP is outside the range, use the NOT parameter.
|
||
|
||
When a CSIP range is specified, it applies to ALL break points
|
||
that are currently active.
|
||
|
||
If no parameters are specified, the current CSIP range is
|
||
displayed.
|
||
|
||
Example :
|
||
|
||
CSIP NOT F000:0 FFFF:0
|
||
|
||
This command causes the break points to occur only the CS:IP is
|
||
NOT in the ROM BIOS when the break point conditions are met.
|
||
|
||
Wait for multiple break points to occur
|
||
|
||
Syntax :
|
||
|
||
BPAND list | * | OFF
|
||
|
||
List :
|
||
A series of break-numbers separated by commas or spaces
|
||
* :
|
||
ANDs together all break points
|
||
|
||
Comments :
|
||
|
||
The BPAND command does a logical AND of two or more break points,
|
||
activating the break point only when conditions for all break
|
||
points are met.
|
||
|
||
Sometimes conditions arise when you don't want a break point to
|
||
occur until several different conditions are met. The BPAND
|
||
command allows specifying two or more break points that must
|
||
occur before the action is generated. This function allows more
|
||
complex break point conditions to be set.
|
||
|
||
Each time the BPAND command is used, the specified break point
|
||
numbers are added to the list until BPAND OFF is used.
|
||
|
||
You can tell which of the break-numbers are ANDed together by
|
||
listing the break points with the BL command. The break points
|
||
that are ANDed together will have an ampersand (&) after their
|
||
break-number.
|
||
|
||
Once break points have been ANDed together, each remains ANDed
|
||
until it is cleared, or until BPAND is turned off.
|
||
|
||
Example :
|
||
|
||
BPAND 0,2,3
|
||
|
||
This command causes the conditions of the break points 0, 2, and
|
||
3 to be logically tied together. The break occurs only when the
|
||
conditions of all three are met. For example, if the conditions
|
||
of break points 2 and 3 have both been met at least once, but the
|
||
conditions of break point 0 have not been met at all yet, then
|
||
the action will not occur until break point 0 conditions are met.
|
||
|
||
04.03 Manipulating Break Points
|
||
|
||
Soft-ICE provides several commands for manipulating break points.
|
||
Manipulation commands allow listing, modifying, deleting, enabling,
|
||
and disabling of break points. Break points are identified by
|
||
break-numbers which are hexadecimal digits from 0 to F. The break
|
||
point manipulation commands are:
|
||
|
||
BD Disable break points
|
||
BE Enable break points
|
||
BL List break points
|
||
BPE Edit break point
|
||
BPT Use break point as a template
|
||
BC Clear break points
|
||
|
||
Disable break points
|
||
|
||
Syntax :
|
||
|
||
BD list | *
|
||
|
||
List :
|
||
A series of break-numbers separated by commas or spaces
|
||
* :
|
||
Disables all break points
|
||
|
||
Comments :
|
||
|
||
The BD command is used to temporarily deactivate break points.
|
||
The break points can be reactivated with the BE (Enable break
|
||
points) command.
|
||
|
||
You can tell which of the break-numbers are disabled by listing
|
||
the break points with the BL command. The break points that are
|
||
disabled will have an asterisk (*) after their break-number.
|
||
|
||
Example :
|
||
|
||
BD 1,3
|
||
|
||
This command temporarily disables break points 1 and 3.
|
||
|
||
Enable break points
|
||
|
||
Syntax :
|
||
|
||
BE list | *
|
||
|
||
List :
|
||
A series of break-numbers separated by commas or spaces
|
||
* :
|
||
Enables all break points
|
||
|
||
Comments :
|
||
|
||
The BE command is used to reactivate break points that were
|
||
deactivated by the BD (Disable break points) command.
|
||
|
||
Note that a break point is automatically enabled when defined.
|
||
|
||
Example :
|
||
|
||
BE 3 his command enables break point 3.
|
||
|
||
List break points
|
||
|
||
Syntax :
|
||
|
||
BL
|
||
|
||
Comments :
|
||
|
||
The BL command displays all break points that are currently set.
|
||
For each break point, BL lists the break-number, break point
|
||
conditions, break point state, and count.
|
||
|
||
The state of a break point is either enabled or disabled. If the
|
||
break point is disabled, an asterisk (*) is displayed after its
|
||
break-number. If an enabled break point was used in a BPAND
|
||
command, an ampersand (&) is displayed after its break-number.
|
||
The break point that most recently caused an action to occur is
|
||
highlighted.
|
||
|
||
The BL command has no parameters.
|
||
|
||
Example :
|
||
|
||
BL
|
||
|
||
This command displays all the break points that have been
|
||
defined. A sample display, which shows four break points,
|
||
follows:
|
||
|
||
0) BPMB 1234:0000 W EQ 0010 C=03
|
||
1)*BPR B000:0000 B000:1000 W C=01
|
||
2) BPIO 0021 W NE 00FF C=01
|
||
3) BPINT 21 AH=4C C=01
|
||
|
||
Note that in this example, break point 1 is preceded with an
|
||
asterisk (*), showing that it has been disabled.
|
||
|
||
Edit break point
|
||
|
||
Syntax :
|
||
|
||
BPE break-number
|
||
|
||
Comments :
|
||
|
||
The BPE command loads the break point description into the edit
|
||
line for modification. The command can then be edited using the
|
||
editing keys, and re-entered by pressing the ENTER . This command
|
||
offers a quick way to modify the parameters of an existing break
|
||
point.
|
||
|
||
Example :
|
||
|
||
BPE 1
|
||
|
||
This command moves a description of break point 1 into the edit
|
||
line and removes break point 1. Pressing the ENTER key will cause
|
||
the break point to be re-entered.
|
||
|
||
Use break point as a template
|
||
|
||
Syntax :
|
||
|
||
BPT break-number
|
||
|
||
Comments :
|
||
|
||
The BPT command uses an existing break point description as a
|
||
template for a new break point.
|
||
|
||
A description of the existing break point is loaded into the edit
|
||
line. The break point referenced by break-number is not altered.
|
||
This command offers a quick way to create a new break point that
|
||
is similar to an existing break point.
|
||
|
||
Example :
|
||
|
||
BPT 3
|
||
|
||
This command moves a template of break point 3 into the edit
|
||
line. When the ENTER key is pressed, a new break point is added.
|
||
|
||
Clear break points
|
||
|
||
Syntax :
|
||
|
||
BC list | *
|
||
|
||
List :
|
||
A series of break-numbers separated by commas or spaces
|
||
* :
|
||
ANDs together all break points
|
||
|
||
Comments :
|
||
|
||
The BC command is used to permanently delete one or more break
|
||
points.
|
||
|
||
Example :
|
||
|
||
BC *
|
||
|
||
This command clears all break points.
|
||
CHAPTER 5 - Using Other Commands
|
||
|
||
05.01 Display and Edit Commands
|
||
05.02 I/O Port Commands
|
||
05.03 Transfer Control Commands
|
||
05.04 Debug Mode Commands
|
||
05.05 Utility Commands
|
||
05.06 Specialized Debugging Commands
|
||
05.07 Windowing Commands
|
||
05.08 Debugger Customization Commands
|
||
05.09 Screen Control Commands
|
||
05.10 Symbol and Source Line Commands
|
||
|
||
05.01 Display and Edit Commands
|
||
|
||
U Unassemble instructions or display source
|
||
R Display or change registers
|
||
MAP Display system memory map
|
||
D, DB, DW, DD Display memory
|
||
E, EB, EW, ED Edit memory
|
||
INT? Display last interrupt number
|
||
? or H Display help information
|
||
VER Display Soft-ICE version number
|
||
|
||
Unassemble instructions or display source
|
||
|
||
Syntax :
|
||
|
||
U [address] [L[=]length]
|
||
|
||
Length :
|
||
The number of instructions to be unassembled
|
||
|
||
Comments :
|
||
|
||
The U command displays the instructions of the program being
|
||
debugged.
|
||
|
||
If length is not specified, the length defaults to eight lines if
|
||
available, or one less than the screen length.
|
||
|
||
If address is not specified, the command unassembles at address
|
||
starting at the first byte after the last byte unassembled by a
|
||
previous unassemble command. If the has been no previous
|
||
unassemble command, the address defaults to the current CS:IP.
|
||
|
||
If the code window is visible, the instructions are displayed in
|
||
the code window.
|
||
|
||
If source is loaded for the address range specified then source
|
||
lines may be displayed depending on the current source mode.
|
||
|
||
Example :
|
||
|
||
U $-10
|
||
|
||
This command unassembles instructions beginning 10 hexadecimal
|
||
bytes before the current address.
|
||
|
||
U .499
|
||
|
||
This command displays the current source file starting at line
|
||
499. The code window must be visible and in source mode.
|
||
|
||
Display or change registers
|
||
|
||
Syntax :
|
||
|
||
R register-name [ [ = ]value] ]
|
||
|
||
Register-name :
|
||
Any register (FL for flags)
|
||
Value :
|
||
If register-name is any name other than FL, value is a hex
|
||
value or an expression. If register-name is FL, value is a
|
||
series of one or more of the following flag symbols, each
|
||
optionally preceded by a plus or minus sign : O (Overflow
|
||
flag), D (Direction flag), I (Interrupt flag), S (Sign
|
||
flag), Z (Zero flag), A (Auxiliary carry flag), P (Parity
|
||
flag), C (Carry flag).
|
||
|
||
Comments :
|
||
|
||
The R command displays or changes register values.
|
||
|
||
If no parameters are supplied, all register and flag value are
|
||
displayed, as well as the instruction at the current CS:IP
|
||
address.
|
||
|
||
If register-name is supplied without a value, Soft-ICE displays
|
||
the current value of the specified register and prompts you for a
|
||
new value. If register-name is FL, flags that are set are
|
||
displayed as highlighted uppercase characters; flags that are
|
||
cleared are displayed as non-highlighted lowercase characters. To
|
||
retain the current value of a register, press ENTER.
|
||
|
||
If both register-name and value are supplied, the specified
|
||
register's contents are changed to the value.
|
||
|
||
To change a flag value, use FL as the register-name, followed by
|
||
the symbols of the flag whose values you want to toggle. To turn
|
||
a flag on, precede the flag symbol with a plus sign. To turn a
|
||
flag off, precede the flag symbol with a minus sign. The flags
|
||
can be listed in any order.
|
||
|
||
Examples :
|
||
|
||
RAH 5
|
||
|
||
This command sets the AH register equal to 5.
|
||
|
||
R FL = OZP
|
||
|
||
This command toggles the O, Z, and P flag values.
|
||
|
||
R FL
|
||
|
||
This command displays the current flag values, and allows them to
|
||
be changed.
|
||
|
||
RFL O + A-C
|
||
|
||
This command toggles the O flag value, turns on the flag value,
|
||
and turns off the C flag value.
|
||
|
||
Display system memory map
|
||
|
||
Syntax :
|
||
|
||
MAP
|
||
|
||
Comments :
|
||
|
||
The MAP command displays the names, locations, and sizes of
|
||
system memory components. The size is displayed in paragraphs.
|
||
One paragraph is equivalent to 10 hexadecimal bytes.
|
||
|
||
The component that the CS:IP register currently points to is
|
||
highlighted.
|
||
|
||
Use the MAP command when A break point occurs and CS:IP is not in
|
||
a known memory region. You want to get control within a resident
|
||
program or system program. A range break point can be set based
|
||
on the starting address and size reflected by MAP. You suspect a
|
||
program or system component of writing over code outside of its
|
||
memory space. MAP is used to obtain the memory address of the
|
||
region to use with the CSIP command. You need to find out which
|
||
resident program owns certain interrupt vectors.
|
||
|
||
Example :
|
||
|
||
MAP
|
||
|
||
The following is a sample display produced by the command :
|
||
|
||
Start Length
|
||
0000:0000 0040 Interrupt Vector Table
|
||
0040:0000 0030 ROM BIOS Variables
|
||
0070:0000 00FE I/O System
|
||
016E:0000 06B7 DOS
|
||
0842:0000 02CE DOS File Table & Buffers
|
||
A000:0000 5E00 System BUS
|
||
F000:0000 1000 ROM BIOS
|
||
|
||
Versions of DOS lower than 3.1 display program addresses instead
|
||
of displaying the program names.
|
||
|
||
Display memory
|
||
|
||
Syntax :
|
||
|
||
D [size] [address] [L[ = ]length]
|
||
|
||
Size :
|
||
B(yte), W(ord), D(ouble)
|
||
Length :
|
||
The number of bytes to be displayed.
|
||
|
||
Comments :
|
||
|
||
The D command displays the memory contents of the specified
|
||
address.
|
||
|
||
The contents are displayed in the format of the size specified.
|
||
If no size is specified, the last size used will be displayed.
|
||
The ASCII representation is also displayed for all forms.
|
||
|
||
If address is not specified, the command displays memory at the
|
||
address starting at the first byte after the last byte displayed.
|
||
|
||
If length is not specified, it defaults to eight lines, or fewer
|
||
if the window is smaller.
|
||
|
||
If the data window is visible, the data is displayed in the data
|
||
window and the length is ignored.
|
||
|
||
Example :
|
||
|
||
DW DS:00 L=8
|
||
|
||
This command displays, in word format and in ASCII format, the
|
||
value of the first eight bytes of the current data segment.
|
||
|
||
Edit memory
|
||
|
||
Syntax :
|
||
|
||
D [size] [address] [L[ = ]length]
|
||
|
||
Size :
|
||
B(yte), W(ord), D(ouble)
|
||
Data-list :
|
||
list of data objects of the specified size (Bytes, Words or
|
||
Double Words) or quoted strings separated by commas or
|
||
spaces. The quoted string can begin with a single quote or a
|
||
double quote.
|
||
|
||
Comments :
|
||
|
||
The E commands display the memory contents at the specified
|
||
address, and allow you to edit the values.
|
||
|
||
These commands display the memory contents in ASCII format, and
|
||
in the format of the size specified.
|
||
|
||
A memory editor is provided for quick memory updates. Memory can
|
||
be edited by typing ASCII characters, or by typing byte, word, or
|
||
double word values. If no size is specified, the last size used
|
||
will be assumed. The memory Editing key strokes are:
|
||
|
||
UP Move cursor up
|
||
DOWN Move cursor down
|
||
LEFT Move cursor right
|
||
RIGHT Move cursor left
|
||
SPACE Move cursor to next element
|
||
TAB Toggle between numeric and ASCII areas
|
||
ESC or ENTER Exit memory editor
|
||
|
||
As values are input, the actual memory locations are updated. All
|
||
numeric values are hex numbers. To toggle between the ASCII and
|
||
numeric display areas, press the TAB key.
|
||
|
||
If the data window is visible, the data is edited in the data
|
||
window, otherwise the data is edited in the command window.
|
||
|
||
The data display length defaults to 8 lines if in the command
|
||
window, or to the size of the data window if it's visible.
|
||
|
||
If no parameters are supplied, the cursor moves into the data
|
||
window if the data window if visible. If the data window is not
|
||
visible, the data is edited in the command window at the last
|
||
address displayed or edited.
|
||
|
||
Examples :
|
||
|
||
EB 1000:0
|
||
|
||
This command displays, in byte format, up to six lines containing
|
||
both the numeric and the ASCII representation of the values of
|
||
the data starting at location 1000:0000. Once the lines are
|
||
displayed, you can edit the values.
|
||
|
||
EB 8000:0 "Hello",0D
|
||
|
||
This command replaces the values starting at location 8000:0000
|
||
with the string "Hello" followed by a carriage return.
|
||
|
||
Display last interrupt number
|
||
|
||
Syntax :
|
||
|
||
INT?
|
||
|
||
Comments :
|
||
|
||
The INT? command displays the address and the number the last
|
||
interrupt that happened.
|
||
|
||
Example :
|
||
|
||
INT?
|
||
|
||
An example of the display produced by the INT? command follows:
|
||
|
||
Last Interrupt: 16
|
||
At: 0070:0255
|
||
|
||
This example shows that the last interrupt generated in the
|
||
system before the Soft-ICE window was brought up was an interrupt
|
||
16 hexadecimal, at location 0070:0255H. If the last interrupt
|
||
that happened was a software interrupt, unassembling the code at
|
||
0070:0255H will show the interrupt instruction. If it was a
|
||
hardware interrupt, unassembling the code will show the
|
||
instruction that was executing when the hardware interrupt
|
||
occurred.
|
||
|
||
Display help information
|
||
|
||
Syntax :
|
||
|
||
< ? | H > [command | expression]
|
||
|
||
Comments :
|
||
|
||
The ? command and the H command both display help information.
|
||
|
||
If no parameters are specified, help displays short descriptions
|
||
of all the commands and operators, one screen at a time. Press
|
||
any key to continue, or press ESC to quit displaying help.
|
||
|
||
If command is specified, help displays more detailed information
|
||
on the specified command, including the command syntax and an
|
||
example.
|
||
|
||
If expression is specified, the expression is evaluated and the
|
||
result is displayed in hexadecimal, decimal, and ASCII.
|
||
|
||
Examples :
|
||
|
||
? ALTKEY
|
||
|
||
This command displays information about the ALTKEY command,
|
||
including its syntax and an example.
|
||
|
||
H 10 + 14*2
|
||
|
||
This command displays: 0038 00056 "8". These are the hexadecimal,
|
||
decimal and ASCII representations of value of the expression "10
|
||
+ 14*2".
|
||
|
||
Display Soft-ICE version number
|
||
|
||
Syntax :
|
||
|
||
VER
|
||
|
||
Example :
|
||
|
||
VER
|
||
|
||
This command displays the Soft-ICE version and the Nu-Mega
|
||
Technologies copyright message.
|
||
|
||
05.02 I/O Port Commands
|
||
|
||
I, IB or IW Input from I/O port
|
||
O, OB or OW Output to byte I/O port
|
||
|
||
Input from I/O port
|
||
|
||
Syntax :
|
||
|
||
I [size] port
|
||
|
||
Size :
|
||
B(yte), W(ord), D(ouble)
|
||
Port :
|
||
A byte or word value
|
||
|
||
Comments :
|
||
|
||
The input from port commands are used to read and display a value
|
||
from a hardware port. Input can be done From byte or word ports.
|
||
If no size is specified, the default is byte.
|
||
|
||
Example :
|
||
|
||
I 21
|
||
|
||
This command displays the mask register for interrupt controller
|
||
one.
|
||
|
||
Output from I/O port
|
||
|
||
Syntax :
|
||
|
||
O [size] port
|
||
|
||
Size :
|
||
B(yte), W(ord), D(ouble)
|
||
Port :
|
||
A byte or word value
|
||
Value :
|
||
A byte for a byte port or a word for a word port
|
||
|
||
Comments :
|
||
|
||
The output to port commands are used to write a value to a
|
||
hardware port. Output can be done to byte or word ports If no
|
||
size is specified, the default is byte.
|
||
|
||
Example :
|
||
|
||
O 21 FF
|
||
|
||
This command masks off all the interrupts for interrupt
|
||
controller one.
|
||
|
||
05.03 Transfer Control Commands
|
||
|
||
X Exit from Soft-ICE window
|
||
G Go to address
|
||
T Trace one instruction
|
||
P Program step
|
||
HERE Go to current cursor line
|
||
GENINT Force an interrupt
|
||
EXIT Force exit of current DOS program
|
||
BOOT System boot (retain Soft-ICE)
|
||
HBOOT Hard system boot (total reset)
|
||
|
||
Exit from Soft-ICE window
|
||
|
||
Syntax :
|
||
|
||
X
|
||
|
||
Comments :
|
||
|
||
The X command exits the Soft-ICE window and restores control to
|
||
the program that was interrupted to bring up Soft-ICE. The
|
||
Soft-ICE window disappears. If any break points have been set,
|
||
they become active.
|
||
|
||
Example :
|
||
|
||
X
|
||
|
||
Exits the Soft-ICE window and restores control to the program
|
||
that was interrupted.
|
||
|
||
Go to address
|
||
|
||
Syntax :
|
||
|
||
G [=start-address] [break-address]
|
||
|
||
Comments :
|
||
|
||
The G command exits from the Soft-ICE window with a single
|
||
one-time execution break point set. In addition, all sticky break
|
||
points are armed.
|
||
|
||
Execution begins at the current CS:IP unless the start-address
|
||
parameter is supplied. In that case execution begins at
|
||
start-address. Execution continues until break-address is
|
||
encountered, the window pop-up key sequence is used, or a sticky
|
||
break point occurs.
|
||
|
||
The break-address must be the first byte of an instruction
|
||
opcode.
|
||
|
||
When the specified break-address is reached, the current CS:IP
|
||
will be the instruction where the break point was set.
|
||
|
||
The G command with no parameters behaves the same as the X
|
||
command.
|
||
|
||
The non-sticky execution break point uses an 80386 break point
|
||
register, unless all break point registers have been allocated to
|
||
sticky break points. In that case, an INT 3 style break point is
|
||
implemented. When this case occurs, the G and P commands will not
|
||
work correctly in ROM. An error message will be displayed if this
|
||
is attempted.
|
||
|
||
Example :
|
||
|
||
G CS:1234
|
||
|
||
This command sets a one time break point at CS:1234
|
||
|
||
Trace one instruction
|
||
|
||
Syntax :
|
||
|
||
T [=start-address] [count]
|
||
|
||
Comments :
|
||
|
||
The T command single steps one instruction by utilizing the
|
||
single step flag.
|
||
|
||
Execution begins at the current CS:IP unless the start-address
|
||
parameter is specified. If start-address is specified, CS:IP is
|
||
changed to start- address prior to single stepping.
|
||
|
||
If count is specified then Soft-ICE single steps count time The
|
||
TRACE command will continue until the count is exhausted or the
|
||
Esc key is pressed, regardless of which break points are reached.
|
||
|
||
In source mode, the T command steps to the next source statement.
|
||
If the current statement is a procedure or function call, and
|
||
source exists for the routine being called, T steps into the
|
||
call. If there is no source available for the called procedure or
|
||
function, T steps over the routine.
|
||
|
||
Example :
|
||
|
||
T = 1284 3
|
||
|
||
This command single steps through three instruction starting at
|
||
memory location 1284.
|
||
|
||
Program step
|
||
|
||
Syntax :
|
||
|
||
P
|
||
|
||
Comments :
|
||
|
||
The P command is a logical program step. One instruction at the
|
||
current CS:IP is executed unless the instruction is a call,
|
||
interrupt, loop, or repeated string instruction. In those cases,
|
||
the entire routine or iteration is completed before control is
|
||
returned to Soft-ICE.
|
||
|
||
The P command uses a one-time execution break point. The
|
||
non-sticky execution break point uses an 80386 break point
|
||
register, unless all break point registers have been allocated to
|
||
sticky break points. In that case, an INT3 style break point is
|
||
implemented. When this case occurs, the P and G commands will not
|
||
work correctly in ROM. An error message will be displayed if this
|
||
is attempted.
|
||
|
||
In source mode, the P command steps to the next source statement.
|
||
If the current statement is a procedure or function call, the P
|
||
command steps over the it.
|
||
|
||
Example :
|
||
|
||
P
|
||
|
||
This command executes one 'program step'.
|
||
|
||
Go to current cursor line
|
||
|
||
Syntax :
|
||
|
||
HERE
|
||
|
||
Comments :
|
||
|
||
The HERE command executes until the program reaches the current
|
||
cursor line. HERE is only available when the cursor is in the
|
||
code window. If the code window is not visible or the cursor is
|
||
not in the code window, use the G command instead.
|
||
|
||
The HERE command exits from Soft-ICE with a single one-time
|
||
execution break point set. In addition, all sticky break points
|
||
are armed.
|
||
|
||
Execution begins at the current CS:IP and continues until address
|
||
of the current cursor position in the code window encountered,
|
||
the window pop-up key sequence is used, a sticky break point
|
||
occurs.
|
||
|
||
The non-sticky execution break point uses an 80386 break point
|
||
register, unless all break point registers have been allocated to
|
||
sticky break points. In that case, an INT 3 style break point is
|
||
implemented. When this case occurs, the HERE command will not
|
||
work correctly in ROM. An error message will be displayed if this
|
||
is attempted.
|
||
|
||
Example :
|
||
|
||
HERE
|
||
|
||
This example sets an execution break point at the current cursor
|
||
position, then exits from Soft-ICE and begins execution at the
|
||
current CS:IP. Default Function Key: F7
|
||
|
||
Force an interrupt
|
||
|
||
Syntax :
|
||
|
||
GENINT INT1 | INT3 | NMI | interrupt-number
|
||
|
||
Interrupt-number :
|
||
a number in the range 00 - FF
|
||
|
||
Comments :
|
||
|
||
The GENINT command forces an interrupt to occur. This function
|
||
can be used to hand off control to another debugger when using
|
||
Soft-ICE with another software debugger. It can also be used to
|
||
test interrupt routines.
|
||
|
||
The GENINT command simulates the processing sequence of a
|
||
hardware interrupt or an INT instruction. It pushes the flags,
|
||
the CS register, and the IP register, then changes the value of
|
||
the CS and IP registers to the value of the interrupt vector
|
||
table entry corresponding with the specified interrupt number.
|
||
|
||
Example :
|
||
|
||
GENINT NMI
|
||
|
||
This forces a non-maskable interrupt. This will give control back
|
||
to CodeView if Soft-ICE is being used as an assistant to
|
||
CodeView.
|
||
|
||
Force exit of current DOS program
|
||
|
||
Syntax :
|
||
|
||
EXIT [R] [D]
|
||
|
||
R :
|
||
Restore the interrupt vector table
|
||
D :
|
||
Delete all break points
|
||
|
||
Comments :
|
||
|
||
The EXIT command attempts to abort the current program by forcing
|
||
a DOS exit function (INT 21H, function 4CH) This command will
|
||
only work if the DOS is in a state where it is able to accept the
|
||
exit function call. If this call is made from certain interrupt
|
||
routines, or other times when the DOS is not ready, the system
|
||
may behave unpredictably.
|
||
|
||
This function does NOT do any system resetting other than the
|
||
interrupt table when the R option is used. This means that BIOS
|
||
variables, video modes and other systems level data are not
|
||
restored.
|
||
|
||
Using the R option will cause the interrupt vectors to be
|
||
restored to whatever they were the last time they were saved.
|
||
Soft-ICE saves the interrupt vectors when it is loaded, when a
|
||
program is loaded with LDR.EXE, and when the VECS S command is
|
||
used.
|
||
|
||
Note :
|
||
|
||
To re-start a program that has been loaded with the Soft-ICE
|
||
program loader (LDR.EXE) do the following:
|
||
|
||
EXIT R
|
||
|
||
LDR prog.EXE
|
||
|
||
The EXIT command will restore the interrupt table to the values
|
||
it contained before the program was loaded, then exit to the
|
||
command processor. By running the LDR utility and specifying the
|
||
.EXE suffix, the program is loaded back in without re-loading
|
||
symbols and source. The symbols and source will remain in memory.
|
||
|
||
Caution :
|
||
|
||
The EXIT command should be used with care. Since Soft-ICE can be
|
||
popped up at any time, a situation can occur where the DOS is not
|
||
in a state to accept an exit function call. Also, the EXIT
|
||
command does not do any program specific resetting. For instance,
|
||
the EXIT command does not reset the video mode. If your program
|
||
has placed the video BIOS and hardware in a particular video
|
||
mode, it will stay in that mode after the EXIT command.
|
||
|
||
Example :
|
||
|
||
EXIT R
|
||
|
||
Restores the interrupt table and exits the current program. The R
|
||
option should be used if exiting from a program loaded with the
|
||
Soft-ICE program loader LDR.EXE.
|
||
|
||
System boot (retain Soft-ICE)
|
||
|
||
Syntax :
|
||
|
||
BOOT
|
||
|
||
Comments :
|
||
|
||
The BOOT command resets the system and retains Soft-ICE. BOOT is
|
||
required to debug boot sequences, DOS loadable drivers, and
|
||
non-DOS operating systems.
|
||
|
||
BOOT is implemented with an Interrupt 19H ROM BIOS call. In some
|
||
instances memory may be corrupted to the point where Interrupt 19
|
||
will not work. If this occurs, bring up Soft-ICE and use the
|
||
HBOOT command.
|
||
|
||
For BOOT to work properly, Soft-ICE should be installed as a
|
||
loadable driver in CONFIG.SYS before any other device drivers.
|
||
This is so Soft-ICE can restore the original system state as
|
||
accurately as possible.
|
||
|
||
Example :
|
||
|
||
BOOT
|
||
|
||
This command makes the system reboot. Soft-ICE remains resident.
|
||
|
||
Hard system boot (total reset)
|
||
|
||
Syntax :
|
||
|
||
HBOOT
|
||
|
||
Comments :
|
||
|
||
The HBOOT command resets the entire system. Soft-ICE is not
|
||
retained in the reset process. HBOOT is sufficient unless an
|
||
adapter card requires a power-on reset. In those rare cases, the
|
||
machine power must be recycled.
|
||
|
||
Example :
|
||
|
||
HBOOT
|
||
|
||
This command makes the system reboot. Soft-ICE must be reloaded.
|
||
|
||
05.04 Debug Mode Commands
|
||
|
||
ACTION Set action after break point is reached
|
||
WARN Set DOS/ROM BIOS re-entrancy warning mode
|
||
BREAK Break out any time
|
||
I3HERE Direct Interrupt 3's to Soft-ICE
|
||
|
||
Set action after break point is reached
|
||
|
||
Syntax :
|
||
|
||
ACTION [INT1 | INT3 | NMI | HERE | int-number]
|
||
|
||
Int-number :
|
||
Any valid interrupt number (0-FFH). Use this option only if
|
||
a user-supplied break point qualification routine has taken
|
||
over that interrupt vector (see section 11.2).
|
||
|
||
Comments :
|
||
|
||
The ACTION command determines where control is given when break
|
||
point conditions have been met. In most cases, the desired action
|
||
is INT3 or HERE, INT3 is typically used if Soft-ICE is being used
|
||
with a host debugger, HERE is used when it is desired to return
|
||
to Soft-ICE when break point conditions have been met, INT1 and
|
||
NMI are alternatives for certain debuggers that will not work
|
||
with the INT3 option. For instance, CODEVIEW works best with
|
||
ACTION set to NMI.
|
||
|
||
Use int-number if there is a user-supplied break point
|
||
qualification routine installed. Using int-number without having
|
||
a user-supplied break point qualification routine installed
|
||
causes an error. For more information, see section
|
||
11.2,'User-Qualified Break Points'.
|
||
|
||
If no parameter is supplied with the ACTION command, the current
|
||
action is displayed.
|
||
|
||
The default action is HERE.
|
||
|
||
Example :
|
||
|
||
ACTION HERE
|
||
|
||
This command specifies that control will return to Soft-ICE when
|
||
break point conditions have been met.
|
||
|
||
Set DOS/ROM BIOS re-entrancy warning mode
|
||
|
||
Syntax :
|
||
|
||
WARN [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
The WARN command is provided for using Soft-ICE with debuggers
|
||
that use DOS and ROM BIOS. Many debuggers use DOS and ROM BIOS
|
||
for screen output and for receiving keystrokes. Since DOS and ROM
|
||
BIOS are not fully re- entrant, these debuggers may not work
|
||
properly if break point occurs while the DOS or ROM BIOS is
|
||
executing.
|
||
|
||
If WARN ON is set, and ACTION is not HERE, then control will come
|
||
to Soft- ICE before the actual action occurs. The system displays
|
||
the current CS:IP and gives you the choice of continuing or
|
||
returning to Soft-ICE. Generally, you should choose to return to
|
||
Soft-ICE to continue your debugging. Only continue with the host
|
||
debugger if you know your debugger will not cause DOS or ROM BIOS
|
||
to be re-entered.
|
||
|
||
WARN mode should be turned on to use Soft-ICE with DEBUG, SYMDEB,
|
||
and CODEVIEW.
|
||
|
||
If no parameter is specified, the current state of WARN is
|
||
displayed.
|
||
|
||
The default is WARN mode OFF.
|
||
|
||
Example :
|
||
|
||
WARN ON
|
||
|
||
This command turns on DOS/ROM BIOS re-entrancy warning mode.
|
||
|
||
Break out any time
|
||
|
||
Syntax :
|
||
|
||
BREAK [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
The BREAK command allows popping up the Soft-ICE window when the
|
||
system is hung with interrupts disabled. Break mode can be used
|
||
for the entire debugging session, or it can be turned on and off
|
||
when it is required.
|
||
|
||
Break mode degrades system performance slightly. This performance
|
||
degradation must be weighed against the necessity of breaking out
|
||
of a hung program. A user may want to have break mode on all the
|
||
time, even though performance is degraded, because the program
|
||
could hang at any time.
|
||
|
||
Unlike other debuggers that can also be brought up at any time,
|
||
Soft-ICE does not require an external switch. When BREAK is on,
|
||
the Soft-ICE window can be brought up at any time by pressing the
|
||
current key sequence.
|
||
|
||
If no parameter is specified, the current state of BREAK is
|
||
displayed
|
||
|
||
The default is BREAK mode OFF.
|
||
|
||
Example :
|
||
|
||
BREAK ON
|
||
|
||
This command turns on break mode. This means that the Soft-ICE
|
||
window can be brought up at any time, even if interrupts are
|
||
disabled.
|
||
|
||
Direct Interrupt 3's to Soft-ICE
|
||
|
||
Syntax :
|
||
|
||
I3HERE [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
The I3HERE command lets you specify that any Interrupt 3 will
|
||
bring up the Soft-ICE window. This feature is useful for stopping
|
||
your program in a specific location.
|
||
|
||
To use this feature, place an INT 3 into your code at the
|
||
location where you want to stop. When the INT 3 occurs, it will
|
||
bring up the Soft-ICE window. At this point, you can use the R IP
|
||
command to change your instruction pointer to the instruction
|
||
after the INT 3, then you can continue debugging.
|
||
|
||
If no parameter is specified, the current state of 13HERE is
|
||
displayed.
|
||
|
||
The default is 13HERE mode OFF.
|
||
|
||
Example :
|
||
|
||
I3HERE ON
|
||
|
||
This command turns on 13HERE mode. Any INT 3's generated after
|
||
this point will bring up the Soft-ICE window.
|
||
|
||
05.05 Utility Commands
|
||
|
||
A Assemble code
|
||
S Search for data
|
||
F Fill memory with data
|
||
M Move data
|
||
C Compare two data blocks
|
||
|
||
Assemble code
|
||
|
||
Syntax :
|
||
|
||
A [address]
|
||
|
||
Comments :
|
||
|
||
The Soft-ICE assembler allows you to assemble instructions
|
||
directly into memory. The assembler supports the basic 8086
|
||
instruction set with the 80186 and 80286 real address mode
|
||
extensions. Numeric co-processor instructions and 80386 specific
|
||
instructions, registers and addressing modes can NOT be
|
||
assembled.
|
||
|
||
The A command enters the Soft-ICE interactive assembler. An
|
||
address is displayed as a prompt for each assembly line After an
|
||
assembly language instruction is typed in and ENTER is pressed,
|
||
the instructions are assembled into memory at the specified
|
||
address. Instructions must be entered with standard Intel format.
|
||
Press ENTER at an address prompt to exit assembler mode.
|
||
|
||
If the address range in which you are assembling instructions is
|
||
visible in the code window, the instructions will change
|
||
interactively as you assemble.
|
||
|
||
The Soft-ICE assembler supports the standard 8086 family
|
||
mnemonics, however there are some special additions :
|
||
|
||
The DB mnemonic is used to define bytes of data directly into
|
||
memory. The DB command is followed by a list of bytes and/or
|
||
quoted strings separated by spaces or commas.
|
||
|
||
The RETF mnemonic represents a far return.
|
||
|
||
WORD PTR and BYTE PTR are used to determine data size if there is
|
||
no register argument, for example: MOV BYTE PTR ES:[ 1234],1.
|
||
|
||
Use FAR and NEAR to explicitly assemble far and near jumps and
|
||
calls. If FAR or NEAR is not specified then all jumps and calls
|
||
are near.
|
||
|
||
Operands referring to memory locations should placed in square
|
||
brackets, for example: MOV AX,[1234].
|
||
|
||
Example :
|
||
|
||
A CS:1234
|
||
|
||
This command prompts you for assembly instruction then assembles
|
||
them beginning at offset 1234H with the current code segment.
|
||
Press ENTER at the address prompt after entering the last
|
||
instruction.
|
||
|
||
Search for data
|
||
|
||
Syntax :
|
||
|
||
S address L length data-list
|
||
|
||
Data-list :
|
||
list of bytes or quoted strings separated by commas or
|
||
spaces. A quoted string can begin with a single quote or a
|
||
double quote.
|
||
Length :
|
||
length in bytes
|
||
|
||
Comments :
|
||
|
||
The S command searches memory for a series of bytes or characters
|
||
that matches the data-list. The search begins at the specified
|
||
address and continues for the length specified. The address of
|
||
each occurrence found in the range is displayed.
|
||
|
||
Example :
|
||
|
||
S DS:SI+10 L CX 'Hello',12,34
|
||
|
||
This command searches for the string 'Hello' followed by the
|
||
bytes 12H and 34H starting at offset SI+10 in the current data
|
||
segment and ending CX bytes later.
|
||
|
||
Fill memory with data
|
||
|
||
Syntax :
|
||
|
||
F address L length data-list
|
||
|
||
Data-list :
|
||
list of bytes or quoted strings separated by commas or
|
||
spaces. A quoted string can begin with a single quote or a
|
||
double quote.
|
||
Length :
|
||
length in bytes
|
||
|
||
Comments :
|
||
|
||
The F command fills memory with the series of bytes or characters
|
||
specified in the data-list. Memory is filled starting at the
|
||
specified address and continuing for the specified length,
|
||
repeating the data-list if necessary.
|
||
|
||
Example :
|
||
|
||
F 8000:0 L 100 'Test'
|
||
|
||
This command fills memory starting at 8000:0 for a length of 100H
|
||
bytes with the string 'Test'. The string Test' is repeated until
|
||
the fill length is exhausted.
|
||
|
||
Move data
|
||
|
||
Syntax :
|
||
|
||
M start-address L length end-address
|
||
|
||
Length :
|
||
length in bytes
|
||
|
||
Comments :
|
||
|
||
The M command moves the specified number of bytes from the
|
||
start-address in memory to the end-address in memory.
|
||
|
||
Example :
|
||
|
||
M 1000:0 L 200 2000:0
|
||
|
||
This command moves 200H bytes from memory location 1000:0 to
|
||
memory location 2000:0.
|
||
|
||
Compare two data blocks
|
||
|
||
Syntax :
|
||
|
||
C address1 L length address2
|
||
|
||
Length :
|
||
length in bytes
|
||
|
||
Comments :
|
||
|
||
The C command compares the memory block specified by address1 and
|
||
the length with the memory block specified address2 and the
|
||
length. When a byte from the first data block does not match a
|
||
byte from the second data block, both bytes are displayed, along
|
||
with their addresses.
|
||
|
||
Example :
|
||
|
||
C 5000:100 L 10 6000:100
|
||
|
||
This command compares the 10H bytes starting at memory location
|
||
5000:100 with the 10H bytes starting at memory location 6000:100.
|
||
|
||
05.06 Specialized Debugging Commands
|
||
|
||
SHOW Display instructions from history buffer
|
||
TRACE Enter trace simulation mode
|
||
XT Single step in trace simulation mode
|
||
XP Program step in trace simulation mode
|
||
XG Go to address in trace simulation mode
|
||
XRSET Reset back trace buffer
|
||
VECS Save/restore/compare interrupt vectors
|
||
SNAP Take snap shot of memory block
|
||
EMMMAP Display EMM allocation map
|
||
|
||
Display instructions from history buffer
|
||
|
||
Syntax :
|
||
|
||
SHOW [B | start]
|
||
|
||
B :
|
||
This tells the show command to start the display with the
|
||
oldest instruction in the back trace buffer.
|
||
start :
|
||
The number of instructions back from the buffer end (last
|
||
instruction captured) to begin display.
|
||
|
||
Comments :
|
||
|
||
The SHOW command displays instructions from the back trace
|
||
history buffer. If source is available for the instructions then
|
||
the display is in mixed mode, otherwise only code is displayed.
|
||
|
||
SHOW allows scrolling through the back trace buffer with the up,
|
||
down, Pageup and PaqeDn keys. To exit from SHOW you must press
|
||
the Esc key.
|
||
|
||
Preceding the address of each instruction is the buffer entry
|
||
number. This number shows how deep into the buffer you are
|
||
displaying. The higher the number, the deeper you are into the
|
||
buffer.
|
||
|
||
Note :
|
||
|
||
Before using the SHOW command, instructions must have been logged
|
||
with a back trace range. See chapter 9 for more information on
|
||
back trace ranges.
|
||
|
||
Hints :
|
||
|
||
It is often useful to have the code window visible with the
|
||
actual code of the region you are displaying from the back trace
|
||
buffer. When you compare the actual instruction flow to code,
|
||
displayed jumps and calls are usually less confusing.
|
||
|
||
Using SHOW in conjunction with the TRACE command will allow you
|
||
to see the instructions in the back trace history buffer from two
|
||
different points of view.
|
||
|
||
Example :
|
||
|
||
SHOW 40
|
||
|
||
This example will displays starting with the 40th instruction
|
||
back in the back trace buffer.
|
||
|
||
Enter trace simulation mode
|
||
|
||
Syntax :
|
||
|
||
TRACE [start] | [OFF]
|
||
|
||
start :
|
||
The number of instructions back from the buffer end (last
|
||
instruction captured) to begin trace simulation.
|
||
OFF :
|
||
Exit trace simulation mode.
|
||
|
||
Comments :
|
||
|
||
The TRACE command allows you to replay instructions from the
|
||
instruction back trace history buffer just as if they were being
|
||
executed for the first time. To use trace simulation mode you
|
||
must have the code window visible After entering trace simulation
|
||
mode you use the XT, XP and XG commands to trace through the
|
||
instructions in the buffer.
|
||
|
||
To exit trace simulation mode type TRACE OFF.
|
||
|
||
TRACE with no parameters specified displays whether trace
|
||
simulation mode is on or off.
|
||
|
||
Note :
|
||
|
||
Before using the TRACE command, instructions must have been
|
||
logged with a back trace range. See chapter 9 for more
|
||
information on back trace ranges.
|
||
|
||
Hints :
|
||
|
||
Trace simulation mode is most useful when the code window is
|
||
visible. It is often useful to use TRACE in conjunction with the
|
||
SHOW command. This allows the instructions in the back trace
|
||
history buffer to be viewed simultaneously in two different
|
||
forms.
|
||
|
||
Example :
|
||
|
||
TRACE 40
|
||
|
||
This example enters trace simulation mode starting 40
|
||
instructions back from the last instruction logged. It will
|
||
remain in trace simulation mode until TRACE OFF is entered.
|
||
|
||
Single step in trace simulation mode
|
||
|
||
Syntax :
|
||
|
||
XT [R]
|
||
|
||
R :
|
||
Single step in reverse direction.
|
||
|
||
Comments :
|
||
|
||
The XT command single steps through the instruction back trace
|
||
history buffer. This command acts like the T command for normal
|
||
debugging. Note that the registers do NOT change while stepping
|
||
in trace simulation mode except CS and IP.
|
||
|
||
The XT instruction allows you to replay instructions from the
|
||
back trace history buffer,
|
||
|
||
Note :
|
||
|
||
Before using XT you must be in trace simulation mode. See chapter
|
||
9 and the TRACE command in this section for more information on
|
||
back trace ranges.
|
||
|
||
Hint :
|
||
|
||
If you are using XT frequently, like any other Soft-ICE command
|
||
it can be assigned to a function key.
|
||
|
||
Example :
|
||
|
||
XT
|
||
|
||
This command single steps one instruction in trace simulation
|
||
mode.
|
||
|
||
Program step in trace simulation mode
|
||
|
||
Syntax :
|
||
|
||
XP
|
||
|
||
Comments :
|
||
|
||
The XP command does a logical program step through the
|
||
instruction back trace history buffer. This command acts like the
|
||
P command for normal debugging. Note that the registers do NOT
|
||
change while stepping in trace simulation mode except CS and IP.
|
||
|
||
The XP instruction allows you to replay instructions from the
|
||
back trace history buffer.
|
||
|
||
Note :
|
||
|
||
Before using XP you must be in trace simulation mode. See chapter
|
||
9 and the TRACE command in this section for more information on
|
||
back trace ranges.
|
||
|
||
Hint :
|
||
|
||
If you are using XP frequently, like any other Soft-ICE command
|
||
it can be assigned to a function key.
|
||
|
||
Example :
|
||
|
||
XP
|
||
|
||
This command executes one program step in trace simulation mode.
|
||
|
||
Go to an address in trace simulation mode
|
||
|
||
Syntax :
|
||
|
||
XG [R] address
|
||
|
||
R :
|
||
Search for address in reverse direction.
|
||
Address :
|
||
Address to go to in the back trace history buffer.
|
||
|
||
Comments :
|
||
|
||
The XG command moves the instruction pointer to the next
|
||
occurrence of the specified address in the back trace history
|
||
buffer. If R is specified preceding the address, then the
|
||
instruction pointer is moved to the previous occurrence the
|
||
specified address in the back trace buffer.
|
||
|
||
The address must be the first byte of an instruction opcode.
|
||
|
||
The XG is analogous to the G command in normal debugging.
|
||
|
||
Note :
|
||
|
||
Before using XG you must be in trace simulation mode. See chapter
|
||
9 and the TRACE command in this section for more information on
|
||
back trace ranges.
|
||
|
||
Example :
|
||
|
||
XG 273:1030
|
||
|
||
This command moves the instruction pointer to the next instance
|
||
of the instruction at address 273:1030.
|
||
|
||
Reset back trace history buffer
|
||
|
||
Syntax :
|
||
|
||
XRSET
|
||
|
||
Comments :
|
||
|
||
The XRSET command resets the back trace history buffer. This
|
||
command should be executed before setting a back trace range if
|
||
there is unwanted instruction information in the back trace
|
||
buffer.
|
||
|
||
Example :
|
||
|
||
XRSET
|
||
|
||
This command resets the back trace buffer.
|
||
|
||
Save/restore/compare interrupt vectors
|
||
|
||
Syntax :
|
||
|
||
VECS [C|S|R]
|
||
|
||
C :
|
||
Compare current table with stored table
|
||
S :
|
||
Save current interrupt table to buffer
|
||
R :
|
||
Restore interrupt table from buffer
|
||
|
||
Comments :
|
||
|
||
The VECS command allows you to save and restore the interrupt
|
||
table to an internal Soft-ICE buffer. The actual table can also
|
||
be compared to the stored table with the differences displayed.
|
||
|
||
When the C option is used to compare the current interrupt vector
|
||
table with the stored copy the output is in the following format:
|
||
|
||
address old-vector new-vector
|
||
|
||
Each vector that has changed is displayed.
|
||
|
||
The interrupt vector table is initially stored when Soft-ICE is
|
||
loaded. It is also automatically stored when a program loaded
|
||
with LDR.EXE. Only one copy of the interrupt vector table is
|
||
stored, so each time VECS S is executed, previous copy of the
|
||
interrupt table is overwritten.
|
||
|
||
If no parameters are specified, the entire interrupt vector table
|
||
is displayed.
|
||
|
||
Example :
|
||
|
||
VECS C
|
||
|
||
This command compares the actual interrupt vector table with one
|
||
that had been previously stored in the Soft-ICE internal VECS
|
||
buffer.
|
||
|
||
Take snap shot of memory block
|
||
|
||
Syntax :
|
||
|
||
SNAP [C | S | R] address1 address2
|
||
|
||
C :
|
||
Compare buffer with address range
|
||
S :
|
||
Save address range to buffer
|
||
R :
|
||
Restore buffer to address range
|
||
|
||
Comments :
|
||
|
||
The SNAP command takes a snap shot of a memory block for later
|
||
comparison. The S option copies a block of memory to a buffer in
|
||
extended memory. The C option displays differences between the
|
||
buffer in extended memory and the actual memory specified by the
|
||
address range. The R option copies the buffer in extended memory
|
||
to the address range in conventional memory.
|
||
|
||
When the C option is used to compare the buffer with the address
|
||
range the output is in the following format :
|
||
|
||
address old-data new-data
|
||
|
||
Each byte that has changed is displayed.
|
||
|
||
The address is usually not necessary for the C and R options. If
|
||
the address is not specified, the address from the last time SNAP
|
||
was entered with a specified address used.
|
||
|
||
Notes :
|
||
|
||
To use the SNAP command you must have specified the /TRA XXXX
|
||
switch on the S-ICE.EXE line in CONFIG.SYS.
|
||
|
||
The SNAP command saves data in the back trace history buffer. If
|
||
you are using back trace then you will have a conflict with SNAP.
|
||
Specifically, SNAP will overwrite back trace information if you
|
||
do a SNAP S when instruction history is in the back trace buffer.
|
||
Conversely, if you have saved a region with SNAP, then enabling a
|
||
back trace range will overwrite the SNAP buffer.
|
||
|
||
Example :
|
||
|
||
SNAP S 2000:0 4000:0
|
||
|
||
This command stores the data block from 2000:0 to 4000:0 in the
|
||
Soft-ICE back trace buffer.
|
||
|
||
Display EMM allocation map
|
||
|
||
Syntax :
|
||
|
||
EMMMAP
|
||
|
||
Comments :
|
||
|
||
The EMMMAP command displays each physical page that is available
|
||
for EMM memory and the pages that are currently mapped in.
|
||
|
||
Note :
|
||
|
||
The Soft-ICE EMM feature must be enabled to use this function.
|
||
See chapter 8 for more information on enabling EMM capability.
|
||
|
||
Example :
|
||
|
||
EMMMAP
|
||
|
||
This example displays the current EMM allocation in in the
|
||
following form.
|
||
|
||
Phy page Seg address Handle/Page
|
||
00 D000 FFFF
|
||
01 D400 0001/0000
|
||
02 D800 0001/0001
|
||
03 DC00 0001/0002
|
||
|
||
In this example, physical page 0 is located at D000 and is
|
||
unmapped. Physical page 1 is located at D400 and has handle 1,
|
||
page 0 mapped into it. Physical page 2 is located at D800 and has
|
||
handle 1, page I mapped into it. Physical page 3 is located at
|
||
DC00 and has handle page 2 mapped into it.
|
||
|
||
05.07 Windowing Commands
|
||
|
||
WR Toggle register window
|
||
WC Toggle/set size of code window
|
||
WD Toggle/set size of data window
|
||
EC Enter/exit code window
|
||
. Locate current instruction
|
||
|
||
Three window types may be created with Soft-ICE: register, data, and
|
||
code. Any of these windows can be toggled on or off at any time. The
|
||
data and code windows can be of variable size; the register window is
|
||
fixed in size. The windows always remain in a fixed order. Starting
|
||
from the top of the screen, the order is register window, data window,
|
||
then code window.
|
||
|
||
Toggle register window
|
||
|
||
Syntax :
|
||
|
||
WR
|
||
|
||
Comments :
|
||
|
||
The command makes the register window visible if not currently
|
||
visible. If the register window is currently visible, WR removes
|
||
the register window.
|
||
|
||
The register window displays the 8086 register set and the
|
||
processor flags. Default Function: F2
|
||
|
||
Toggle/set size of code window
|
||
|
||
Syntax :
|
||
|
||
WC [window-size]
|
||
|
||
Window-size :
|
||
a decimal number between one and 21.
|
||
|
||
Comments :
|
||
|
||
If window-size is not specified, this command toggles the code
|
||
window. If it was not visible it is made visible, and if it was
|
||
visible it is removed.
|
||
|
||
If window-size is specified the code window is resized, or it was
|
||
not visible it is made visible with the specified size.
|
||
|
||
Note :
|
||
|
||
If you wish to move the cursor to the code window use the EC
|
||
command. See description of the EC command for more details.
|
||
|
||
Example :
|
||
|
||
WC 12
|
||
|
||
If no code window is present, then a code window 12 lines in
|
||
length is created. If the code window is currently on the screen,
|
||
it is resized to 12 lines.
|
||
|
||
Toggle/set size of data window
|
||
|
||
Syntax :
|
||
|
||
WD [window-size]
|
||
|
||
Window-size :
|
||
a decimal number between one and 21.
|
||
|
||
Comments :
|
||
|
||
If window-size is not specified, this command toggles the data
|
||
window. If it was not visible it is made visible, and if it was
|
||
visible it is removed.
|
||
|
||
If window-size is specified the data window is resized, or it was
|
||
not visible it is made visible with the specified size.
|
||
|
||
Example :
|
||
|
||
WD 1
|
||
|
||
If no data window is present then a data window of one line is
|
||
created. If the data window is currently on the screen, it is
|
||
resized to one line.
|
||
|
||
Enter/exit code window
|
||
|
||
Syntax :
|
||
|
||
EC
|
||
|
||
Comments :
|
||
|
||
The EC command toggles the cursor location between the code
|
||
window and the command window. If the cursor was in the command
|
||
window it is moved to the code window, and if the cursor was in
|
||
the code window it is moved to the command window.
|
||
|
||
When the cursor is in the code window several options become
|
||
available that make debugging much easier. The options are:
|
||
|
||
Point-and-shoot break points.Point-and-shoot break points are set
|
||
with the BP command. If no parameters are specified with the BPX
|
||
command an execution break point is set at the location of the
|
||
cursor position in the code window. The cursor must be on a line
|
||
that contains code (place the code window in mixed mode if you
|
||
are unsure). The default function key assignment for BPX is F9.
|
||
|
||
Go to cursor line.You can set a temporary break point at the
|
||
cursor and go with the HERE command. The cursor must be on a line
|
||
that contains code (place the code window in mixed mode if you
|
||
are unsure). The default function key assignment for HERE is F7.
|
||
|
||
Scrolling the code window.The code window can be scrolled only
|
||
while the cursor is in the code window. The scrolling keys (UP
|
||
arrow, DOWN arrow, PageUp and PageDown) are redefined while the
|
||
cursor is in code window. When the cursor is in the code window
|
||
the scrolling keys do the following:
|
||
|
||
up Scroll code window up one line
|
||
down Scroll code window down one
|
||
pageup Scroll code window up one window
|
||
pageDn Scroll code window down one window<
|
||
|
||
Note :
|
||
|
||
The code window must be visible for the EC command to work.
|
||
Default Function Key: F6
|
||
|
||
Locate current instruction
|
||
|
||
Syntax :
|
||
|
||
.
|
||
|
||
Comments :
|
||
|
||
When the code window is visible, the . command makes the current
|
||
source line or current instruction visible.
|
||
|
||
05.08 Debugger Customization Commands
|
||
|
||
PAUSE Pause after each screen
|
||
ALTKEY Set alternate key sequence to invoke Soft-ICE
|
||
FKEY Show and edit function keys
|
||
BASE Set/display current radix
|
||
CTRL-P Toggle log session to printer
|
||
Print-Screen Print contents of screen
|
||
PRN Set printer output port
|
||
|
||
Pause after each screen
|
||
|
||
Syntax :
|
||
|
||
PAUSE [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
PAUSE controls screen pause at the end of each page. If PAUSE is
|
||
ON, you are prompted to press any key before information is
|
||
scrolled off the window. The prompt is displayed in the status
|
||
line at the bottom of the window.
|
||
|
||
If noparameter is specified, the current state of PAUSE is
|
||
displayed.
|
||
|
||
The default is PAUSE mode ON.
|
||
|
||
Example :
|
||
|
||
PAUSE ON
|
||
|
||
This command specifies that subsequent window display commands
|
||
will cause the screen to wait for you to press a key before
|
||
scrolling new information off the window.
|
||
|
||
Set alternate key sequence to invoke Soft-ICE
|
||
|
||
Syntax :
|
||
|
||
ALTKEY [ALTletter] | [CTRLletter] | [SYSREQ]
|
||
|
||
Letter :
|
||
Any letter (A - Z)
|
||
|
||
Comments :
|
||
|
||
The ALTKEY command allows the key sequence for popping up
|
||
Soft-ICE to be changed. The key sequence be changed to CTRL +
|
||
letter, ALT + letter, or the SysRq key.
|
||
|
||
Occasionally you may be using a program that conflicts with the
|
||
CTRL D key sequence that brings up the Soft-ICE window. One way
|
||
to circumvent this possible problem is to use the ALTKEY command
|
||
to change the key sequence. Another way is to add the SHIFT key
|
||
to the current sequence. Soft-ICE does not respond to this key
|
||
sequence and allows it to go through to your program. For example
|
||
if a resident program you are using is brought up with the CTRL D
|
||
key sequence, try using the key sequence CTRL SHIFT D to bring up
|
||
your resident program. On some keyboards, you must press ALT and
|
||
the prtsc key simultaneously to generate a system request. Care
|
||
must be taken so the screen is not printed accidentally.
|
||
|
||
If no parameter is specified, the current key sequence state is
|
||
displayed. The default key sequence is CTRL D.
|
||
|
||
Example :
|
||
|
||
ALTKEY ALT Z
|
||
|
||
This command specifies that the key sequence ALT Z will now be
|
||
used to pop up the Soft-ICE window.
|
||
|
||
Show and edit function keys
|
||
|
||
Syntax :
|
||
|
||
FKEY [function-key-name string]
|
||
|
||
function-key-name :
|
||
F1, F2... F12
|
||
string :
|
||
The string consists of any valid Soft-ICE commands and the
|
||
special character ^ (caret) and ; (semicolon). A ^ is placed
|
||
in the string to make a command invisible. A ; is placed in
|
||
the string to denote a carriage return.
|
||
|
||
Comments :
|
||
|
||
The FKEY command is used from the command line to assign a
|
||
function key to a command string. Function key can be assigned to
|
||
any command string that can be typed into Soft-ICE.
|
||
|
||
If no parameters are specified, then the current function key
|
||
assignments are displayed.
|
||
|
||
To unassign a specified function key, use the FKEY command with
|
||
these parameters: a function-key-name followed by a null string.
|
||
|
||
The function keys can also be pre-initialized in the definition
|
||
file S-ICE.DAT. For more information on function key definitions
|
||
in the definition file, refer to section 6.4.
|
||
|
||
Using carriage return symbols in a function key assignment string
|
||
allows you to assign a function key a series of commands. A
|
||
carriage return is represented by a ; (semicolon).
|
||
|
||
If you put ^ (shift 6) in front of a function key definition, the
|
||
subsequent command will be invisible. The command will function
|
||
as normal, but all information displayed in the command window
|
||
(including error messages) is suppressed. The invisible mode is
|
||
useful when a command changes information in a window (code,
|
||
register or data) but you do not want to clutter the command
|
||
window, when a function key is made invisible with ^, the
|
||
function key can be used in the middle of typing in other command
|
||
without affecting their operation. For example, if you are using
|
||
the default assignment for F2, you can toggle the register window
|
||
with F2 even if you are partially through typing in your next
|
||
command.
|
||
|
||
Note :
|
||
|
||
Soft-ICE now has a definition file named S-ICE.DAT. You can place
|
||
function key assignments in this file so that function keys will
|
||
be automatically assigned when Soft-ICE is loaded. The syntax for
|
||
assigning a function key in the configuration file is:
|
||
|
||
function-key-name = "string"
|
||
|
||
When assigning function keys to a command string in S-ICE.DAT,
|
||
the string must be enclosed in double quotes.
|
||
|
||
Command line examples :
|
||
|
||
FKEY F2 ^WR;
|
||
|
||
This example will assign the toggle register window command to
|
||
the F2 key. The ^ makes the function invisible, and the ; ends
|
||
the function with a carriage return. The F2 key will toggle the
|
||
register window on or off, and can even be evoked while typing in
|
||
another command.
|
||
|
||
FKEY F1 "G CS:120; R; G CS:"
|
||
|
||
This example shows that multiple commands can be assigned to a
|
||
single function key and that partial commands can be assigned for
|
||
the user to complete. After this command is entered, pressing the
|
||
F1 key will cause the program to execute until location CS:120 is
|
||
reached, display the registers, then start the G command for the
|
||
user to complete.
|
||
|
||
FKEY F1 WD 3;D DS:100;
|
||
|
||
This example will assign a series of commands to the F1 key. The
|
||
function is visible, and ends with a carriage return. The F1 key
|
||
will make the data window three lines long and dump data starting
|
||
at DS:100.
|
||
|
||
S-ICE.DAT example:
|
||
|
||
F1 = "WR;WD 2;WC 10;"
|
||
|
||
If this line is placed in S-ICE.DAT, when Soft-ICE is loaded it
|
||
will assign the string to the F1 key. When F1 is pressed while in
|
||
Soft-ICE, it will toggle the register window, create a data
|
||
window of length 2 and a code window of length 10. For more
|
||
information about assigning function key definitions in
|
||
S-ICE.DAT, refer to chapter 6.
|
||
|
||
Set/display current radix
|
||
|
||
Syntax :
|
||
|
||
BASE [10 | 16]
|
||
|
||
Comments :
|
||
|
||
The BASE command sets the current radix to base 10 or base 16.
|
||
Base 10 is of limited use in the narrow window because of window
|
||
width limitations. It also limits the amount of information
|
||
displayed in some commands in the wide mode.
|
||
|
||
When the current radix is base 10, all numbers and addresses
|
||
typed into and displayed by Soft-ICE are in decimal, When the
|
||
current radix is base 16, all numbers and addresses typed into
|
||
Soft-ICE are in hexadecimal except for the source line numbers
|
||
and the screen coordinates and sizes in the WIN command
|
||
|
||
These exceptions are always typed in and displayed as decimal
|
||
numbers. The default radix is base 16.
|
||
|
||
Example :
|
||
|
||
BASE 16
|
||
|
||
This example sets the current radix to base 16.
|
||
|
||
Toggle log session to printer
|
||
|
||
Syntax :
|
||
|
||
CTRL-P
|
||
|
||
Comments :
|
||
|
||
When the CTRL key followed by the P key is pressed, all
|
||
subsequent information displayed in the command window is also
|
||
sent to the printer. To turn the log to printer mode off, type
|
||
CTRL followed by P again.
|
||
|
||
When you are sending a lot of information to the printer using
|
||
CTRL-P, you may want to turn the PAUSE command OFF to allow
|
||
information to scroll off the window without pressing a key.
|
||
|
||
Print contents of screen
|
||
|
||
Syntax :
|
||
|
||
Print-Screen
|
||
|
||
Comments :
|
||
|
||
Depressing the print-screen key does a screen dump to printer.
|
||
All information from the screen is sent the printer.
|
||
|
||
If you wish to print the memory map or help information is
|
||
usually much faster to use CTRL-P than Print-Screen. This is
|
||
because Print-Screen prints every character on the screen
|
||
including borders.
|
||
|
||
Set printer output port
|
||
|
||
Syntax :
|
||
|
||
PRN [LPTx | COMx]
|
||
|
||
x :
|
||
a decimal number between 1 and 4.
|
||
|
||
Comments :
|
||
|
||
The PRN command allows you to send output from the CTRL-P and
|
||
Print-Screen commands to a different printer port.
|
||
|
||
If no parameters are supplied, PRN displays the currently
|
||
assigned printer port.
|
||
|
||
Example :
|
||
|
||
PRN COM 1
|
||
|
||
This command causes the CTRL-P and Print-Screen command output to
|
||
go to the COM 1 port.
|
||
|
||
05.09 Screen Control Commands
|
||
|
||
FLASH Restore screen during P and T
|
||
FLICK Screen flicker reduction
|
||
WATCHV Set watch video mode
|
||
RS Restore program screen
|
||
CLS Clear window
|
||
ALTSCR Change to alternate screen
|
||
WIN Change size of Soft-ICE window
|
||
|
||
Restore screen during P and T
|
||
|
||
Syntax :
|
||
|
||
FLASH [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
The FLASH command lets you specify whether the screen will be
|
||
restored during any Trace and Program step commands. If you
|
||
specify that the screen is to be restored it is restored for the
|
||
brief time period that the P or T command is executing. This
|
||
feature is needed to debug sections of code that access video
|
||
memory.
|
||
|
||
If the P command executes across a call or an interrupt, the
|
||
screen will always be restored, because the routine being called
|
||
may write to the screen.
|
||
|
||
If no parameter is specified, the current state of FLASH is
|
||
displayed.
|
||
|
||
The default is FLASH mode OFF.
|
||
|
||
Example :
|
||
|
||
FLASH ON
|
||
|
||
This command turns on FLASH mode. The screen will be restored
|
||
during any subsequent P or T commands.
|
||
|
||
Screen flicker reduction
|
||
|
||
Syntax :
|
||
|
||
FLICK [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
Certain types of video cards require waiting for horizontal or
|
||
vertical retrace before outputting characters. If the video
|
||
writes are made arbitrarily, flickering will appear while
|
||
displaying characters. If flickering occurs on your screen while
|
||
using the Soft-ICE window, you should turn FLICK on.
|
||
|
||
With some EGA cards, colors will not be restored properly when
|
||
you exit from Soft-ICE. This is a problem with virtualizing EGA
|
||
video. The port 3DA is a video port used for two purposes. The
|
||
first is old CGA software polling 3DA for hsync and vsync. This
|
||
allows them to have flicker free output on some old CGA
|
||
controller cards. The second is that it is used to reset a
|
||
palette latch on EGA cards. Soft-ICE has an algorithm to avoid
|
||
having to constantly watch this port, which would slow down old
|
||
programs that think they are on a CGA. However, there can
|
||
occasional be circumstances where this algorithm does not work.
|
||
If you are using Soft- ICE on an EGA screen and you notice that
|
||
the colors are not restored correctly, then turn FLICK ON and
|
||
Soft-ICE will watch the 3DA port, fixing the problem.
|
||
|
||
When FLICK mode is ON, screen update will be slower.
|
||
|
||
If no parameter is specified, the current state of FLICK is
|
||
displayed.
|
||
|
||
The default is FLICK mode OFF.
|
||
|
||
Example :
|
||
|
||
FLICK ON
|
||
|
||
This command turns on FLICK mode. This causes Soft-ICE to wait
|
||
for the horizontal or vertical retrace before outputting
|
||
characters.
|
||
|
||
Set watch video mode
|
||
|
||
Syntax :
|
||
|
||
WATCHV [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
The WATCHV command allows you to specify how Soft-ICE should
|
||
watch the video ports. Normally, Soft-ICE only watches video
|
||
ports after an INT 10 instruction has been executed that switches
|
||
to a non-character video mode. Some programs do not use INT 10 to
|
||
switch modes. In these cases, if WATCHV is OFF, Soft-ICE may have
|
||
trouble saving and restoring the screen properly. Turning WATCHV
|
||
ON will cause Soft-ICE to watch the video ports all the time.
|
||
|
||
Turn WATCHV ON if you notice that Soft-ICE is not handling your
|
||
screen properly, or if the cursor is not being restored properly.
|
||
Turning WATCHV ON may have a performance impact in certain video
|
||
modes.
|
||
|
||
If no parameter is specified, the current state of WATCHV is
|
||
displayed.
|
||
|
||
The default is WATCHV mode OFF.
|
||
|
||
Example :
|
||
|
||
WATCHV ON
|
||
|
||
This command turns on WATCHV mode. This causes Soft-ICE to watch
|
||
additional video ports for the purpose of virtualization.
|
||
|
||
Restore program screen
|
||
|
||
Syntax :
|
||
|
||
RS
|
||
|
||
Comments :
|
||
|
||
The RS command allows you to restore the program screen
|
||
temporarily. The Soft-ICE window disappears until any key is
|
||
pressed.
|
||
|
||
This feature is useful when debugging graphic programs that
|
||
update the screen frequently. When Soft-ICE is brought up, it
|
||
returns to text mode. Using the RS command temporarily restores
|
||
the graphics screen.
|
||
|
||
Example :
|
||
|
||
RS
|
||
|
||
Clear window
|
||
|
||
Syntax :
|
||
|
||
CLS
|
||
|
||
Comments :
|
||
|
||
The CLS command clears the Soft-ICE window and moves the prompt
|
||
and the cursor to the upper left-hand corner the window.
|
||
|
||
Example :
|
||
|
||
CLS
|
||
|
||
Change to alternate screen
|
||
|
||
Syntax :
|
||
|
||
ALTSCR [ON | OFF]
|
||
|
||
Comments :
|
||
|
||
The ALTSCR command allows you to redirect the Soft-ICE output
|
||
from your default screen to the alternate screen. This feature is
|
||
useful, for instance, when you want to debug a graphics program
|
||
without having to switch between the Soft-ICE window and the
|
||
graphics display.
|
||
|
||
ALTSCR requires the system to have two monitors attached. The
|
||
alternate monitor should be in a character mode, which is the
|
||
default mode for monitors.
|
||
|
||
The default is ALTSCR mode OFF.
|
||
|
||
Example :
|
||
|
||
ALTSCR ON
|
||
|
||
This command redirects screen output to the alternate monitor.
|
||
|
||
Change size of Soft-ICE window
|
||
|
||
Syntax :
|
||
|
||
N :
|
||
When N is specified, the window will be set to the narrow
|
||
width : 46 characters.
|
||
W :
|
||
When W is specified, the window will be set to full screen
|
||
width
|
||
start-row :
|
||
Number from 0 to 17 specifying row where window display
|
||
starts.
|
||
length :
|
||
Number from 8 to 25 specifying how many lines tall you want
|
||
the window to be.
|
||
start-column :
|
||
Column position of the left side of narrow window. The
|
||
start-row and start-column specify the upper left hand
|
||
corner of the narrow window. The start-column is ignored if
|
||
applied to the wide window.
|
||
|
||
Comments :
|
||
|
||
The WIN command allows you to modify the width and height of the
|
||
Soft-ICE display window.
|
||
|
||
If no parameters are specified, this command toggles the window
|
||
between wide and narrow screen display modes.
|
||
|
||
If the WIN command is specified with only the N or the W
|
||
parameter, the window size will be changed to the requested width
|
||
at the current height.
|
||
|
||
If the number of lines plus the starting row number is larger
|
||
than25, the window length goes to the bottom of the screen.
|
||
|
||
The default is WIN mode narrow.
|
||
|
||
Examples :
|
||
|
||
WIN N 4 9 30
|
||
|
||
This command causes the window display to start at row 4 and
|
||
column 30, and to be 9 rows tall and 46 characters wide.
|
||
|
||
WIN
|
||
|
||
This command toggles the window display width from its current
|
||
state (either wide or narrow) to the opposite state.
|
||
|
||
WIN W 10 8
|
||
|
||
This command causes the window display to start at row 10, and to
|
||
be 8 rows tall and go the width of the screen.
|
||
|
||
05.10 Symbol and Source Line Commands
|
||
|
||
SYM Display/set symbol
|
||
SYMLOC Relocate symbol base
|
||
SRC Toggle between source, mixed and code
|
||
FILE Change/display current source
|
||
SS Search current source file for string
|
||
|
||
Display/set symbol
|
||
|
||
Syntax :
|
||
|
||
SYM [symbol-name [value]]
|
||
|
||
symbol-name :
|
||
A valid symbol name. The symbol name can end with an *
|
||
(asterisk). This allows searching if only the first part of
|
||
the symbol name is known. The , (comma) character can be
|
||
used as a wild card character in place of character in the
|
||
symbol-name.
|
||
value :
|
||
This is a word value that is used if you want to set a
|
||
symbol to a specific value.
|
||
|
||
Comments :
|
||
|
||
The SYM command allows displaying and setting of symbols. If SYM
|
||
is entered with no parameters all symbols are displayed. The
|
||
value of each symbol is displayed next to the symbol name.
|
||
|
||
If a symbol name is specified with no value then the symbol name
|
||
and value are displayed. If the symbol name was not found then
|
||
nothing is displayed.
|
||
|
||
The SYM command is often useful for finding a symbol name when
|
||
you can only remember a portion of the name Two wild card methods
|
||
are available for locating symbols. If symbol-name ends with an
|
||
*, then all symbols that match the actual characters typed prior
|
||
to the * will be displayed regardless of their ending characters.
|
||
If a , is used in place of a specific character in symbol-name,
|
||
that character is a wild card character.
|
||
|
||
If value is specified, all symbols that match symbol-name are set
|
||
to the value. All symbols have word values.
|
||
|
||
Examples :
|
||
|
||
SYM FOO*
|
||
|
||
All symbols that start with FOO are displayed.
|
||
|
||
SYM FOO* 6000
|
||
|
||
All symbols that start with FOO are given the value 6000.
|
||
|
||
Relocate symbol base
|
||
|
||
Syntax :
|
||
|
||
SYMLOC segment-address
|
||
|
||
Comments :
|
||
|
||
The SYMLOC command relocates the segment components of all
|
||
symbols relative to the specified segment address. This function
|
||
is necessary when debugging loadable device drivers or other
|
||
programs that can not be loaded directly with LDR.EXE.
|
||
|
||
When relocating for a loadable device driver, use the value of
|
||
the base address of the driver as found in the MAP command. When
|
||
relocating for an .EXE program, the value is 10H greater than
|
||
that found as the base in the MAP command. When relocating for a
|
||
.COM program, use the base segment address that is found in the
|
||
MAP command.
|
||
|
||
The MAP command will display at least two entries for each
|
||
program. The first is typically the environment and the second is
|
||
typically the program. The base address of the program is the
|
||
relocation value.
|
||
|
||
Example :
|
||
|
||
SYMLOC 1244 + 10
|
||
|
||
This will relocate all segments in the symbol table relative to
|
||
1244. The + 10 is used to relocate a TSR that was originally a
|
||
.EXE file. If it is a .COM file the + 10 is not necessary.
|
||
|
||
Toggle between source, mixed and code
|
||
|
||
Syntax :
|
||
|
||
SRC [?]
|
||
|
||
Comments :
|
||
|
||
The SRC command toggles between source mode, mixed mode and code
|
||
mode in the code window.
|
||
|
||
If SRC ? is entered, the current state is displayed.
|
||
|
||
Example :
|
||
|
||
SRC
|
||
|
||
This command changes the current mode of the code window. If the
|
||
mode was source, it becomes mixed. the mode was mixed, it becomes
|
||
code. If the mode was code, it becomes source. Default-Function
|
||
Key: F3
|
||
|
||
Change/display current source file
|
||
|
||
Syntax :
|
||
|
||
FILE [file-name]
|
||
|
||
Comments :
|
||
|
||
If a file-name is specified, that file becomes the current file
|
||
and the start of the file is displayed in the code window. If no
|
||
name is specified, the name of the current source file (if any)
|
||
is displayed.
|
||
|
||
The FILE command is often useful when setting a break point on a
|
||
line that has no associated public symbol. Use file to bring the
|
||
desired file into the code window, use the SS command to locate
|
||
the specific line, move the cursor the specific line, then type
|
||
BPX to set the break point.
|
||
|
||
Note :
|
||
|
||
Only source files that have been loaded into extended memory with
|
||
LDR.EXE are available with the FILE command.
|
||
|
||
Example :
|
||
|
||
FILE MAIN.C
|
||
|
||
If MAIN.C had been loaded with LDR.EXE, this command brings it up
|
||
in the code window starting with line 1.
|
||
|
||
Search current source file for string
|
||
|
||
Syntax :
|
||
|
||
SS [line-number] [' string']
|
||
|
||
Line-number :
|
||
a decimal number
|
||
String :
|
||
a character string surrounded by quotes. The quotes can be
|
||
either single quotes or double quotes.
|
||
|
||
Comments :
|
||
|
||
The SS command searches the current source file for the specified
|
||
character string. If there is a match, the line that the string
|
||
was located in will be displayed as the top line in the code
|
||
window.
|
||
|
||
The search starts at the specified line number. If no line number
|
||
is specified the search starts at the top line displayed in the
|
||
code window.
|
||
|
||
If no parameters are specified, the search continues for the
|
||
previously specified string.
|
||
|
||
Note :
|
||
|
||
The code window must be visible and in source mode before using
|
||
the SS command.
|
||
|
||
Example :
|
||
|
||
SS 1 'if (i = = 3)'
|
||
|
||
The current source file is searched starting at line 1 for the
|
||
string 'if (i = = 3)'. The line containing the next occurrence of
|
||
the string becomes the top line displayed in the code window.
|
||
CHAPTER 6 - Soft-ICE Initialization Options
|
||
|
||
06.01 Introduction
|
||
06.02 Loading Soft-ICE from the DOS Prompt
|
||
06.03 Loading Soft-ICE as a Loadable Device Driver
|
||
06.03.01 Soft-ICE Loading Switches
|
||
06.04 The Soft-ICE Initialization File S-ICE.DAT
|
||
06.04.01 Special Configuration Options
|
||
06.04.02 Function Key Assignments
|
||
06.04.03 Initialization Command Sequence
|
||
|
||
06.01 Introduction
|
||
|
||
The Soft-ICE program file (S-ICE.EXE) can be loaded as a loadable
|
||
device driver in CONFIG.SYS or as a program from the DOS command line.
|
||
To get the full power of Soft-ICE, it must be initially loaded as a
|
||
device driver in CONFIG.SYS. However, there may be circumstances when
|
||
you might want to run Soft-ICE from the DOS prompt or a batch file,
|
||
such as:
|
||
|
||
* You do not have extended memory in your system Soft-ICE can only
|
||
load as a loadable device driver if you have extended memory.
|
||
|
||
* You want to take up ZERO bytes of conventional memory. When
|
||
loaded as a device driver, Soft-ICE occupies approximately 2K of
|
||
conventional memory.
|
||
|
||
* You only need to use Soft-ICE occasionally and there are no other
|
||
programs using extended memory. In some cases you may need some
|
||
of the features that require Soft-ICE to be loaded in CONFIG.SYS
|
||
but do not want Soft-ICE to be resident all of the time. In this
|
||
case Soft-ICE can be loaded in CONFIG.SYS to reserve extended
|
||
memory, and then disabled, by using the /UN switch, until Soft-
|
||
ICE is required. See section 6.3.1 for more information about the
|
||
/UN switch.
|
||
|
||
06.02 Loading Soft-ICE from the DOS Prompt
|
||
|
||
You can NOT enable all of Soft-ICE's features when loading from the
|
||
DOS prompt. If you will be using Soft-ICE as a stand-alone debugger,
|
||
it is recommended you load Soft-ICE in the CONFIG.SYS file.
|
||
|
||
To load Soft-ICE from the DOS prompt type:
|
||
|
||
S-ICE
|
||
|
||
In systems with no extended memory present, Soft-ICE loads itself at
|
||
the highest memory location possible. The memory used by Soft-ICE is
|
||
then 'mapped out', making it invisible to DOS programs. Since the
|
||
total memory visible to DOS and its programs is less after Soft-ICE
|
||
loads, it is recommended that you load Soft-ICE before any TSR's
|
||
control programs.
|
||
|
||
In systems with extended memory, you should only load Soft-ICE from
|
||
the DOS prompt if you are not using extended memory for anything else
|
||
(e.g., VDISK, CACHE, HIMEM...). When you initially load Soft-ICE from
|
||
the command line or from a batch file, Soft-ICE will prompt you with a
|
||
warning message. This warning message is just to remind you that
|
||
Soft-ICE will overwrite the highest portion of extended memory when it
|
||
loads. You can suppress this warning prompt with the EXTENDED option
|
||
in the Soft-ICE configuration file S-ICE.DAT. For more information
|
||
about the EXTENDED option, see section 6.4.1.
|
||
|
||
06.03 Loading Soft-ICE as a Loadable Device Driver
|
||
|
||
In order to use all of the Soft-ICE features, you must first load
|
||
Soft-ICE as a loadable device driver in your CONFIG.SYS file. The
|
||
features this makes possible are:
|
||
|
||
* Coexisting with other software that uses extended memory. Loading
|
||
as a device driver allows Soft-ICE to manage extended memory so
|
||
you can run Soft-ICE with programs that use extended memory, such
|
||
VDISK, CACHE and HIMEM.
|
||
|
||
* Symbolic and source level debugging Loading as a device driver
|
||
allows Soft-ICE to allocate an extended memory buffer for symbols
|
||
and source information.
|
||
|
||
* Back trace ranges and the SNAP command Loading as a device driver
|
||
allows Soft-ICE to allocate an extended memory buffer for a back
|
||
trace buffer. This buffer is also used for the Soft-ICE SNAP
|
||
command.
|
||
|
||
* Enabling Soft-ICE's EMM 4.0 capability
|
||
|
||
* Running Soft-ICE with MagicCV or MagicCVW
|
||
|
||
Note : When loaded as a device driver in CONFIG.SYS, Soft-ICE
|
||
allocates the highest portion of extended memory for itself and its
|
||
associated components, so there can be no memory conflicts. S-ICE.EXE
|
||
must be loaded in CONFIG.SYS before any other driver that allocates
|
||
extended memory loaded (e.g., VDISK.SYS, RAMDRIVE.SYS). Generally
|
||
Soft-ICE works best if it is the first loadable device driver
|
||
installed in CONFIG.SYS.
|
||
|
||
06.03.01 Soft-ICE Loading Switches
|
||
|
||
One or more loading switches can follow S-ICE.EXE in CONFIG.SYS. These
|
||
switches allow you to customize the way extended memory will be
|
||
reserved by Soft-ICE. The switches all must begin with a / character.
|
||
The loading switches are:
|
||
|
||
* /EXT XXXX: Informs S-ICE.EXE to reserve XXXX Kilobytes of
|
||
extended memory for other DOS programs that use extended memory
|
||
(e.g., VDISK, CACHE, HIMEM,...). If the /EXT switch is not
|
||
present, then any extended memory not used by Soft-ICE and its
|
||
associated components will be left as standard extended memory,
|
||
but the amount can not be guaranteed. The /EXT switch is useful
|
||
because it is sometimes difficult to determine exactly how much
|
||
memory being used by Soft-ICE and its associated components.
|
||
Using the /EXT switch will guarantee a specified amount is
|
||
available for other programs that use extended memory.
|
||
|
||
* /SYM XXXX: Informs S-ICE.EXE to reserve XXXX Kilobytes of
|
||
extended memory for symbols and source usage. If XXXX is not
|
||
specified, then all remaining extended memory is used for
|
||
symbols. Enough memory must be allocated for your .SYM file and
|
||
all source files. For more information about using symbols and
|
||
source, see chapter 7.
|
||
|
||
* /TRA XXXX: Informs S-ICE.EXE to reserve XXXX Kilobytes of
|
||
extended memory for a back trace history buffer. This buffer is
|
||
used for back trace ranges and for the SNAP command. If XXXX is
|
||
not specified, then 10K of extended memory is automatically
|
||
reserved for the buffer. If you do not want any memory reserved
|
||
for a back trace buffer, use /TRA 0. For more information about
|
||
using back trace ranges, see chapter 9.
|
||
|
||
* /MCV XXX: Informs S-ICE.EXE to reserve XXX Kilobytes of extended
|
||
memory for MagicCV or MagicCVW. The minimum amount of extended
|
||
memory you can specify is 280K and the maximum is 620K. If XXX is
|
||
not specified, S-ICE.EXE will reserve the remaining memory,
|
||
between 280K and 620K. See chapter 10 for more information about
|
||
running Soft-ICE with MagicCV or MagicCVW.
|
||
|
||
* /EMM XXXX: Informs S-ICE.EXE to turn XXXX Kilobytes of extended
|
||
memory into EMM 4.0 conforming expanded memory. If XXXX is
|
||
specified, then all remaining memory is used as expanded. See
|
||
chapter 8 for more information about expanded memory support.
|
||
|
||
* /UN: Informs S-ICE.EXE to enter protected mode, reserve any
|
||
needed extended memory, then exit protected mode and unload
|
||
itself. This switch should be used when you are loading S-ICE.EXE
|
||
as a loadable device driver, but you don't want your system to
|
||
remain in protected mode. This switch will reserve memory for
|
||
Soft-ICE, and you must execute S-ICE.EXE from the DOS prompt when
|
||
you are ready to use Soft-ICE.
|
||
|
||
Soft-ICE reserves extended memory in the following order, regardless
|
||
of the order the switches are specified:
|
||
|
||
* Reserve approximately 120K for S-ICE.EXE.
|
||
* Reserve memory for the /EXT switch if present.
|
||
* Reserve memory for the /SYM switch if present.
|
||
* Reserve memory for the /TRA switch if present. If it is not
|
||
present, default to reserve 10K for the back trace buffer.
|
||
* Reserve memory for the /MCV switch if present.
|
||
* Reserve memory for the /EMM switch if present.
|
||
|
||
If available memory runs out while trying to reserve memory for a
|
||
switch in the above sequence, then S-ICE.EXE does the following:
|
||
|
||
1. The remaining extended memory is allocated to switch being
|
||
processed when memory runs out.
|
||
|
||
2. No memory will be reserved for the remaining switches.
|
||
|
||
Note : If the /MCV or /EMM switch is present, a additional 64K of
|
||
extended memory is reserved for a DMA holding buffer.
|
||
|
||
The switches can be placed in any order following DEVICE = S-ICE.EXE.
|
||
example is:
|
||
|
||
DEVICE = S-ICE.EXE /TRA50 /EMM 500 /SYM 2048
|
||
|
||
If four megabytes of extended memory are available, this example will
|
||
reserve approximately 120K for Soft-ICE, 2 megabytes for symbols, 50K
|
||
for a back trace history buffer, 500K for expanded memory and leave
|
||
approximately 1.3 megabytes for other extended memory programs. Note
|
||
that Soft-ICE will load into the highest portion of extended memory,
|
||
leaving the remaining memory starting at 100000H (one megabyte mark).
|
||
|
||
06.04 The Soft-ICE Initialization File S-ICE.DAT
|
||
|
||
Soft-ICE has several load options. These options are specified by
|
||
placing special commands in an initialization file named S-ICE.DAT.
|
||
|
||
S-ICE.DAT is an ASCII text file that Soft-ICE parses at load time.
|
||
This file can contain function key assignment an auto-start string and
|
||
various configuration options. The file can be created and edited with
|
||
any DOS text editor. When loading Soft-ICE from the command line,
|
||
S-ICE.DAT must be placed in the current directory or in a directory
|
||
that is accessible through your current PATH. When Soft-ICE is loaded
|
||
as a device driver in CONFIG.SYS, S-ICE.DAT must be in the same
|
||
directory where S-ICE.EXE is located.
|
||
|
||
There are three categories of commands that can be included in the
|
||
S-ICE.DAT initialization file:
|
||
|
||
* Special configuration options
|
||
* Function key assignments
|
||
* Initialization command sequence
|
||
|
||
06.04.01 Special Configuration Options
|
||
|
||
Any of the following configuration options that are needed should each
|
||
be placed on a separate line in the S-ICE.DAT file.
|
||
|
||
* COMPAQ: Compaq 386 and 386SX computer and some Compaq compatible
|
||
computers (including computers containing Micronix motherboards)
|
||
have 384K of non-contiguous extended memory. The COMPAQ option is
|
||
necessary if you want Soft-ICE to use this memory. Note that the
|
||
COMPAQ option is the same as the /C command line parameter in
|
||
Soft-ICE 1.X.
|
||
|
||
* NOLEDS: The NOLEDS option tells Soft-ICE not to set and clear the
|
||
keyboard LEDs while the Soft-ICE window is up. On some keyboards
|
||
the are timing problems that will cause Soft-ICE to lose
|
||
synchronization with the keyboard. If Soft-ICE hangs when you are
|
||
in the Soft-ICE window use this option. Note that the NOLEDS
|
||
option is the same as the /L command line parameter in Soft-ICE
|
||
1.X.
|
||
|
||
* NOTVGA: The NOTVGA option allows Soft-ICE to run on BIOS
|
||
compatible VGA cards. Many VGA cards are not compatible with IBM
|
||
VGA at the hardware level. These cards support VGA at the BIOS
|
||
level only. Use this switch if you have one of those video
|
||
adapters. Note that the NOTVGA option is the same as the /V
|
||
command line parameter in Soft-ICE 1.X.
|
||
|
||
* EXTENDED: The EXTENDED option causes Soft-ICE to load directly
|
||
into extended memory without prompting the user with a warning
|
||
message. It should be used if you are loading Soft-ICE initially
|
||
from the DOS prompt and do want to be prompted, and you know
|
||
nothing else using extended memory. Note that the EXTENDED option
|
||
is the same as the /E command line parameter in Soft-ICE 1.X.
|
||
|
||
06.04.02 Function Key Assignments
|
||
|
||
One or more Soft-ICE commands can be assigned to any function key at
|
||
load time. See the description of the FKEY command in section 5.8
|
||
(Debugger Customization Commands) for a description of assigning
|
||
function keys from the Soft-ICE command line.
|
||
|
||
The syntax for assigning a function key name in S-ICE.DAT is :
|
||
|
||
Function-key-name = "string"
|
||
|
||
Function-key-name : F1, F2... F12.
|
||
|
||
String : The string may consist of any valid Soft-ICE commands and the
|
||
special characters ^ and ;. A ^ is placed in the string to make a
|
||
command invisible. A ; is placed in the string denote a carriage
|
||
return. The string must be enclosed in double quotes.
|
||
|
||
An example function key assignment in S-ICE.DAT is:
|
||
|
||
F12 = "D 100;"
|
||
|
||
This will assign the Soft-ICE dump command to function key 12. When
|
||
F12 is pressed Soft-ICE will dump at offset 100H in the current data
|
||
segment. The semi-colon following the 100 represents the ENTER key.
|
||
|
||
06.04.03 Initialization Command Sequence
|
||
|
||
A sequence of commands can be automatically executed when Soft-ICE
|
||
loads. This is useful for customizing Soft-ICE to meet your needs. For
|
||
example, you might set up windows and change the default hot key
|
||
sequence. The syntax for setting up an initialization command sequence
|
||
in S-ICE.DAT is:
|
||
|
||
INIT = "assignment-string"
|
||
|
||
Assignment string : The string consists of any valid SoftICE cmd and
|
||
the special characters ^ and ;. A ^ is placed in the string to make a
|
||
command invisible. A; is placed in the string denote a carriage
|
||
return. The string must be enclosed in double quotes.
|
||
|
||
An example initialization command sequence in S-ICE.DAT is:
|
||
|
||
INIT = "WIN; WR; WD 1; WC 12; ALTKEY CTRL X;"
|
||
|
||
This example will put the Soft-ICE window in full screen mode, create
|
||
a register window, create a data window one line long, create a code
|
||
window 12 lines long, and change the hot key sequence to CTRL X.
|
||
|
||
Sample S-ICE.DAT : A sample S-ICE.DAT initialization file is included
|
||
on the distribution diskette. This sample assigns the function keys so
|
||
they are used in a similar manner as the function keys in Microsoft's
|
||
CodeView debugger. This sample S-ICE.DAT should also be used as is for
|
||
the tutorial in chapter 3.
|
||
CHAPTER 7 - Symbolic and Source Level Debugging
|
||
|
||
07.01 Introduction
|
||
07.02 Preparing for Symbolic or Source Debugging
|
||
07.02.01 Preparing for Symbolic Debugging Only
|
||
07.02.02 Preparing for Symbolic and Source Level Debugging
|
||
07.03 Reserving Memory for Symbols and Source Files
|
||
07.04 Loading Programs and Symbol Files
|
||
07.04.01 Loading Program, Symbols and Source
|
||
07.04.02 Loading Only Symbols and Source Files
|
||
07.04.03 Loading a Program With No Symbols or Source
|
||
07.05 Debugging With Symbols
|
||
07.06 Debugging With Source
|
||
07.06.01 Using Line Numbers
|
||
07.06.02 Using Source Mode in the Code Window
|
||
|
||
07.01 Introduction
|
||
|
||
Soft-ICE can load programs, symbol tables and source files for
|
||
enhanced debugging. Symbolic debugging allows you to set break points
|
||
and reference variables with symbol names rather than specifying
|
||
numeric addresses. Source level debugging allows you to step through
|
||
your program at the source code level rather than assembly code level.
|
||
|
||
Symbol and source line number information is extracted from the link
|
||
map file. The link map must be compatible with Microsoft's linker
|
||
version 3.60 or greater.
|
||
|
||
Symbols and source files reside in extended memory. You must have
|
||
sufficient extended memory for the symbols and source files. Source
|
||
files are not paged from the disk as in many debuggers. This allows
|
||
Soft-ICE to provide complete system debugging in source level, You can
|
||
debug T&SR's interrupt routines and other systems level code at the
|
||
source level.
|
||
|
||
Note : You cannot use symbolic or source level debugging unless
|
||
Soft-ICE has been loaded as a device driver in CONFIG.SYS.
|
||
|
||
07.02 Preparing for Symbolic or Source Debugging
|
||
|
||
Before debugging a program with symbols or source you must create a
|
||
symbol file. This is a binary file that contains symbol and line
|
||
number information in a format that Soft-ICE can understand. This file
|
||
is created with the utility MSYM.EXE. MSYM.EXE reads in your link map
|
||
to create a symbol file with the extension (.SYM).
|
||
|
||
07.02.01 Preparing for Symbolic Debugging Only
|
||
|
||
To prepare a program for symbolic debugging only, you must do the
|
||
following steps:
|
||
|
||
1. Compile or assemble your program.
|
||
|
||
2. Link your program with the proper switches to create a .MAP file
|
||
that contains a list of public symbols. If you are using Microsoft's
|
||
linker, the /MA switch is the proper switch to use. This .MAP file
|
||
must be identical to the .MAP file produced by Microsoft's linker,
|
||
version 3.60 or greater.
|
||
|
||
3. Create a.SYM file by running MSYM.EXE. The syntax for using
|
||
MSYM.EXE is:
|
||
|
||
MSYM program-name [.extension]
|
||
|
||
If the extension is not supplied MSYM assumes the extension is .MAP.
|
||
MSYM reads in a map file as in and writes out a symbol file as output.
|
||
The symbol has the name program-name.SYM.
|
||
|
||
Note : Before compiling or assembling your program you may want to
|
||
make some additional symbols public. Only public symbols are supported
|
||
with Soft-ICE symbolic debugging. The way to make a variable or a
|
||
label public varies, depending upon which language you are using.
|
||
|
||
In 8086 assembly language, simply use the PUBLIC directive followed by
|
||
the locally defined symbols you wish to make public. For example:
|
||
|
||
PUBLIC FOO, LOOP1, STATUS
|
||
|
||
In C language, all procedure names and static variables are defined
|
||
outside a block are public.
|
||
|
||
For other languages, refer to your language manual for details.
|
||
|
||
07.02.02 Preparing for Symbolic and Source Level Debugging
|
||
|
||
To prepare a program for both symbolic and source debugging, you must
|
||
do the following steps:
|
||
|
||
1. Compile or assemble each module that you wish debug at the source
|
||
level with the appropriate switch to put line number information into
|
||
the object files. With Microsoft languages you can use either the /Zi
|
||
or the /Zd switches. You may not want to do this with all files,
|
||
because the combined file sizes of the symbol file and all the source
|
||
files compiled with these switches must fit into the amount of
|
||
extended memory you have reserved with the /SYM loading switch in
|
||
CONFIG.SYS.
|
||
|
||
2. Link your program with the proper switches to create a .MAP file
|
||
that contains source line numbers and a list of public symbols. If you
|
||
are using Microsoft's linker, the /LI and /MA switches are the proper
|
||
switches to use. This .MAP file must be identical to the.MAP file
|
||
produced by Microsoft's linker, version 3.60 or greater.
|
||
|
||
3. Create a.SYM file by running MSYM.EXE. The syntax for using
|
||
MSYM.EXE is :
|
||
|
||
MSYM program-name [.extension]
|
||
|
||
If the extension is not supplied MSYM assumes the extension is.MAP.
|
||
MSYM reads in a map file as input and writes out a symbol file as
|
||
output. The symbol file has the name program-name.SYM.
|
||
|
||
07.03 Reserving Memory for Symbols and Source Files
|
||
|
||
Before loading programs, symbol files and source files you must
|
||
reserve extended memory for them. Extended memory is reserved when you
|
||
load Soft- ICE in CONFIG.SYS. Before reserving extended memory you may
|
||
want to add up the file sizes of the .SYM file and all of the source
|
||
files that you want to load. You must reserve at least this much
|
||
extended memory. You must use the
|
||
|
||
/SYM loading switch when loading S-ICE.EXE. A sample line in
|
||
CONFIG.SYS for loading Soft-ICE and reserving space for symbols and
|
||
source files is:
|
||
|
||
DEVICE = S-ICE.EXE /SYM 1024
|
||
|
||
This example loads Soft-ICE into extended memory and reserves 1
|
||
megabyte of memory for symbols and source files. See section 6.3
|
||
(Loading Soft-ICE as a Loadable Device Driver) for more details on
|
||
reserving memory.
|
||
|
||
07.04 Loading Programs and Symbol Files
|
||
|
||
The Soft-ICE utility LDR.EXE is used for loading programs, symbol
|
||
files and source files. For symbolically debugging application
|
||
programs and T&SR programs you will typically use LDR.EXE to load the
|
||
program, symbols and source files in one step. For debugging loadable
|
||
device drivers, ROMs and other system components you will typically
|
||
use LDR.EXE to load the symbol file and source files only. The syntax
|
||
for LDR.EXE is :
|
||
|
||
LDR program-name | program-name.SYM | program-name.extension
|
||
|
||
07.04.01 Loading Program, Symbols and Source
|
||
|
||
To load your program, symbols and source files in one step, you must
|
||
use LDR.EXE in the form:
|
||
|
||
LDR program-name
|
||
|
||
Notice that program-name does not have a file extension. If no file
|
||
extension is supplied, then LDR.EXE will do the following:
|
||
|
||
1. Load program-name.SYM into extended memory
|
||
|
||
2. Load source files into extended memory. This step is done only if
|
||
source records exist in the .SYM file.
|
||
|
||
3. Load program-name.EXE into memory at the location it would have
|
||
loaded if it had been loaded directly from the DOS prompt.
|
||
|
||
4. Bring up Soft-ICE with the instruction pointer at first instruction
|
||
of your program. If it is a C program and source is loaded for the
|
||
file containing , _MAIN, then the source for that file will be visible
|
||
in the code window.
|
||
|
||
07.04.02 Loading Only Symbols and Source Files
|
||
|
||
If you wish to load only symbols and source files (for debugging a
|
||
loadable device driver for example) you must use LDR.EXE in the form:
|
||
|
||
LDR program-name.SYM
|
||
|
||
Notice that the.SYM extension is specified. This will load the .SYM
|
||
file and source files into extended memory. When symbols are loaded by
|
||
this method your program or device driver symbols are assumed to be
|
||
referenced from 0:0. Since this is rarely the case you will need to
|
||
use the Soft-ICE command SYMLOC to locate the symbols. See the
|
||
description of the SYMLOC command in section 5.10 for a complete
|
||
description. An example of loading a symbol file called DRIVER.SYM is:
|
||
|
||
LDR DRIVER.SYM
|
||
|
||
07.04.03 Loading a Program With No Symbols or Source
|
||
|
||
To load a program file without loading the associated symbol file you
|
||
must use LDR.EXE in the form:
|
||
|
||
LDR program-name.extension
|
||
|
||
Notice that the file extension is present. Typically the file
|
||
extension will be.EXE or.COM. When a file extension specified LDR.EXE
|
||
will load the program and bring up Soft-ICE with the instruction
|
||
pointer at the first instruction of the program. An example of loading
|
||
a program with symbols and source is:
|
||
|
||
LDR TEST.EXE
|
||
|
||
Notes : LDR.EXE saves a copy of the interrupt vector table
|
||
automatically when it loads your program. This is equivalent to doing
|
||
a VECS S command. If you are going to exit your program before it runs
|
||
to completion, you can do an EXIT R to exit the program and restore
|
||
the interrupt vector table.
|
||
|
||
Using LDR.EXE to load only the program-name.EXE is often useful for
|
||
restarting your program while in the middle of a source level
|
||
debugging session. To restart, the EXIT R command to abort the current
|
||
session. Then use LDR.EXE to reload your.EXE file. The symbols: source
|
||
do not have to be loaded since they remain in extended memory.
|
||
|
||
If LDR.EXE gives you the message "Out of space loading symbol
|
||
information", this means that you did not reserve enough extended
|
||
memory with the /SYM loading switch in CONFIG.SYS.
|
||
|
||
If LDR.EXE does not find your source files on the same directory as
|
||
the program you are loading, LDR.EXE will prompt you for the path
|
||
names where it can find the source files. If you have source files on
|
||
several directories or are loading a program frequently this becomes
|
||
cumbersome. You can eliminate the need for prompting by using the DOS
|
||
environment variable SRC. LDR.EXE uses this environment variable to
|
||
find source files before prompting the user. The syntax for setting
|
||
the environment variable from the DOS prompt is:
|
||
|
||
SET SRC = directory;directory;...;directory
|
||
|
||
Each of the specified directories will be searched before the user is
|
||
prompted.
|
||
|
||
Limitations : Soft-ICE supports symbols for only one program at a
|
||
time. If you load a new .SYM file, the existing one is overwritten.
|
||
Soft-ICE does not follow overlays or Microsoft Windows segment
|
||
movement. Soft-ICE recognizes public symbols and line numbers only. It
|
||
does not support local variables.
|
||
|
||
07.05 Debugging With Symbols
|
||
|
||
After you have loaded your program and.SYM file you can begin
|
||
debugging your program symbolically. In general a symbol can be used
|
||
in any command in place of an address.
|
||
|
||
Symbols are also used by several Soft-ICE commands when addresses are
|
||
displayed. For example, the U command displays symbol names of labels
|
||
and procedures as it encounters them. There are two commands that are
|
||
helpful when you are symbolically debugging:
|
||
|
||
SYM: Use the SYM command to get a listing of symbol names and values,
|
||
or to change the value a symbol.
|
||
|
||
SYMLOC: Use the SYMLOC command to relocate the base of all of your
|
||
symbols. You would need to use the SYMLOC command when:
|
||
|
||
1. Loading symbols for a loadable device driver
|
||
|
||
2. Loading symbols for a T&SR that has already been loaded
|
||
|
||
3. Your program moves itself to a location other than it original
|
||
location.
|
||
|
||
See section 5. 10 for a complete description of these commands.
|
||
|
||
07.06 Debugging With Source
|
||
|
||
When source files are loaded, Soft-ICE allows you to view and step
|
||
through your source code as you are debugging. Soft-ICE offers two
|
||
different modes of source level debugging: mixed mode and source mode.
|
||
Use the SRC command to switch between modes.
|
||
|
||
Mixed mode shows source lines and the assembly language produced by
|
||
those source lines intermixed on the display. Mixed mode is useful
|
||
when you must debug at the assembly level, but use the source lines
|
||
for reference. Mixed mode is allowed whether the code window visible
|
||
or not.
|
||
|
||
Source mode strictly shows source lines on the display. Source level
|
||
debugging requires the code window to be visible.
|
||
|
||
07.06.01 Using Line Numbers
|
||
|
||
Line numbers can be used in place of addresses in several commands. To
|
||
differentiate a line number from an actual address, place a . (period)
|
||
in front of the number. For example, to set an execution break point
|
||
at source line 45 type:
|
||
|
||
BPX .450
|
||
|
||
07.06.02 Using Source Mode in the Code Window
|
||
|
||
The code window must be visible to enter source mode. If not visible,
|
||
use the WC command to make it visible. Once you are in source mode you
|
||
can use Soft-ICE commands switch to a different source file, view
|
||
source at any location in the file, scroll through the file, search
|
||
for strings in the file, and set break points in the file. For a
|
||
complete description of the following commands see their command
|
||
descriptions in chapters 4 and 5. The following list is a brief
|
||
overview of commands that are useful when debugging source code:
|
||
|
||
Make the code window visible (if it is not already) with WC command.
|
||
|
||
Toggle between source, mixed, and code modes with the SRC command.
|
||
|
||
Place a source file in the code window with the FILE command. For
|
||
example change from the current file to file MAIN.C enter:
|
||
|
||
FILE MAIN.C
|
||
|
||
Display source at a specific location within the source file with the
|
||
U command. To change the view to a specific line number or memory
|
||
address use the U command. You can specify actual addresses or line
|
||
numbers as a parameter to the command. For example, to view source in
|
||
the code window starting at source line 450 enter:
|
||
|
||
U .450
|
||
|
||
Locate the current instruction in the code window with the . (period)
|
||
command.
|
||
|
||
Search for a specific character string with the S command. For
|
||
example, to search for the string "Hello World" starting at line 100
|
||
in the current source file enter:
|
||
|
||
SS 100 "Hello World"
|
||
|
||
Move the cursor to the code window (if it is not) with the EC command.
|
||
|
||
Scroll the source with the keys up, down, PaqeUp, PageDn.
|
||
|
||
Set point-and-shoot break points with the BPX command. Simply place
|
||
the cursor on the source line that you wish to break on, then enter:
|
||
|
||
BPX
|
||
CHAPTER 8 - Expanded Memory Support
|
||
|
||
08.01 Introduction
|
||
08.02 Configuring the EMM Environment
|
||
08.02.01 Default EMM Pages
|
||
08.02.02 Customizing the EMM Page Map
|
||
08.02.02.01 Including and Excluding Areas from EMM
|
||
08.03 Other EMM Features
|
||
08.03.01 Increasing Conventional Memory
|
||
08.03.02 Automatic Page Frame Locating
|
||
08.04 EMM Debugging
|
||
|
||
08.01 Introduction
|
||
|
||
Soft-ICE has an expanded memory manager built into its kernel. The
|
||
Soft- ICE expanded memory manager supports the Lotus-Intel-Microsoft
|
||
4.0 specification. This Soft-ICE feature is useful if you are using
|
||
programs that support the EMM specification, or if you must backfill
|
||
your conventional memory to extend your conventional memory to 640K or
|
||
more.
|
||
|
||
Other 386 control programs that provide EMM capability (such as QEMM
|
||
or 386-to-the-MAX) will not co-exist with Soft-ICE. If you are using
|
||
those programs for EMM capability or backfilling, you can use the
|
||
Soft-ICE EMM manager in their place.
|
||
|
||
Enabling EMM capability in Soft-ICE involves the following steps :
|
||
|
||
1. Configure the expanded memory environment with the utility
|
||
EMMSETUP.EXE. This utility modifies S-ICE.EXE with the desired EMM
|
||
page map.
|
||
|
||
2. Add the /EMM switch to your S-ICE.EXE line CONFIG.SYS. This
|
||
reserves a portion of extended memory for expanded memory. An example
|
||
line in CONFIG.SYS that reserves memory for EMM is:
|
||
|
||
DEVICE = S-ICE.EXE /EMM 2048
|
||
|
||
This will reserve 2 megabytes of extended memory for EMM use. See
|
||
section 6.3 (Loading Soft-ICE as a Loadable Device Driver) for details
|
||
of installing Soft-ICE in CONFIG.SYS.
|
||
|
||
3. Reboot your system.
|
||
|
||
08.02 Configuring The EMM Environment
|
||
|
||
Before installing S-ICE.EXE with the /EMM switch in CONFIG.SYS file,
|
||
you may have to run EMMSETUP.EXE to configure the EMM 4.0 environment.
|
||
This configuration process allows you to select which portions of
|
||
memory you would like to make available as EMM 4.0 pages. Running
|
||
EMMSETUP.EXE is highly recommended if you are using programs that take
|
||
full advantage of the EMM 4.0 specification.
|
||
|
||
08.02.01 Default EMM Pages
|
||
|
||
By default, S-ICE.EXE with the /EMM switch is pre-configured to allow
|
||
EMM 4.0 pages in the following areas:
|
||
|
||
* The lower 640K (except for the 1st 64K)
|
||
* 64K starting at DDH
|
||
|
||
You may want to reconfigure for the following reasons:
|
||
|
||
* You may have a device such as a network that I the D000H area of
|
||
memory.
|
||
* You may want to fill more holes above 640K with EMM pages. This will
|
||
increase performance and usability of programs like Microsoft Windows.
|
||
To get maximum performance from Microsoft Windows you should fill
|
||
every available page with expanded memory.
|
||
|
||
08.02.02 Customizing the EMM Page Map
|
||
|
||
To configure the EMM map you must use the utility EMMSETUP.EXE.
|
||
EMMSETUP.EXE allows the page map to be altered, then modifies
|
||
S-ICE.EXE with the changes. EMMSETUP makes its best guess on
|
||
automatically configuring the EMM map. EMMSETUP will try to fill much
|
||
of the address space as possible with mappable pages while working
|
||
around video cards and ROMS. If its guess is not good enough or not to
|
||
your liking you can override it. Overriding may be necessary if you
|
||
have a network, a special video adapter or a memory-mapped option
|
||
adapter. To configurethe EMM map enter :
|
||
|
||
EMMSETUP
|
||
|
||
EMMSETUP displays a matrix of 16K memory pages available in the lower
|
||
1 megabyte region. The matrix is divided into 16 columns each
|
||
representing 64K (from 0 to 10000H). There are 4 rows representing the
|
||
four 16K pages in each 64K region.
|
||
|
||
Each block of the matrix can contain an E, X, R or V. Blocks that
|
||
contain an E are available as EMM pages; blocks that contain an X are
|
||
not. Blocks that contain an R are memory areas that have been
|
||
identified by EMMSETUP as ROM areas. You can override these areas with
|
||
an E if desired, however, this should only be done if the ROM is never
|
||
accessed. Blocks that contain V are identified as video memory. We
|
||
have made worst case assumptions on video memory. Your particular
|
||
video card may not take up as much as we have 'guessed'. You can
|
||
override the memory blocks that contain unnecessary V's if desired.
|
||
|
||
If you are satisfied with EMMSETUP's guesses, press the F10 key and S-
|
||
ICE.EXE will be modified with these parameters. You must reboot before
|
||
any changes made to S-ICE.EXE will take effect. If you wish to
|
||
override EMMSETUP's guesses, do so at this time.
|
||
|
||
08.02.02.01 Including and Excluding Areas from EMM
|
||
|
||
To include an area as EMM 4.0 memory simply guide the cursor to the
|
||
desired block, then type E. Conversely, to exclude an area from EMM
|
||
4.0 memory, guide the cursor to the block and type X. When you are
|
||
satisfied with your changes, press F10 to exit the program. All
|
||
changes are automatically stored in the S-ICE.EXE file. If you wish to
|
||
exit without modifying S-ICE.EXE press ESC. You must reboot before any
|
||
changes made to S-ICE.EXE will take effect.
|
||
|
||
When including upper memory blocks keep in mind the following:
|
||
|
||
* CGA occupies from B800H to C000H.
|
||
* MDA occupies from B000H to B100H.
|
||
* Most Hercules cards occupy from B000 to C000H.
|
||
* EGA occupies from A000H to C000H and from C000H to C400H.
|
||
* VGA (mother board) occupies from A000H to C000H.
|
||
* VGA (option card) occupies from A000H to C000H and C000H to C800H.
|
||
* PS/2 System ROM occupies from E000H to 10000H.
|
||
* PS/2 ESDI ROM occupies from CC00H to D000H
|
||
* Most AT Compatible Roms occupy from F000H to 10000H.
|
||
* Compaq systems, Micronix motherboard systems, and most Chips and
|
||
Technologies motherboard systems move the EGA/VGA ROM to E000H.
|
||
However they still occupy the C000H region as well.
|
||
* Token Ring Networks usually occupy from CC00H to E000H.
|
||
* Many Networks occupy memory regions in the D000H area.
|
||
|
||
The above guidelines are for 'generic' devices, Many implementations
|
||
by different computer vendors and adapter card vendors will vary.
|
||
|
||
08.03 Other EMM Features
|
||
|
||
S-ICE.EXE with the /EMM switch has two features that are automatically
|
||
enabled depending on your system configuration. These features are
|
||
backfilling and relocating the page frame.
|
||
|
||
08.03.01 Increasing Conventional Memory
|
||
|
||
System memory will automatically be backfilled up to the first
|
||
non-mappable page. This means it starts looking at contiguous E's at
|
||
location 1000, and continues until it finds the first non-contiguous
|
||
E. If the contiguous E's go beyond the amount of your system's base
|
||
memory, memory will backfilled up to the first R, V, or X that is
|
||
found.
|
||
|
||
The benefit of backfilling is that you can increase the amount of
|
||
usable system memory to greater than 640K. The backfilled memory is
|
||
available within DOS. If you do not want memory backfilled, use
|
||
EMMSETUP to make page non-mappable (X) at the point you wish system
|
||
memory to end.
|
||
|
||
Note : Monochrome-only systems (MDA) can backfill up to B000H to add
|
||
an additional 64K to conventional memory CGA systems can be backfilled
|
||
up to B800, adding an additional 96K to conventional memory. EGA and
|
||
VGA systems can be backfilled only if no graphics programs will be
|
||
run. You can backfill an EGA or a VGA system up to B800:0 if no
|
||
graphics programs will be run.
|
||
|
||
Warning : If memory is backfilled,DO NOT UNLOAD Soft-ICE. Doing so
|
||
will cause your system to crash.
|
||
|
||
08.03.02 Automatic Page Frame Locating
|
||
|
||
Most EMM-knowledgeable programs require a 64K page frame that is not
|
||
used as normal DOS memory. This is normally located above the video
|
||
device area. However in some systems there is no 64K contiguous region
|
||
to place the page frame. In these instances S-ICE.EXE 'steals' top 4
|
||
mappable pages of lower memory. The net result that lower DOS memory
|
||
shrinks by 64K.
|
||
|
||
08.04 EMM Debugging
|
||
|
||
A range break point or a break point on memory that is in an EMM
|
||
mappable area will stay at that address no matter which EMM page is
|
||
mapped in.
|
||
|
||
When debugging EMM programs, the EMMMAP command may also be very
|
||
useful. See section 5.6 for more information.
|
||
|
||
The D, E, S, F, and C commands can be used to view or modify any
|
||
allocated EMM handle page. The page does not have to be currently
|
||
mapped in. The syntax of these commands is similar to that of the
|
||
commands when being used for non-EMM pages, except for the following:
|
||
|
||
* In the D, E, S, and F commands, the address portion of the command
|
||
must be specified in the following way: Hhandle# Ppage# offset where
|
||
handle is a number specifying which EMM handle to use, page is a
|
||
number specifying which EMM page to use, and offset is a number from 0
|
||
to 4000H, specifying the offset from the beginning the page. Example:
|
||
|
||
DB H1 P3 0
|
||
|
||
This command will dump bytes from page 3 of handle 1, starting at
|
||
offset 0.
|
||
|
||
* The C command must be specified in the following way:
|
||
|
||
C Hhandle# Ppage# offset1 Llength offset2
|
||
|
||
where handle and page are the same as above. offset1 is a number from
|
||
0 to 4000H, specifying the offset from the beginning of the page,
|
||
where the first data block to be compared is located. offset2 is a
|
||
number from 0 to 4000H, specifying the offset from the beginning of
|
||
the page, where the second data block to be compared is located.
|
||
Example:
|
||
|
||
C H2 P4 00 L10 1000
|
||
|
||
This command will compare the first 10 bytes of memory located at
|
||
offset 0 of page 4 of handle 2 with the first 10 bytes of memory
|
||
located at offset 1000 of page 4 of handle 2.
|
||
|
||
Note: Subsequent uses of the D, E, S, F, and C commands will continue
|
||
to use the handle and page last specified. To get back to conventional
|
||
memory, use one of the above commands with a segment specified in the
|
||
address field, for example:
|
||
|
||
D 0:0
|
||
CHAPTER 9 - Back Trace Ranges
|
||
|
||
09.01 Introduction
|
||
09.02 Using Back Trace Ranges
|
||
09.03 Special Notes
|
||
|
||
09.01 Introduction
|
||
|
||
Soft-ICE can collect instruction information in a back trace history
|
||
buffer as your program executes. These instructions can then be
|
||
displayed after a bug has occurred. This allows you to go back and
|
||
retrace a program's action to determine the actual flow of
|
||
instructions preceding a break point.
|
||
|
||
Instruction information is collected on accesses within a specified
|
||
address range, rather than system wide. The ranges can be from 1 byte
|
||
to 1 megabyte, so if desired, complete system information can be
|
||
obtained. Using specific ranges rather than collecting all
|
||
instructions is useful for two reasons:
|
||
|
||
1. The back trace history buffer is not cluttered by extraneous
|
||
information that you are not interested in. For example, you may not
|
||
be interested in interrupt activity and execution within MSDOS.
|
||
|
||
2. Back trace ranges degrade system performance while they are active.
|
||
By limiting the range to an area that you are interested in, you can
|
||
improve system performance greatly.
|
||
|
||
Soft-ICE has two methods of utilizing the instructions in the back
|
||
trace history buffer:
|
||
|
||
1. The SHOW command allows you to display instructions from the back
|
||
trace history buffer. You must specify how many instructions you wish
|
||
to go back in the buffer.
|
||
|
||
2. The TRACE command allows you to go back and replay instructions
|
||
from the back trace history buffer, This way you can see the
|
||
instruction flow within the context of the surrounding program code or
|
||
source code.
|
||
|
||
09.02 Using Back Trace Ranges
|
||
|
||
To use back trace ranges you must do the following:
|
||
|
||
1. Allocate a back trace history buffer of the desired size by
|
||
inserting the /TRA switch on the S-ICE.EXE line in CONFIG.SYS. For
|
||
example, to create a back trace buffer of 100K you might have the
|
||
following line in your CONFIG.SYS file:
|
||
|
||
DEVICE = S-ICE.EXE 100
|
||
|
||
A back trace history buffer of 10K is allocated by default. If this is
|
||
suitable for your needs you do not have to allocate a larger buffer.
|
||
The history buffer size is only limited by the amount of extended
|
||
memory available.
|
||
|
||
2. Enable back trace ranges by creating a memory range break point
|
||
with the T or TW verb. For example:
|
||
|
||
BPR 1000:0 2000:0 T
|
||
|
||
The T and TW verbs do not cause break points instead they log
|
||
instruction information that can be displayed later with the SHOW or
|
||
TRACE commands.
|
||
|
||
3. Set any other break points if desired.
|
||
|
||
4. Exit from Soft-ICE with the X command.
|
||
|
||
5. After a break point has occurred, or you have popped Soft-ICE up
|
||
with the hot key, you can display instructions in the buffer with the
|
||
SHOW command. For example, to go back 50 instructions in the buffer
|
||
and display instructions type:
|
||
|
||
SHOW 50
|
||
|
||
6. To replay a series of instructions you must first enter trace
|
||
simulation mode with the TRACE command. To begin replaying the
|
||
sequence of instructions starting back 50 in the buffer type:
|
||
|
||
TRACE 50
|
||
|
||
7. After you have entered trace simulation mode, you can trace through
|
||
the sequence of instructions by using the XT, XP, or XG commands. This
|
||
allows you to re-enact the program flow. For example, you can single
|
||
step through the sequence of instructions in the buffer, starting at
|
||
the instruction specified by the TRACE command, by typing:
|
||
|
||
XT
|
||
XT
|
||
.
|
||
.
|
||
.
|
||
XT
|
||
|
||
The XT command single steps through the back trace history buffer.
|
||
|
||
The XP command program steps through the back trace history buffer.
|
||
|
||
The XG command goes to an address in the back trace history buffer.
|
||
|
||
8. To exit from trace simulation mode type:
|
||
|
||
TRACE OFF
|
||
|
||
9. To reset the back trace history buffer, use the X command.
|
||
|
||
09.03 Special Notes
|
||
|
||
While in trace simulation mode, most Soft-ICE commands work as normal,
|
||
including displaying the memory map, and displaying and editing data.
|
||
The exceptions are:
|
||
|
||
1. Register information is not logged in the back trace history
|
||
buffer, so the register values do not change as you trace through the
|
||
buffer, except for CS and IP.
|
||
|
||
2. Commands that normally exit from Soft-ICE do not work while in
|
||
trace simulation mode. These are X, T, P, G, EXIT.
|
||
|
||
As you peruse instructions from the back trace history buffer with the
|
||
SHOW and TRACE commands, you may notice peculiarities in instruction
|
||
execution. These are caused by jumps in and out of the specified
|
||
range. These usually occur at jumps, calls, returns and entry points.
|
||
When you have a hang problem or other difficult bug that requires back
|
||
trace ranges, you must often use very large ranges in order to narrow
|
||
the scope of the problem. Once you have a better idea of the specific
|
||
problem area, you go to smaller ranges.
|
||
|
||
Large back trace ranges are often very slow. When using large ranges
|
||
you are usually trying to get a general idea where the problem is.
|
||
Soft-ICE has a special 'COARSE' mode for doing large ranges. This
|
||
speeds up the ranges a factor of three or more, but limits the amount
|
||
of instructions in the history buffer.
|
||
|
||
Coarse mode only collects instructions that do a memory write within
|
||
the specified range. As you are replaying instructions with trace
|
||
simulation mode after a 'coarse' range you will notice that the flow
|
||
skips around rather than sequentially executing instructions.
|
||
|
||
Coarse ranges work best for large ranges and tend to be less effective
|
||
for small ranges.
|
||
|
||
To enable a 'coarse' back trace range, use the BPR command with the TW
|
||
verb instead of the T verb. For example:
|
||
|
||
BPR 1000:0 2000:0 TW
|
||
|
||
For further information on back trace ranges see the command
|
||
descriptions for : SHOW, TRACE, XT, XP, XG, XRSET, BPR
|
||
CHAPTER 10 - Using Soft-ICE with MagicCV or MagicCVW
|
||
|
||
10.01 Introduction
|
||
10.02 Running Soft-ICE with MagicCV or MagicCVW
|
||
10.03 Special Considerations
|
||
10.04 The Soft-ICE ACTION command
|
||
|
||
10.01 Introduction
|
||
|
||
MagicCV allows you to run Microsoft's CodeView in less than 8K of
|
||
conventional memory on your 80386 machine.
|
||
|
||
MagicCVW allows you to run Microsoft's CodeView for Windows in less
|
||
than 8K of conventional memory on your 80386 machine.
|
||
|
||
Using Soft-ICE in combination with MagicCV or MagicCVW allows you to
|
||
have the power of Soft-ICE while still having the convenience of using
|
||
the CodeView product that you are familiar with.
|
||
|
||
In the rest of this chapter, statements about MCV will apply to both
|
||
MagicCV and MagicCVW, and statements about CV will apply to both
|
||
CodeView and CodeView for Windows.
|
||
|
||
10.02 Running Soft-ICE with MagicCV or MagicCVW
|
||
|
||
To use Soft-ICE 2.0 and MCV together, you must install S-ICE.EXE as a
|
||
loadable device driver. S-ICE.EXE comes on the Soft-ICE diskette. S-
|
||
ICE.EXE replaces NUMEGA.SYS in CONFIG.SYS. Use the /MCV, /EMM, and the
|
||
/EXT switches as if using MagicCV or MagicCVW alone. There are
|
||
additional switches that you may want to use for Soft-ICE. Refer to
|
||
chapter 6 for information about these switches.
|
||
|
||
To run MagicCV or MagicCVW after Soft-ICE has been loaded, refer to
|
||
your MagicCV or MagicCVW manual.
|
||
|
||
Notes : MagicCVW requires Soft-ICE version 2.00 or greater. MagicCV
|
||
requires Soft-ICE version 1.02 or greater. The S-ICE.SYS and
|
||
NUMEGA.SYS drivers were shipped with some versions of Soft-ICE. The
|
||
S-ICE and NUMEGA drivers must be replaced by S-ICE.EXE before you can
|
||
run MagicCV and Soft- ICE 2.0 together.
|
||
|
||
10.03 Special Considerations
|
||
|
||
Two Virtual Machines : When you are using both Soft-ICE and MCV
|
||
together, you must keep in mind that CV is in a separate virtual
|
||
machine from the target environment. You can pop Soft-ICE up from
|
||
either virtual machine, i.e., when CV is running, or when the target
|
||
program is running.
|
||
|
||
If you pop Soft-ICE up while the target program is running everything
|
||
works as defined in the Soft-ICE manual. If you pop Soft-ICE up while
|
||
CV is running (typically done to break points), you must keep a few
|
||
points in mind:
|
||
|
||
* The registers are those of CV and they CAN NOT be changed.
|
||
* For convenience, the Soft-ICE MAP command displays the memory map of
|
||
the target program virtual machine, not the memory map of the CV
|
||
virtual machine. The highlighted area in the memory map may not be
|
||
correct.
|
||
* Any display or modification of memory occurs in the target program's
|
||
virtual machine.
|
||
* You have no visibility into the CV virtual machine except for the
|
||
display of register values. Remember that when popping up the Soft-ICE
|
||
window while CV is active, the register values are those of CV and
|
||
should not be modified.
|
||
* Instruction and program tracing is disabled from the Soft-ICE window
|
||
when CV is active. This is to prevent confusion, because a trace would
|
||
actually step through CV, not through the target program. If you
|
||
attempt to do a Soft-ICE Trace (T) or Program Step (P) command while
|
||
CV is active, you will get the warning message: "Function not
|
||
available in CV virtual machine." To trace through your target program
|
||
code instead, you can do one of two options:
|
||
* Use the CV trace command. To do this, exit the Soft-ICE window using
|
||
the Soft-ICE X command, then do one or more CV traces to step through
|
||
the target program.
|
||
* Use Soft-ICE to go to the target program address, then use the
|
||
Soft-ICE T or P commands to step through your target program. To do
|
||
this, exit the Soft-ICE window with the Soft-ICE X command, then press
|
||
the 'F3' key until CV is in 'mixed mode'. This allows you to see both
|
||
the source lines and the instruction addresses. Pop up Soft-ICE. If
|
||
the Soft-ICE window is not already in narrow mode, use the Soft-ICE
|
||
WIN command to change the window size. Move the Soft-ICE window so you
|
||
can see the instruction addresses on the left side of the screen. Now
|
||
you can use the Soft-ICE G command to go to one of the addresses. Be
|
||
sure to type in the full address, including the segment and the
|
||
offset. Then enter 'G' in the CV window. At this point, CV is not
|
||
active, so you can use the Soft-ICE T or P commands to step through t
|
||
target program.
|
||
|
||
CodeView's SHELL command : If you run the DOS shell from within the
|
||
CodeView virtual machine, the DOS shell is part of the virtual
|
||
machine. Because of this, you should not run any TSRs when you are in
|
||
the DOS shell. If you do, when you exit CodeView the TSRs will
|
||
disappear along with the virtual machine. This is dangerous, because
|
||
any interrupt vectors that were not restored could hang your machine.
|
||
|
||
CV's /R switch :Soft-ICE takes advantage of many of the 80386 features
|
||
including the 80386 debug registers. This means that the debug
|
||
registers are not available for CV, so you cannot use the CV /R switch
|
||
when running with Soft-ICE. If you do use the /R switch, Soft-ICE
|
||
gives you a general protection error. At this point, you can press "C"
|
||
to continue, then rerun CV without the /R switch, and use the Soft-ICE
|
||
break points. The CV /R switch works when you are running MCV without
|
||
Soft-ICE.
|
||
|
||
10.04 The Soft-ICE ACTION Command
|
||
|
||
The ACTION command allows three different methods activating CV from a
|
||
Soft-ICE break point. The best choice of action is ACTION NMI. If you
|
||
experience any problems with ACTION set to NMI (usually because an
|
||
adapter card in your system is using NMI), use ACTION INT1.
|
||
CHAPTER 11 - Advanced Features
|
||
|
||
11.01 Using Soft-ICE with other Debuggers
|
||
11.01.01 Debuggers that Use DOS
|
||
11.01.02 ACTION Command with other Debuggers
|
||
11.01.03 Special Considerations
|
||
11.01.04 Using Soft-ICE with CODEVIEW
|
||
11.01.05 Debuggers that Use 80386 Break Point Registers
|
||
11.02 User-Qualified Break Points
|
||
11.02.01 Example of a User-Qualified Break Point
|
||
11.03 The Window in Graphics Mode
|
||
11.04 Expanded Memory Debugging Features
|
||
11.05 Extended Memory Debugging Features
|
||
|
||
11.01 Using Soft-ICE with other Debuggers
|
||
|
||
Soft-ICE was designed to work well with other debuggers. Each debugger
|
||
offers different features, and therefore can require special
|
||
treatment. This section will describe some ways to use several
|
||
debuggers effectively.
|
||
|
||
11.01.01 Debuggers that Use DOS
|
||
|
||
Many debuggers use DOS and ROM BIOS to perform their display and
|
||
keyboard I/O. Special consideration must be taken when using these
|
||
debuggers with Soft-ICE (e.g., DEBUG, SYMDEB, and CODEVIEW), because
|
||
DOS and ROM BIOS are not fully re-entrant. If a break point occurs
|
||
while code is executing in DOS or BIOS, a re-entrancy problem can
|
||
occur.
|
||
|
||
Soft-ICE provides optional re-entrancy warning, which is activated
|
||
with the WARN command. When WARN mode is on, Soft-ICE checks for DOS
|
||
or ROM BIOS re-entrancy before generating the ACTION that wakes up the
|
||
host debugger. When a re-entrancy problem is detected, Soft-ICE
|
||
displays a warning message and offers you the choice of continuing to
|
||
execute the code or returning to Soft-ICE.
|
||
|
||
Note that Soft-ICE itself does not use DOS or ROM BIOS calls in its
|
||
debugging commands. This means that you can use Soft-ICE any time,
|
||
without the worry of re-entrancy problems.
|
||
|
||
For more information on the WARN command, see section 5.4.
|
||
|
||
11.01.02 ACTION Command with other Debuggers
|
||
|
||
Different debuggers use different methods of activation For a
|
||
description of these methods see section 13.1.
|
||
|
||
If you want to return to your debugger after a break point reached,
|
||
you must change the ACTION (see section 5.4) to work with your
|
||
debugger.
|
||
|
||
In most cases, the action that should be taken after a break point is
|
||
reached is INT3. For instance, DEBUG and SYMDEB will work best with
|
||
ACTION set to INT3.
|
||
|
||
If INT3 doesn't work with your debugger, try INT1 or NMI. CODEVIEW
|
||
works best with ACTION set to NMI.
|
||
|
||
11.01.03 Special Considerations
|
||
|
||
When a break point is set, you must be careful not to set off the
|
||
break point unintentionally. For instance, if you set a memory break
|
||
point at 0:0, then use your debugger to dump memory location 0:0,
|
||
Soft-ICE will be triggered. If ACTION is set to go to your debugger,
|
||
then your debugger will be triggered by itself. Since some debuggers
|
||
cannot be re-entrant, this could be a fatal problem. This problem can
|
||
also occur with other debugging functions, such as editing or
|
||
unassembling.
|
||
|
||
For this reason, it is a good practice to disable the Soft-ICE break
|
||
points once Soft-ICE has helped you get to the point where you want to
|
||
look around with your debugger.
|
||
|
||
11.01.04 Using Soft-ICE with CODEVIEW
|
||
|
||
Soft-ICE works best with CODEVIEW when CODEVIEW is either in Assembler
|
||
mode or Mixed mode. When CODEVIEW is in Source mode with higher-level
|
||
languages it does not always break correctly. It is always best to use
|
||
ACTION NMI when you want Soft-ICE to wake up CODEVIEW.
|
||
|
||
11.01.05 Debuggers that Use 80386 Break Point Registers
|
||
|
||
The 80386 has 4 break point registers that are available for use by
|
||
debuggers. Soft-ICE uses these for its memory byte, word and double
|
||
word break points. If the debugger you are using Soft-ICE with uses
|
||
these debug registers there will be a conflict. There are two ways to
|
||
handle this problem.
|
||
|
||
1. Disable the use of 80386 break point registers in the debugger you
|
||
are using Soft-ICE with. Check the documentation of your other
|
||
debugger for a description of how to do this.
|
||
|
||
2. Some debuggers automatically use the break point registers if they
|
||
detect an 80386 processor with no method of turning them off (some
|
||
versions of SYMDEB do this). For these debuggers do the following:
|
||
|
||
* Bring up the Soft-ICE window before you start the other debugger.
|
||
* Turn on Soft-ICE's break mode with the BREAK command (you may want to
|
||
do this in the INIT statement of S-ICE.DAT if you are doing this
|
||
frequently).
|
||
* Start up your other debugger.
|
||
* You may now pop up the Soft-ICE window and turn the Soft-ICE break
|
||
mode off if desired.
|
||
|
||
11.02 User-Qualified Break Points
|
||
|
||
Occasionally you may have the need for a very specific set of break
|
||
point conditions. If the special conditions require qualifying
|
||
register values or memory values, you can write a break point
|
||
qualification routine.
|
||
|
||
Soft-ICE contains a very general mechanism for calling user-written
|
||
break point qualification routines: the ACTION command. When you use
|
||
the ACTION command, Soft-ICE can route all break points through
|
||
special interrupt vector. However, before break points can be routed,
|
||
the qualification routine must be placed in memory, and the interrupt
|
||
vector must be pointing to the qualification routine.
|
||
|
||
All registers are identical to the values when the Soft-ICE break
|
||
point occurred. It is the responsibility of the qualification routine
|
||
to save and restore the registers. If your qualification routine
|
||
detects a match of break point conditions, it can do a variety of
|
||
activities. Some examples of useful activities that a routine can do
|
||
when a match is found are:
|
||
|
||
* store information for later
|
||
* send the information directly to a printer or serial terminal
|
||
* issue an INT 3 instruction to bring up Soft-ICE The command 13HERE
|
||
must be turned on in order for the INT 3 to bring up Soft-ICE (see
|
||
section 5.4).
|
||
|
||
If conditions do not match, the qualification routine in should
|
||
execute an IRET instruction. To summarize:
|
||
|
||
1. Create a break point qualification routine in your code space, or
|
||
anywhere in free memory. The routine must preserve registers. After
|
||
comparing the desired conditions, the routine can execute either an
|
||
INT 3 to bring up Soft-ICE, or an IRET to continue.
|
||
|
||
2. Point an unused interrupt vector to your qualification routine.
|
||
This can be done either within your code or from Soft-ICE.
|
||
|
||
3. In Soft-ICE, set ACTION to the interrupt- number that was used to
|
||
point to your qualification routine.
|
||
|
||
4. In Soft-ICE, set 13HERE on. This is necessary to bring up Soft-ICE
|
||
after the conditions have been met.
|
||
|
||
5. Set the Soft-ICE general break point conditions. When any of these
|
||
break point conditions are met, your qualification routine will be
|
||
called.
|
||
|
||
11.02.01 Example of a User-Qualified Break Point
|
||
|
||
This section contains an example of a user-qualified break point that
|
||
compares for the conditions of U = 3, BX = 4 and CX = 5 when a break
|
||
point goes off.
|
||
|
||
First, we create the qualification routine. For the purposes of this
|
||
example, we will assemble the command directly into memory with the
|
||
Soft- ICE interactive assembler. For this example we will arbitrarily
|
||
assemble the routine at location 9000:0H. The following statements are
|
||
entered into Soft-ICE :
|
||
|
||
A 9000:0
|
||
9000:0 CMP AX,3
|
||
9000:3 JNE 10
|
||
9000:5 CMP BX,4
|
||
9000:7 JNE 10
|
||
9000:A CMP CX,5
|
||
9000:D JNE 10
|
||
9000:F INT3
|
||
9000:10 IRET
|
||
|
||
Now that the routine is in memory, you must point an interrupt vector
|
||
to the routine. For this example, we arbitrarily pick INT 99H. To
|
||
place 9000:0H in the INT 99H vector enter:
|
||
|
||
ED 0:99*4 9000:0
|
||
|
||
Set the ACTION command so that Soft-ICE will call your break point
|
||
qualification routine on every break point.
|
||
|
||
ACTION 99
|
||
|
||
Set I3HERE on so the qualification routine can activate Soft-ICE when
|
||
the conditions occur.
|
||
|
||
I3HERE ON
|
||
|
||
Now you need to set the break points. For this example, we are just
|
||
interested when the registers are: AX = 3, BX = 4, CX = 5 in a
|
||
specific program, and we do not want any further qualification. To do
|
||
this, use a range break point on memory read :
|
||
|
||
BPR segment:starting-offset segment:ending-offset
|
||
|
||
This will cause your break point qualification routine to be called
|
||
after every instruction is executed in the specified memory range.
|
||
When the register conditions do not match, then the IRET instruction
|
||
is executed. When the conditions finally match the specified
|
||
qualifications, the INT 3 is executed and Soft-ICE is popped up.
|
||
|
||
When Soft-ICE pops up, the instruction pointer will be pointing at the
|
||
INT3 in your qualification routine (9OOO:FH in our example). To get to
|
||
the instruction after the one that caused the break point, you must
|
||
change the instruction pointer to point to the IRET instruction
|
||
(F000:10H in the example) and single step one time. This is
|
||
accomplished with the following Soft-ICE commands
|
||
|
||
RIP IP + 1
|
||
T
|
||
|
||
After your break conditions have gone off, remember to change the
|
||
ACTION command back to ACTION HERE that subsequent break points do not
|
||
go through your qualification routine.
|
||
|
||
11.03 The Window in Graphics Mode
|
||
|
||
The screen is switched to text mode when Soft-ICE is invoked. If the
|
||
screen was in graphics mode or 40-column mode, the graphics display is
|
||
not visible while the window is up. For users who must see the
|
||
graphics display while debugging, three features are provided. The
|
||
first feature allows the Soft-ICE window to display on a second
|
||
monitor (see the ALTSCR command, section 5.9). The second feature
|
||
allows you to restore the screen while you are doing P or T
|
||
instruction step commands (see the FLASH command, section 5.9). The
|
||
third feature allows you to restore the program screen temporarily
|
||
(see the RS command, section 5.9).
|
||
|
||
If Soft-ICE does not seem to be following your program into graphics
|
||
mode, try turning WATCHV on (see section 5.9 for details).
|
||
|
||
11.04 Expanded Memory Debugging Features
|
||
|
||
A range break point or a break point on memory that is set in an EMM
|
||
mappable area will stay at that address no matter which EMM page is
|
||
mapped in.
|
||
|
||
When debugging EMM programs, the EMMMAP command may also be very
|
||
useful. See section 5.6 for more information.
|
||
|
||
The D, E, S, F, and C commands can be used to view or modify any
|
||
allocated EMM handle page. The page does not have to be currently
|
||
mapped in. The syntax of these commands is similar to that of the
|
||
commands when being used for non-EMM pages, except for the following :
|
||
|
||
* In the D, E, S, and F commands, the address portion of the command
|
||
must be specified in the following way:
|
||
|
||
Hhandle# Ppage# offset
|
||
|
||
where handle is a number specifying which EMM handle to use, page is a
|
||
number specifying which EMM page to use, and offset is a number from 0
|
||
to 4000H, specifying the offset from the beginning of the page.
|
||
Example:
|
||
|
||
DB H1 P3 0
|
||
|
||
This command will dump bytes from page 3 of handle 1, starting at
|
||
offset 0.
|
||
|
||
* The C command must be specified in the following way :
|
||
|
||
C Hhandle# Ppage# offset1 L length offset2
|
||
|
||
where handle and page are the same as above. offset1 is a number from
|
||
0 to 4000H, specifying the offset from the beginning of the page,
|
||
where the first data block to be compared is located. offset2 is a
|
||
number from 0 to 4000H, specifying the offset from the beginning of
|
||
the page, where the second data block to be compared is located.
|
||
Example :
|
||
|
||
C H2 P4 00 L10 1000
|
||
|
||
This command will compare the first 10 bytes of memory located at
|
||
offset 0 of page 4 of handle 2 with the first 10 bytes of memory
|
||
located at offset 1000 of page 4 of handle 2.
|
||
|
||
Note : Subsequent uses of the D, E, S, F, and C commands will continue
|
||
to use the handle and page last specified. To get back to conventional
|
||
memory, use one of the above commands with a segment specified in the
|
||
address field, for example:
|
||
|
||
D 0:0
|
||
|
||
11.05 Extended Memory Debugging Features
|
||
|
||
The D, E, S, F, and C commands can be used to view or modify extended
|
||
memory. Extended memory reserved by Soft-ICE can not be displayed. The
|
||
syntax of these commands is similar to that of the commands when being
|
||
used for conventional memory:
|
||
|
||
* In the D, E, S, and F commands, the address portion of the command
|
||
must be specified in the following way: M megabyte address where
|
||
megabyte is a number specifying which megabyte to use, and address
|
||
specifies the address in the specified megabyte. Example:
|
||
|
||
DB M 2 0:0
|
||
|
||
This command will dump bytes from start of the megabyte starting at
|
||
linear address 200000H.
|
||
|
||
* The C command must be specified in the following way :
|
||
|
||
C M megabyte address1 L length address2
|
||
|
||
where megabyte and address1 are the same as above. address2 specifies
|
||
the address in the specified megabyte, where the second data block to
|
||
be compared is located.Example:
|
||
|
||
C M 3 1000:2000 L10 3000:4000
|
||
|
||
This command will compare the first 10 bytes of memory located at
|
||
1000:2000 with the first 10 bytes of memory located at 3000:4000.
|
||
|
||
Note : Subsequent uses of the D, E, S, F, and C commands will continue
|
||
to use the last megabyte specified. To get back to megabyte 0
|
||
(conventional memory), use one of the above commands with 0 specified
|
||
as the megabyte, for example:
|
||
|
||
D M 0
|
||
We will now discuss in a little more detail
|
||
the struggle for existence.
|
||
Charles Darwin
|
||
|
||
SoftICE Tutorial
|
||
|
||
Introduction
|
||
Loading SoftICE
|
||
Building the GDIDEMO Sample Application
|
||
Loading the GDIDEMO Sample Application
|
||
Controlling the SoftICE Screen
|
||
Tracing and Stepping through Source Code
|
||
Viewing Local Data
|
||
Setting Point-and-Shoot Breakpoints
|
||
Setting a One-Shot Breakpoint
|
||
Setting a Sticky Breakpoint
|
||
Using SoftICE Informational Commands
|
||
Using Symbols and Symbol Tables
|
||
Setting a Conditional Breakpoint
|
||
Setting a BPX Breakpoint
|
||
Editing a Breakpoint
|
||
Setting a Read-Write Memory Breakpoint
|
||
|
||
Introduction
|
||
|
||
This tutorial gives you hands-on experience debugging a Windows
|
||
application to teach you the fundamental steps for debugging
|
||
applications and drivers. During this debugging session, you will
|
||
learn how to do the following:
|
||
|
||
* Load SoftICE
|
||
* Build an application
|
||
* Load the application source and symbol files
|
||
* Trace and step through source code and assembly language
|
||
* View local data and structures
|
||
* Set point-and-shoot breakpoints
|
||
* Use SoftICE informational commands to explore the state of the
|
||
application
|
||
* Work with symbols and symbol tables
|
||
* Modify a breakpoint to use a conditional expression
|
||
|
||
Each section in the tutorial builds upon the previous sections, so you
|
||
should perform them in order.
|
||
|
||
This tutorial uses the GDIDEMO application as its basis. GDIDEMO
|
||
provides a demonstration of GDI functionality. GDIDEMO is located in
|
||
the \EXAMPLES\GDIDEMO directory on your CDROM. GDIDEMO is also
|
||
available under \mstools\samples\win32\GDIDEMO. If you use the GDIDEMO
|
||
on the CDROM, copy it to your hard drive.
|
||
|
||
You can substitute a different sample application or an application of
|
||
your own design. The debugging principles and features of SoftICE used
|
||
in this tutorial apply to most applications.
|
||
|
||
Note: The examples is this tutorial are based on Windows NT. If you
|
||
are using Windows 95, your output may vary slightly.
|
||
|
||
Loading SoftICE
|
||
|
||
If you are running SoftICE under Windows 95 or under Windows NT in
|
||
Boot, System, or Automatic mode, SoftICE automatically loads when you
|
||
start or reboot your PC. If you are running SoftICE in Manual Startup
|
||
mode under Windows NT, SoftICE does not load automatically.
|
||
|
||
To load SoftICE for Windows 95, enter the command WINICE. To load
|
||
SoftICE for Windows NT, do one of the following:
|
||
|
||
* Select START SOFTICE.
|
||
* Enter the command: NET START NTICE
|
||
|
||
Note: Once you load SoftICE, you cannot deactivate it until you reboot
|
||
your PC.
|
||
|
||
To verify that SoftICE is loaded, press the SoftICE hot key sequence
|
||
Ctrl-D. The SoftICE screen should appear. To return to the Windows
|
||
operating system, use the X (exit) or G (go to) command (F5).
|
||
|
||
Building the GDIDEMO Sample Application
|
||
|
||
The first step in preparing to debug a Windows application is to build
|
||
it with debug information. The makefile for the sample application
|
||
GDIDEMO is already set up for this purpose.
|
||
|
||
To build the sample program, perform the following steps:
|
||
|
||
1. Open a DOS shell.
|
||
|
||
2. Change to the directory that contains the sample code.
|
||
|
||
3. Execute the NMAKE command:
|
||
|
||
C:\MSTOOLS\SAMPLES\WIN32\GDIDEMO>NMAKE
|
||
|
||
If GDIDEMO is located in another directory, change the path as
|
||
appropriate.
|
||
|
||
Loading the GDIDEMO Sample Application
|
||
|
||
Loading an application entails creating a symbol file from the
|
||
application<6F>s debug information and loading the symbol and source
|
||
files into SoftICE. To Load the GDIDEMO application, perform the
|
||
following steps:
|
||
|
||
1. Start Symbol Loader : The Symbol Loader window appears.
|
||
|
||
2. Either choose OPEN MODULE from the File menu or click the OPEN
|
||
button : The Open window appears.
|
||
|
||
3. Locate GDIDEMO.EXE and click Open.
|
||
|
||
4. Either choose LOAD from the Module menu or click the LOAD button to
|
||
load GDIDEMO.
|
||
|
||
Symbol Loader translates the debug information into a .NMS symbol
|
||
file, loads the symbol and source files, starts GDIDEMO, pops up the
|
||
SoftICE screen, and displays the source code for the file GDIDEMO.C.
|
||
|
||
Controlling the SoftICE Screen
|
||
|
||
The SoftICE screen is your central location for viewing and debugging
|
||
code. It provides up to seven windows and one help line to let you
|
||
view and control various aspects of your debugging session. By
|
||
default, it displays the following:
|
||
|
||
Locals window: Displays and expand variables allocated on the stack.
|
||
|
||
Code window: Displays source code or unassembled instructions.
|
||
|
||
Command window: Enters user commands and display information.
|
||
|
||
Help line: Provides information about SoftICE commands and shows the
|
||
active address context.
|
||
|
||
1. Look at the contents of the Code window. Note that SoftICE is
|
||
displaying the WinMain routine at line 34. By default, SoftICE creates
|
||
a breakpoint and stops at the first main module it encounters when
|
||
loading your application.
|
||
|
||
2. To see all the source files that SoftICE loaded, enter the FILE
|
||
command with the wild card character:
|
||
|
||
:FILE *
|
||
|
||
SoftICE displays the source files for GDIDEMO: draw.c, maze.c,
|
||
xform.c, poly.c, wininfo.c, dialog.c, init.c, bounce.c, and gdidemo.c.
|
||
The Command window varies in size depending upon the number of lines
|
||
used by open windows, so you might not see all these file names. To
|
||
display the remaining file names, press any key. (Refer to Chapter 5:
|
||
Navigating Through SoftICE on page 69 for information about resizing
|
||
windows.)
|
||
|
||
3. Many SoftICE windows can be scrolled. If you have a mouse, you can
|
||
click on the scroll arrows. If not, SoftICE provides key sequences
|
||
that let you scroll specific windows. Try these methods for scrolling
|
||
the Code window:
|
||
|
||
Scroll the Code Window Key Sequence Mouse Action
|
||
|
||
Scroll to the previous Click the innermost up
|
||
page. PageUp scroll arrow
|
||
|
||
Scroll to the next Click the innermost down
|
||
page. PageDown scroll arrow
|
||
|
||
Scroll to the previous Click the outermost up
|
||
line. UpArrow scroll arrow
|
||
|
||
Scroll to the next Click the outermost down
|
||
line. DownArrow scroll arrow
|
||
|
||
Scroll left one Click the left scroll
|
||
character. Ctrl-LeftArrow arrow
|
||
|
||
Scroll right one Click the right scroll
|
||
character. Ctrl-RightArrow arrow
|
||
|
||
4. Enter the U command followed by EIP to disassemble the instructions
|
||
for the current instruction pointer.
|
||
|
||
:U EIP
|
||
|
||
You can also use the . (dot) command to accomplish the same thing:
|
||
|
||
:.
|
||
|
||
Tracing and Stepping through Source Code
|
||
|
||
The following steps show you how to use SoftICE to trace through
|
||
source code:
|
||
|
||
1. Enter the T (trace) command or press the F8 key to trace one
|
||
instruction.
|
||
|
||
:T
|
||
|
||
The F8 key is the default key for the T (trace) command.
|
||
|
||
Execution proceeds to the next source line and highlights it. At this
|
||
point, the following source line should be highlighted:
|
||
|
||
if(!hPrevInst)
|
||
|
||
2. The Code window is currently displaying source code. However, it
|
||
can also display disassembled code or mixed (both source and
|
||
disassembled) code. To view mixed code, use the SRC command (F3).
|
||
|
||
:SRC
|
||
|
||
Note that each source line is followed by its assembler instructions.
|
||
|
||
3. Press F3 once to see disassembled code, then again to return to
|
||
source code.
|
||
|
||
4. Enter the T command (F8) to trace one instruction. Execution
|
||
proceeds until it reaches the line that executes the RegisterAppClass
|
||
function.
|
||
|
||
As demonstrated in these steps, the T command executes one source
|
||
statement or assembly language instruction. You can also use the P
|
||
command (F10) to execute one program step. Stepping differs from
|
||
tracing in one crucial way. If you are stepping and the statement or
|
||
instruction is a function call, control is not returned until the
|
||
function call is complete.
|
||
|
||
Hint: The T command does not trace into a function call if the source
|
||
code is not available. A good example of this is Win32 API calls. To
|
||
trace into a function call when source code is not available, use the
|
||
SRC command (F3) to switch into mixed or assembly mode.
|
||
|
||
Viewing Local Data
|
||
|
||
The Locals window displays the current stack frame. In this case, it
|
||
contains the local data for the WinMain function. The following steps
|
||
illustrate how to use the Locals window:
|
||
|
||
1. Enter the T command to enter the RegisterAppClass function. The
|
||
Locals window is now empty because local data is not yet allocated for
|
||
the function.
|
||
|
||
The RegisterAppClass function is implemented in the source file
|
||
INIT.C. SoftICE displays the current source file in the upper left
|
||
corner of the Code window.
|
||
|
||
2. Enter the T command again. The Locals window contains the parameter
|
||
passed to the RegisterAppClass (hInstance) and a local structure
|
||
wndClass. The structure tag wndClass is marked with a plus sign (+).
|
||
This plus sign indicates that you can expand the structure to view its
|
||
contents.
|
||
|
||
Note: You can also expand character strings and arrays.
|
||
|
||
3. If you have a Pentium-class processor and a mouse, double-click the
|
||
structure WNDCLASSA to expand it. To collapse the structure wndClass,
|
||
double-click its contents.
|
||
|
||
4. To use the keyboard to expand the structure: press Alt-L to move
|
||
the cursor to the Locals window, use the UpArrow or DownArrow to move
|
||
the highlight bar to the structure, and press Enter. Press Enter again
|
||
to collapse it.
|
||
|
||
Setting Point-and-Shoot Breakpoints
|
||
|
||
This section shows you how to set two handy types of point-and-shoot
|
||
breakpoints: one-shot and sticky breakpoints.
|
||
|
||
Setting a One-Shot Breakpoint
|
||
|
||
The following steps demonstrate how to set a one-shot breakpoint. A
|
||
one-shot breakpoint clears after the breakpoint is triggered.
|
||
|
||
1. To shift focus to the Code window, either use your mouse to click
|
||
in the window or press Alt-C.
|
||
|
||
If you wanted to shift focus back to the Command window you could
|
||
press Alt-C again. Setting Point-and-Shoot Breakpoints
|
||
|
||
2. Either use the Down arrow key, the down scroll arrow, or the U
|
||
command to place the cursor on line 61, the first call to the Win32
|
||
API function RegisterClass. If you use the U command, specify the
|
||
source line 61 as follows:
|
||
|
||
:U .61
|
||
|
||
SoftICE places source line 61 at the top of the Code window.
|
||
|
||
3. Use the HERE command (F7) to execute to line 61. The HERE command
|
||
executes from the current instruction to the instruction that contains
|
||
the cursor. The HERE command sets a one-shot breakpoint on the
|
||
specified address or source line and continues execution until that
|
||
breakpoint triggers. When the breakpoint is triggered, SoftICE
|
||
automatically clears the breakpoint so that it does not trigger again.
|
||
|
||
The following current source line should be highlighted:
|
||
|
||
if(!RegisterClass(&wndClass))
|
||
|
||
Note: You can do the same thing by using the G (go) command and
|
||
specifying the line number or address to which to execute:
|
||
|
||
:G .61
|
||
|
||
Setting a Sticky Breakpoint
|
||
|
||
The following steps demonstrate another type of point-and-shoot
|
||
breakpoint: the sticky breakpoint, which does not clear until you
|
||
explicitly clear it.
|
||
|
||
The F9 key is the default key for the BPX command.
|
||
|
||
1. Find the next call to RegisterClass that appears on source line 74.
|
||
With the cursor on line 74, enter the BPX command (F9) to set an
|
||
execution breakpoint. The BPX command sets an execution breakpoint by
|
||
inserting an INT3 instruction into the code. Note that the line is
|
||
highlighted when you set a breakpoint.
|
||
|
||
2. Press the F9 key to clear the breakpoint. If you are using a
|
||
Pentium-class processor and you have a mouse, you can double-click on
|
||
a line in the Code window to set or clear a breakpoint.
|
||
|
||
3. Set a breakpoint on line 74, then use the G or X command (F5) to
|
||
execute the instructions until the breakpoint triggers:
|
||
|
||
:G
|
||
|
||
When the INT3 instruction is executed, SoftICE pops up. Unlike the
|
||
HERE command, which sets a one-shot breakpoint, the BPX command sets a
|
||
sticky breakpoint. A sticky breakpoint remains until you clear it.
|
||
|
||
4. To view information about breakpoints that are currently set, use
|
||
the BL command:
|
||
|
||
:BL
|
||
00) BPX #0137:00402442
|
||
|
||
Note: The address you see might be different.
|
||
|
||
From the output of the BL command, one breakpoint is set on code
|
||
address 0x402442. This address equates to source line 74 in the
|
||
current file INIT.C.
|
||
|
||
5. You can use the SoftICE expression evaluator to translate a line
|
||
number into an address. To find the address for line 74, use the ?
|
||
command:
|
||
|
||
:? .74
|
||
void * = 0x00402442
|
||
|
||
6. The RegisterAppClass function has a relatively straightforward
|
||
implementation, so it is unnecessary to trace every single source
|
||
line. Use the P command with the RET parameter (F12) to return to the
|
||
point where this function was called:
|
||
|
||
:P RET
|
||
|
||
The RET parameter to the P command causes SoftICE to execute
|
||
instructions until the function call returns. Because RegisterAppClass
|
||
was called from within WinMain, SoftICE pops up in WinMain on the
|
||
statement after the RegisterAppClass function call.
|
||
|
||
The following source line in WinMain should be highlighted:
|
||
|
||
msg.wParam = 1;
|
||
|
||
7. Enter the BC command with the wild card parameter to clear all the
|
||
breakpoints:
|
||
|
||
BC *
|
||
|
||
Using SoftICE Informational Commands
|
||
|
||
SoftICE provides a wide variety of informational commands that detail
|
||
the state of an application or the system. This section teaches you
|
||
about two of them: H (help) and CLASS.
|
||
|
||
1. The H and Class commands work best when you have more room to
|
||
display information, so use the WL command to close the Locals window.
|
||
Closing this window automatically increases the size of the Command
|
||
window.
|
||
|
||
2. The H command provides general help on all the SoftICE commands or
|
||
detailed help on a specific command. To view detailed help about the
|
||
CLASS command, enter CLASS as the parameter to the H command.
|
||
|
||
:H CLASS
|
||
Display window class information
|
||
CLASS [-x] [process | thread | module | class-name]
|
||
ex: CLASS USER
|
||
|
||
The first line of help provides a description of the command. The
|
||
second line is the detailed use, including any options and/or
|
||
parameters the command accepts. The third line is an example of the
|
||
command.
|
||
|
||
3. The purpose of the RegisterAppClass function is to register window
|
||
class templates that are used by the GDIDEMO application to create
|
||
windows. Use the CLASS command to examine the classes registered by
|
||
GDIDEMO.
|
||
|
||
:CLASS GDIDEMO
|
||
|
||
Note: This example shows only those classes specifically registered by
|
||
the GDIDEMO application. Classes registered by other Windows modules,
|
||
such as USER32, are omitted.
|
||
|
||
The output of the CLASS command provides summary information for each
|
||
window class registered on behalf of the GDIDEMO process. This
|
||
includes the class name, the address of the internal WINCLASS data
|
||
structure, the module which registered the class, the address of the
|
||
default window procedure for the class, and the value of the class
|
||
style flags.
|
||
|
||
Note: For more specific information on window class definitions, use
|
||
the CLASS command with the -X option, as follows:
|
||
|
||
:CLASS -X
|
||
Class Name Handle Owner WndwProc Styles
|
||
---------------Application Private---------------
|
||
BOUNCEDEMO A018A3B0 GDIDEMO 004015A4 00000003
|
||
DRAWDEMO A018A318 GDIDEMO 00403CE4 00000003
|
||
MAZEDEMO A018A280 GDIDEMO 00403A94 00000003
|
||
XFORMDEMO A018A1E8 GDIDEMO 00403764 00000003
|
||
POLYDEMO A018A150 GDIDEMO 00402F34 00000003
|
||
GDIDEMO A018A0C0 GDIDEMO 004010B5 00000003
|
||
|
||
Using Symbols and Symbol Tables
|
||
|
||
Now that you are familiar with using SoftICE to step, trace, and
|
||
create point-and-shoot style breakpoints, it is time to explore
|
||
symbols and tables. When you load symbols for an application, SoftICE
|
||
creates a symbol table that contains all the symbols defined for that
|
||
module.
|
||
|
||
1. Use the TABLE command to see all the symbol tables that are loaded:
|
||
|
||
:TABLE
|
||
GDIDEMO [NM32]
|
||
964657 Bytes Of Symbol Memory Available
|
||
|
||
The currently active symbol table is listed in bold. This is the
|
||
symbol table used to resolve symbol names. If the current table is not
|
||
the table from which you want to reference symbols, use the TABLE
|
||
command and specify the name of the table to make active:
|
||
|
||
:TABLE GDIDEMO
|
||
|
||
2. Use the SYM command to display the symbols from the current symbol
|
||
table. With the current table set to GDIDEMO, the SYM command produces
|
||
output similar to the following abbreviated output:
|
||
|
||
:SYM
|
||
.text(001B)
|
||
001B:00401000 WinMain
|
||
001B:004010B5 WndProc
|
||
001B:004011DB CreateProc
|
||
001B:00401270 CommandProc
|
||
001B:00401496 PaintProc
|
||
001B:004014D2 DestroyProc
|
||
001B:004014EA lRandom
|
||
001B:00401530 CreateBounceWindow
|
||
001B:004015A4 BounceProc
|
||
001B:004016A6 BounceCreateProc
|
||
001B:00401787 BounceCommandProc
|
||
001B:0040179C BouncePaintProc
|
||
|
||
This list of symbol names is from the .text section of the executable.
|
||
The .text section is typically used for procedures and functions. The
|
||
symbols displayed in this example are all functions of GDIDEMO.
|
||
|
||
Setting a Conditional Breakpoint
|
||
|
||
One of the symbols defined for the GDIDEMO application is the
|
||
LockWindowInfo function. The purpose of this routine is to retrieve a
|
||
pointer value that is specific to a particular instance of a window.
|
||
To learn about conditional and memory breakpoints, you will perform
|
||
the following steps:
|
||
|
||
* Set a BPX breakpoint on the LockWindowInfo function.
|
||
|
||
* Edit the breakpoint to use a conditional expression, thus setting a
|
||
conditional breakpoint.
|
||
|
||
* Set a memory breakpoint to monitor access to a key piece of
|
||
information, as described in Setting a Read-Write Memory Breakpoint on
|
||
page 39.
|
||
|
||
Setting a BPX Breakpoint
|
||
|
||
Before setting the conditional breakpoint, you need to set a BPX-style
|
||
breakpoint on LockWindowInfo.
|
||
|
||
1. Set a BPX-style breakpoint on the LockWindowInfo function:
|
||
|
||
:BPX LockWindowInfo
|
||
|
||
When one of the GDIDEMO windows needs to draw information in its
|
||
client area, it calls the LockWindowInfo function. Every time the
|
||
LockWindowInfo function is called, SoftICE pops up to let you debug
|
||
the function. The GDIDEMO windows continually updates, so this
|
||
breakpoint goes off quite frequently.
|
||
|
||
2. Use the BL command to verify that the breakpoint is set.
|
||
|
||
3. Use either the X or G command to exit SoftICE. SoftICE should pop
|
||
up almost immediately on the LockWindowInfo function.
|
||
|
||
Editing a Breakpoint
|
||
|
||
From the LockWindowInfo function prototype on source line 47, you can
|
||
see that the function accepts one parameter of type HWND and returns a
|
||
void pointer type. The HWND parameter is the handle to the window that
|
||
is attempting to draw information within its client area. At this
|
||
point, you want to modify the existing breakpoint, adding a
|
||
conditional breakpoint to isolate a specific HWND value.
|
||
|
||
1. Before you can set the conditional expression, you need to obtain
|
||
the HWND value for the POLYDEMO window. The HWND command provides
|
||
information about application windows. Use the HWND command and
|
||
specify the GDIDEMO process:
|
||
|
||
:HWND GDIDEMO
|
||
|
||
The following example illustrates what you should see if you are using
|
||
Windows NT. If you are using Windows 95, your output will vary.
|
||
|
||
Handle Class WinProc TID Module
|
||
07019C GDIDEMO 004010B5 2D GDIDEMO
|
||
100160 MDIClient 77E7F2F5 2D GDIDEMO
|
||
09017E BOUNCEDEMO 004015A4 2D GDIDEMO
|
||
100172 POLYDEMO 00402F34 2D GDIDEMO
|
||
11015C DRAWDEMO 00403CE4 2D GDIDEMO
|
||
|
||
The POLYDEMO window handle is bold and underlined. This is the window
|
||
handle you want to use to form a conditional expression. If the
|
||
POLYDEMO window does not appear in the HWND output, exit SoftICE using
|
||
the G or X commands (F5) and repeat Step 1 until the window is
|
||
created.
|
||
|
||
The value used in this example is probably not the same value that
|
||
appears in your output. For the exercise to work correctly, you must
|
||
use the HWND command to obtain the actual HWND value on your system.
|
||
|
||
Using the POLYDEMO window handle, you can set a conditional expression
|
||
to monitor calls to LockWindowInfo looking for a matching handle
|
||
value. When the LockWindowInfo function is called with the POLYDEMO
|
||
window handle, SoftICE pops up.
|
||
|
||
2. Because you already have a breakpoint set on LockWindowInfo, use
|
||
the BPE command (Breakpoint Edit) to modify the existing breakpoint:
|
||
|
||
:BPE 0
|
||
|
||
When you use the BPE command to modify an existing breakpoint, SoftICE
|
||
places the definition of that breakpoint onto the command line so that
|
||
it can be easily edited. The output of the BPE command appears:
|
||
|
||
:BPX LockWindowInfo
|
||
|
||
The cursor appears at the end of the command line and is ready for you
|
||
to type in the conditional expression.
|
||
|
||
3. Remember to substitute the POLYDEMO window handle value that you
|
||
found using the HWND command instead of the value (100172) used in
|
||
this example. Your conditional expression should appear similar to the
|
||
following example. The conditional expression appears in bold type.
|
||
|
||
:BPX LockWindowInfo IF ESP->4 == 100172
|
||
|
||
Note: Win32 applications pass parameters on the stack and at the entry
|
||
point of a function; the first parameter has a positive offset of 4
|
||
from the ESP register. Using the SoftICE expression evaluator, this is
|
||
expressed in the following form: ESP->4. ESP is the CPU stack pointer
|
||
register and the "->" operator causes the lefthand side of the
|
||
expression (ESP) to be indirected at the offset specified on the
|
||
righthand side of the expression (4). For more information on the
|
||
SoftICE expression evaluator refer to Chapter 8: Using Expressions on
|
||
page 125 and for referencing the stack in conditional expressions
|
||
refer to Conditional Breakpoints on page 114.
|
||
|
||
4. Verify that the breakpoint and conditional expression are correctly
|
||
set by using the BL command.
|
||
|
||
5. Exit SoftICE using the G or X command (F5).
|
||
|
||
When SoftICE pops up, the conditional expression will be TRUE.
|
||
|
||
Setting a Read-Write Memory Breakpoint
|
||
|
||
We set the original breakpoint and subsequently the conditional
|
||
expression so that we could obtain the address of a data structure
|
||
specific to this instance of the POLYDEMO window. This value is stored
|
||
in the window<6F>s extra data and is a global handle. The LockWindowInfo
|
||
function retrieves this global handle and uses the Win32 API LocalLock
|
||
to translate it into a pointer that can be used to access the window<6F>s
|
||
instance data.
|
||
|
||
1. Obtain the pointer value for the windows instance data by executing
|
||
up to the return statement on source line 57:
|
||
|
||
:G .57
|
||
|
||
2. Win32 API functions return 32-bit values in the EAX register, so
|
||
you can use the BPMD command and specify the EAX register to set a
|
||
memory breakpoint on the instance data pointer.
|
||
|
||
:BPMD EAX
|
||
|
||
The BPMD command uses the hardware debug registers provided by Intel
|
||
CPUs to monitor reads and writes to the Dword value at a linear
|
||
address. In this case, you are using BPMD to trap read and write
|
||
accesses to the first Dword of the window instance data.
|
||
|
||
3. Use the BL command to verify that the memory breakpoint is set.
|
||
Your output should look similar to the following:
|
||
|
||
:BL
|
||
00) BPX LockWindowInfo IF ((ESP->4)==0x100172)
|
||
01) BPMD #0023:001421F8 RW DR3
|
||
|
||
Breakpoint index 0 is the execution breakpoint on LockWindowInfo and
|
||
breakpoint index 1 is the BPMD on the window instance data.
|
||
|
||
4. Use the BD command to disable the breakpoint on the LockWindowInfo.
|
||
|
||
:BD 0
|
||
|
||
SoftICE provides the BC (breakpoint clear) and BD (breakpoint disable)
|
||
commands to clear or disable a breakpoint. Disabling a breakpoint is
|
||
useful if you want to re-enable the breakpoint later in your debugging
|
||
session. If you are not interested in using the breakpoint again, then
|
||
it makes more sense to clear it.
|
||
|
||
5. Use the BL command to verify that the breakpoint on LockWindowInfo
|
||
is disabled. SoftICE indicates that a breakpoint is disabled by
|
||
placing an asterisk (*) after the breakpoint index. Your output should
|
||
appear similar to the following:
|
||
|
||
:BL
|
||
00) * BPX _LockWindowInfo IF ((ESP->4)==0x100172)
|
||
01) BPMD #0023:001421F8 RW DR3
|
||
|
||
Note: You can use the BE command to re-enable a breakpoint:
|
||
|
||
:BE breakpoint-index-number
|
||
|
||
6. Exit SoftICE using the G or X command. When the POLYDEMO window
|
||
accesses the first Dword of its window instance data, the breakpoint
|
||
triggers and SoftICE pops up.
|
||
|
||
When SoftICE pops up due to the memory breakpoint, you are in the
|
||
PolyRedraw or PolyDrawBez function. Both functions access the
|
||
nBezTotal field at offset 0 of the POLYDRAW window instance data.
|
||
|
||
Note: The Intel CPU architecture defines memory breakpoints as traps,
|
||
which means that the breakpoint triggers after the memory has been
|
||
accessed. In SoftICE, the instruction or source line that is
|
||
highlighted is the one after the instruction or source line that
|
||
accessed the memory.
|
||
|
||
7. Clear the breakpoints you set in this section by using the BC
|
||
command:
|
||
|
||
:BC *
|
||
|
||
Note: You can use the wildcard character (*) with the BC, BD, and BE
|
||
commands to clear, disable, and enable all breakpoints.
|
||
|
||
8. Exit SoftICE using the G or X command.
|
||
|
||
The operating system terminates the application.
|
||
|
||
Congratulations on completing your first SoftICE debugging session. In
|
||
this session, you traced through source code, viewed locals and
|
||
structures, and set point-and-shoot, conditional, and read-write
|
||
memory breakpoints. SoftICE provides many more advanced features. The
|
||
SoftICE commands ADDR, HEAP, LOCALS, QUERY, THREAD, TYPES, WATCH, and
|
||
WHAT are just a few of the many SoftICE commands that help you debug
|
||
smarter and faster. Refer to the SoftICE Command Reference for a
|
||
complete explanation of all the SoftICE commands.
|
||
You know my methods. Apply them.
|
||
Sir Arthur Conan Doyle
|
||
|
||
Using Breakpoints
|
||
|
||
Introduction
|
||
Types of Breakpoints Supported by SoftICE
|
||
Breakpoint Options
|
||
Execution Breakpoints
|
||
Memory Breakpoints
|
||
Interrupt Breakpoints
|
||
I/O Breakpoints
|
||
Window Message Breakpoints
|
||
Understanding Breakpoint Contexts
|
||
Virtual Breakpoints
|
||
Setting a Breakpoint Action
|
||
Conditional Breakpoints
|
||
Conditional Breakpoint Count Functions
|
||
Using Local Variables in Conditional Expressions
|
||
Referencing the Stack in Conditional Breakpoints
|
||
Performance
|
||
Duplicate Breakpoints
|
||
Elapsed Time
|
||
Breakpoint Statistics
|
||
Referring to Breakpoints in Expressions
|
||
Manipulating Breakpoints
|
||
Using Embedded Breakpoints
|
||
|
||
Introduction
|
||
|
||
You can use SoftICE to set breakpoints on program execution, memory
|
||
location reads and writes, interrupts, and reads and writes to I/O
|
||
ports. SoftICE assigns a breakpoint index, from 0 to FF, to each
|
||
breakpoint. You can use this breakpoint index to identify breakpoints
|
||
when you set, delete, disable, enable, or edit them.
|
||
|
||
All SoftICE breakpoints are sticky, which means that SoftICE tracks
|
||
and maintains a breakpoint until you intentionally clear or disable it
|
||
using the BC or the BD command. After you clear breakpoints, you can
|
||
recall them with the BH command, which displays a breakpoint history.
|
||
|
||
You can set up to 256 breakpoints at one time in SoftICE. However, the
|
||
number of breakpoints you can set on memory location (BPMs) and I/O
|
||
ports (BPIOs) is a total of four, due to restrictions of the x86
|
||
processors.
|
||
|
||
Where symbol information is available, you can set breakpoints using
|
||
function names. When in source or mixed mode, you can set
|
||
point-and-shoot style breakpoints on any source code line. A valuable
|
||
feature is that you can set point-and-shoot breakpoints in a module
|
||
before it is even loaded.
|
||
|
||
Types of Breakpoints Supported by SoftICE
|
||
|
||
SoftICE provides a powerful array of breakpoint capabilities that take
|
||
full advantage of the x86 architecture, as follows :
|
||
|
||
* Execution Breakpoints: SoftICE replaces an existing instruction with
|
||
INT 3. You can use the BPX command to set execution breakpoints.
|
||
|
||
* Memory Breakpoints: SoftICE uses the x86 debug registers to break when
|
||
a certain byte/word/dword of memory is read, written, or executed. You
|
||
can use the BPM command to set memory breakpoints.
|
||
|
||
* Interrupt Breakpoints: SoftICE intercepts interrupts by modifying the
|
||
IDT (Interrupt Descriptor Table) vectors. You can use the BPINT
|
||
command to set interrupt breakpoints.
|
||
|
||
* I/O Breakpoints: SoftICE uses a debug register extension available on
|
||
Pentium and Pentium-Pro CPUs to watch for an IN or OUT instruction
|
||
going to a particular port address. You can use the BPIO command to
|
||
set I/O breakpoints.
|
||
|
||
* Window Message Breakpoints: SoftICE traps when a particular message or
|
||
range of messages arrives at a window. This is not a fundamental
|
||
breakpoint type; it is just a convenient feature built on top of the
|
||
other breakpoint primitives. You can use the BMSG command to set
|
||
window message breakpoints.
|
||
|
||
Breakpoint Options
|
||
|
||
You can qualify each type of breakpoint with the following two
|
||
options:
|
||
|
||
* A conditional expression [IF expression]: The expression must evaluate
|
||
to non-zero (TRUE) for the breakpoint to trigger. Refer to Conditional
|
||
Breakpoints.
|
||
|
||
* A breakpoint action [DO "command1;command2;"]: A series of SoftICE
|
||
commands can automatically execute when the breakpoint triggers. You
|
||
can use this feature in concert with user-defined macros to automate
|
||
tasks that would otherwise be tedious. Refer to Setting a Breakpoint
|
||
Action on page 114.
|
||
|
||
Note: For complete information on each breakpoint command, refer to
|
||
the SoftICE Command Reference.
|
||
|
||
Execution Breakpoints
|
||
|
||
An execution breakpoint traps executing code such as a function call
|
||
or language statement. This is the most frequently used type of
|
||
breakpoint. By replacing an existing instruction with an INT 3
|
||
instruction, SoftICE takes control when execution reaches the INT 3
|
||
breakpoint.
|
||
|
||
SoftICE provides two ways for setting execution breakpoints: using a
|
||
mouse and using the BPX command. The following sections describe how
|
||
to use these methods for setting breakpoints.
|
||
|
||
Using a Mouse to Set Breakpoints
|
||
|
||
If you are using a Pentium processor and a mouse, you can use the
|
||
mouse to set or clear point-and-shoot (sticky) and one-shot
|
||
breakpoints. To set a sticky breakpoint, double-click the line on
|
||
which you want to set the breakpoint. SoftICE highlights the line to
|
||
indicate that you set a breakpoint. Double-click the line again to
|
||
clear the breakpoint. To set a one-shot breakpoint, click the line on
|
||
which you want to set the breakpoint and use the HERE command (F7) to
|
||
execute to that line.
|
||
|
||
Using the BPX Command to Set Breakpoints
|
||
|
||
Use the BPX command with any of the following parameters to set an
|
||
execution breakpoint:
|
||
|
||
BPX [address] [IF expression] [DO "command1;command2;"]
|
||
|
||
IF expression:
|
||
Refer to Conditional Breakpoints.
|
||
DO "command1;command2;":
|
||
Refer to Setting a Breakpoint Action.
|
||
|
||
Example:
|
||
|
||
To set a breakpoint on your application's WinMain function, use
|
||
this command:
|
||
|
||
BPX WinMain
|
||
|
||
Use the BPX command without specifying any parameter to set a
|
||
point-and-shoot execution breakpoint in the source code. Use Alt-C to
|
||
move the cursor into the Code window. Then use the arrow keys to
|
||
position the cursor on the line on which you want to set the
|
||
breakpoint. Finally, use the BPX command (F9). If you prefer to use
|
||
your mouse to set the breakpoint, click the scroll arrows to scroll
|
||
the Code window, then double-click the line on which you want to set
|
||
the breakpoint.
|
||
|
||
Memory Breakpoints
|
||
|
||
A memory breakpoint uses the debug registers found on the 386 CPUs and
|
||
later models to monitor access to a certain memory location. This type
|
||
of breakpoint is extremely useful for finding out when and where a
|
||
program variable is modified, and for setting an execution breakpoint
|
||
in read-only memory. You can only set four memory breakpoints at one
|
||
time, because the CPU contains only four debug registers.
|
||
|
||
Use the BPM command to set memory breakpoints:
|
||
|
||
BPM[B|W|D] address [R|W|RW|X] [ debug register] [IF expression]
|
||
[DO "command1;command2;"]
|
||
|
||
BPM and BPMB:
|
||
Set a byte-size breakpoint.
|
||
BPMW:
|
||
Sets a word (2-byte) size breakpoint.
|
||
BPMD:
|
||
Sets a dword (4-byte) size breakpoint.
|
||
R, W, and RW:
|
||
Break on reads, writes, or both.
|
||
X:
|
||
Breaks on execution; this is more powerful than a BPX-style
|
||
breakpoint because memory does not need to be modified, enabling
|
||
such options as setting breakpoints in ROM or setting breakpoints
|
||
on addresses that are not present.
|
||
debug register:
|
||
Specifies which debug register to use. SoftICE normally manages
|
||
the debug register for you, unless you need to specify it in an
|
||
unusual situation.
|
||
IF expression:
|
||
Refer to Conditional Breakpoints.
|
||
DO "command1;command2;":
|
||
Refer to Setting a Breakpoint Action.
|
||
|
||
Example:
|
||
|
||
The following example sets a memory breakpoint to trigger when a
|
||
value of 5 is written to the Dword (4-byte) variable
|
||
MyGlobalVariable.
|
||
|
||
BPMD MyGlobalVariable W IF MyGlobalVariable==5
|
||
|
||
If the target location of a BPM breakpoint is frequently accessed,
|
||
performance can be degraded regardless of whether the conditional
|
||
expression evaluates to FALSE.
|
||
|
||
Interrupt Breakpoints
|
||
|
||
Use an interrupt breakpoint to trap an interrupt through the IDT. The
|
||
breakpoint only triggers when a specified interrupt is dispatched
|
||
through the IDT.
|
||
|
||
Use the BPINT command to set interrupt breakpoints:
|
||
|
||
BPINT interrupt-number [IF expression] [DO "command1;command2;"]
|
||
|
||
interrupt-number:
|
||
Number ranging from 0 to 255 (0 to FF hex).
|
||
IF expression:
|
||
Refer to Conditional Breakpoints.
|
||
DO "command1;command2;":
|
||
Refer to Setting a Breakpoint Action.
|
||
|
||
If an interrupt is caused by a software INT instruction, the
|
||
instruction displayed will be the INT instruction. (SoftICE pops up
|
||
when execution reaches the INT instruction responsible for the
|
||
breakpoint, but before the instruction actually executes.) Otherwise,
|
||
the current instruction will be the first instruction of an interrupt
|
||
handler. You can list all interrupts and their handlers by using the
|
||
IDT command.
|
||
|
||
Example:
|
||
|
||
Use the following command to set a breakpoint to trigger when a
|
||
call to the kernel-mode routine NtCreateProcess is made from user
|
||
mode:
|
||
|
||
BPINT 2E IF EAX==1E
|
||
|
||
Note: The NtCreateProcess is normally called from ZwCreateProcess
|
||
in the NTDLL.DLL, which is in turn called from CreateProcessW in
|
||
the KERNEL32.DLL. In the conditional expression, 1E is the
|
||
service number for NtCreateProcess. Use the NTCALL command to
|
||
find this value.
|
||
|
||
You can use the BPINT command to trap software interrupts, for
|
||
example, INT 21 made by 16-bit Windows programs. Note that software
|
||
interrupts issued from V86 mode do not pass through the IDT vector
|
||
that they specify. INT instructions executed in V86 generate processor
|
||
general protection faults (GPF), which are handled by vector 0xD in
|
||
the IDT. The Windows GPF handler realizes the cause of the fault and
|
||
passes control to a handler dedicated to specific V86 interrupt types.
|
||
The types may end up reflecting the interrupt down to V86 mode by
|
||
calling the interrupt handler entered in the V86 mode Interrupt Vector
|
||
Table (IVT). In some cases, a real-mode interrupt is reflected
|
||
(simulated) by calling the real-mode interrupt vector.
|
||
|
||
In the case where the interrupt is reflected, you can trap it by
|
||
placing a BPX breakpoint at the beginning of the real-mode interrupt
|
||
handler.
|
||
|
||
Example:
|
||
|
||
To set a breakpoint on the real-mode INT 21 handler, use the
|
||
following command:
|
||
|
||
BPX *($0:(21*4))
|
||
|
||
I/O Breakpoints
|
||
|
||
An I/O breakpoint monitors reads and writes to a port address. The
|
||
breakpoint traps when an IN or OUT instruction accesses the port.
|
||
SoftICE implements I/O breakpoints by using the debug register
|
||
extensions introduced with the Pentium. As a result, I/O breakpoints
|
||
require a Pentium or Pentium-Pro CPU. A maximum of four I/O
|
||
breakpoints can be set at one time. The I/O breakpoint is effective in
|
||
kernel-level (ring 0) code as well as user (ring 3) code.
|
||
|
||
Notes: Under Windows 95, SoftICE relies on the I/O permission bitmap,
|
||
which restricts I/O trapping to ring 3 code.
|
||
|
||
Notes: You cannot use I/O breakpoints to trap IN/OUT instructions
|
||
executed by MS-DOS programs. The IN/OUT instructions are trapped and
|
||
emulated by the operating system, and therefore do not generate real
|
||
port I/O, at least not in a 1:1 mapping.
|
||
|
||
Use the BPIO command to set I/O breakpoints:
|
||
|
||
BPIO port-number [R|W|RW] [IF expression]
|
||
[DO "command1;command2;"]
|
||
|
||
R, W, and RW :
|
||
Break on reads (IN instructions), writes (OUT instructions), or
|
||
both, respectively.
|
||
IF expression:
|
||
Refer to Conditional Breakpoints.
|
||
DO "command1;command2;":
|
||
Refer to Setting a Breakpoint Action.
|
||
|
||
When an I/O breakpoint triggers and SoftICE pops up, the current
|
||
instruction is the instruction following the IN or OUT that caused the
|
||
breakpoint to trigger. Unlike BPM breakpoints, there is no size
|
||
specification; any access to the port-number, whether byte, word, or
|
||
dword, triggers the breakpoint. Any I/O that spans the I/O breakpoint
|
||
will also trigger the breakpoint. For example, if you set an I/O
|
||
breakpoint on port 2FF, a word I/O to port 2FE would trigger the
|
||
breakpoint.
|
||
|
||
Example:
|
||
|
||
Use the following command to set a breakpoint to trigger when a
|
||
value is read from port 3FEH with the upper 2 bits set:
|
||
|
||
BPIO 3FE R IF (AL & C0)==C0
|
||
|
||
The condition is evaluated after the instruction completes. The
|
||
value will be in AL, AX, or EAX because all port I/O, except for
|
||
the string I/O instructions (which are rarely used), use the EAX
|
||
register.
|
||
|
||
Window Message Breakpoints
|
||
|
||
Use a window message breakpoint to trap a certain message or range of
|
||
messages delivered to a window procedure. Although you could implement
|
||
an equivalent breakpoint yourself using BPX with a conditional
|
||
expression, the following BMSG command is easier to use:
|
||
|
||
BMSG window-handle [L] [ begin-message [ end-message]]
|
||
[IF expression] [DO "command1;command2;"]
|
||
|
||
window-handle:
|
||
Value returned when the window was created; you can use the HWND
|
||
command to get a list of windows with their handles.
|
||
L:
|
||
Signifies that the window message should be printed to the
|
||
Command window without popping into SoftICE.
|
||
begin-message:
|
||
Single Windows message or the lower message number in a range of
|
||
Windows messages. If you do not specify a range with an
|
||
end-message, then only the begin-message will cause a break. For
|
||
both begin-message and end-message, the message numbers can be
|
||
specified either in hexadecimal or by using the actual ASCII
|
||
names of the messages, for example, WM_QUIT.
|
||
end-message:
|
||
Higher message number in a range of Windows messages.
|
||
IF expression:
|
||
Refer to Conditional Breakpoints.
|
||
DO "command1;command2;":
|
||
Refer to Setting a Breakpoint Action.
|
||
|
||
When specifying a message or a message range, you can use the symbolic
|
||
name, for example, WM_NCPAINT. Use the WMSG command to get a list of
|
||
the window messages that SoftICE understands. If no message or message
|
||
range is specified, any message will trigger the breakpoint.
|
||
|
||
Example:
|
||
|
||
To set a window message breakpoint for the window handle 1001E,
|
||
use the following command:
|
||
|
||
BMSG 1001E WM_NCPAINT
|
||
|
||
SoftICE is smart enough to take into account the address context
|
||
of the process that owns the window, so it does not matter what
|
||
address context you are in when you use BMSG.
|
||
|
||
You can construct an equivalent BPX-style breakpoint using a
|
||
conditional expression. Use the HWND command to get the address
|
||
of the window procedure, then use the following BPX command
|
||
(Win32 only):
|
||
|
||
BPX 5FEBDD12 IF (esp->8)==WM_NCPAINT
|
||
|
||
Warning: When setting a breakpoint using a raw address (not a symbol),
|
||
it is vital to be in the correct address context.
|
||
|
||
Understanding Breakpoint Contexts
|
||
|
||
A breakpoint context consists of the address context in which the
|
||
breakpoint was set and in what code module the breakpoint is in, if
|
||
any. Breakpoint contexts apply to the BPX and BPM commands, and
|
||
breakpoint types based on those commands such as BMSG.
|
||
|
||
For Win32 applications, breakpoints set in the upper 2GB of address
|
||
space are global; they break in any context. Breakpoints set in the
|
||
lower 2GB are context-sensitive; they trigger according to the
|
||
following criteria and SoftICE pops up:
|
||
|
||
* SoftICE only pops up if the address context matches the context
|
||
in which the breakpoint was set.
|
||
|
||
* If the breakpoint triggers in the same code module in which the
|
||
breakpoint was set, then SoftICE disregards the address context
|
||
and pops up. This means that a breakpoint set in a shared module
|
||
like KERNEL32.DLL breaks in every address context that has the
|
||
module loaded, regardless of what address context was selected
|
||
when the breakpoint was set.
|
||
|
||
The exception is if another process mapped the module at a
|
||
different base address than the one in which the breakpoint is
|
||
set. In this case, the breakpoint does not trigger. Avoid this
|
||
situation by basing your DLLs at non-conflicting addresses.
|
||
|
||
Breakpoints set on MS-DOS and 16-bit Windows programs are
|
||
context-sensitive too in the sense that the breakpoint only affects
|
||
the NTVDM process in which the breakpoint was set. The breakpoint
|
||
never crosses NTVDMs, even if the same program is run multiple times.
|
||
|
||
Breakpoint contexts are more important for BPM-type breakpoints than
|
||
for BPX. BPM sets an x86 hardware breakpoint that triggers on a
|
||
certain virtual address. Because the CPU's breakpoint hardware knows
|
||
nothing of address spaces, it could potentially trigger on an
|
||
unrelated piece of code or data. Breakpoint contexts give SoftICE the
|
||
ability to discriminate between false traps and real ones.
|
||
|
||
Virtual Breakpoints
|
||
|
||
In SoftICE, you can set breakpoints in Windows modules before they
|
||
load, and it is not necessary for a page to be present in physical
|
||
memory for a BPX (INT 3) breakpoint to be set. In such cases, the
|
||
breakpoint is virtual; it will be automatically armed when the module
|
||
loads or the page becomes present. Virtual breakpoints can only be set
|
||
on either symbols or source lines.
|
||
|
||
Setting a Breakpoint Action
|
||
|
||
You can set a breakpoint to execute a series of SoftICE commands,
|
||
including user-defined macros, after the breakpoint is triggered. You
|
||
define these breakpoint actions with the DO option, which is available
|
||
with every breakpoint type:
|
||
|
||
DO "command1;command2;"
|
||
|
||
The body of a breakpoint action definition is a sequence of SoftICE
|
||
commands or other macros, separated by semicolons. You need not
|
||
terminate the final command with a semicolon.
|
||
|
||
Breakpoint actions are closely related to macros. Refer to Working
|
||
with Persistent Macros on page 162 for more information about macros.
|
||
Breakpoint actions are essentially unnamed macros that do not accept
|
||
command-line arguments. Breakpoint actions, like macros, can call upon
|
||
macros. In fact a prime use of macros is to simplify the creation of
|
||
complex breakpoint actions.
|
||
|
||
If you need to embed a literal quote character (") or a percent sign
|
||
(%) within the macro (breakpoint) body, precede the character with a
|
||
backslash character (\). To specify a literal backslash character, use
|
||
two consecutive backslashes (\\).
|
||
|
||
If a breakpoint is being logged (refer to the built-in function
|
||
BPLOG), the action will not be executed.
|
||
|
||
The following examples illustrate the basic use of breakpoint actions:
|
||
|
||
BPX EIP DO "dd eax"
|
||
BPX EIP DO "data 1;dd eax"
|
||
BPMB dataaddr if (byte(*dataaddr)==1) do "? IRQL"
|
||
|
||
Conditional Breakpoints
|
||
|
||
Conditional breakpoints provide a fast and easy way to isolate a
|
||
specific condition or state within the system or application you are
|
||
debugging. By setting a breakpoint on an instruction or memory address
|
||
and supplying a conditional expression, SoftICE will only trigger if
|
||
the breakpoint evaluates to non-zero (TRUE). Because the SoftICE
|
||
expression evaluator handles complex expressions easily, conditional
|
||
expressions take you right to the problem or situation you want to
|
||
debug with ease.
|
||
|
||
All SoftICE breakpoint commands (BPX, BPM, BPIO, BMSG, and BPINT)
|
||
accept conditional expressions using the following syntax:
|
||
|
||
breakpoint-command [ breakpoint options] [IF conditional expression]
|
||
[DO "commands"]
|
||
|
||
The IF keyword, when present, is followed by any expression that you
|
||
want to be evaluated when the breakpoint is triggered. The breakpoint
|
||
will be ignored if the conditional expression is FALSE (zero). When
|
||
the conditional expression is TRUE (non-zero), SoftICE pop ups and
|
||
displays the reason for the break, which includes the conditional
|
||
expression.
|
||
|
||
The following examples show conditional expressions used during the
|
||
development of SoftICE.
|
||
|
||
Note: Most of these examples contain system-specific values that vary
|
||
depending on the exact version of Windows NT you are running.
|
||
|
||
* Watch a thread being activated:
|
||
|
||
bpx ntoskrnl!SwapContext IF (edi==0xFF8B4020)
|
||
|
||
* Watch a thread being deactivated:
|
||
|
||
bpx ntoskrnl!SwapContext IF (esi==0xFF8B4020)
|
||
|
||
* Watch CSRSS HWND objects (type 1) being created:
|
||
|
||
bpx winsrv!HMAllocObject IF (esp->c == 1)
|
||
|
||
* Watch CSRSS thread info objects (type 6) being destroyed:
|
||
|
||
bpx winsrv!HMFreeObject+0x25 IF (byte(esi->8) == 6)
|
||
|
||
* Watch process object-handle-tables being created:
|
||
|
||
bpx ntoskrnl!ExAllocatePoolWithTag IF (esp->c == <20>Obtb')
|
||
|
||
* Watch a thread state become terminated (enum == 4):
|
||
|
||
bpmb _thread->29 IF byte(_thread->29) == 4)
|
||
|
||
* Watch a heap block (230CD8) get freed:
|
||
|
||
bpx ntddl!RtlFreeHeap IF (esp->c == 230CD8)
|
||
|
||
* Watch a specific process make a system call:
|
||
|
||
bpint 2E if (process == _process)
|
||
|
||
Many of the previous examples use the thread and process intrinsic
|
||
functions provided by SoftICE. These functions refer to the active
|
||
thread or process in the operating system. In some cases, the examples
|
||
precede the function name with an underscore "_". This is a special
|
||
feature that makes it easier to refer to a dynamic value such as a
|
||
register's contents or the currently running thread or process as a
|
||
constant. The following examples should help to clarify this concept:
|
||
|
||
* This example sets a conditional breakpoint that will be triggered if
|
||
the dynamic (run-time) value of the EAX register equals its current
|
||
value.
|
||
|
||
bpx eip IF (eax == _eax)
|
||
|
||
This is equivalent to:
|
||
|
||
? EAX
|
||
00010022
|
||
bpx eip IF (eax == 10022)
|
||
|
||
* This example sets a conditional breakpoint that will be triggered if
|
||
the value of an executing thread's thread-id matches the thread-id of
|
||
the currently executing thread.
|
||
|
||
bpx eip IF (tid == _tid)
|
||
|
||
This is equivalent to:
|
||
|
||
? tid
|
||
8
|
||
bpx eip IF (tid == 8)
|
||
|
||
When you precede a function name or register with an underscore in an
|
||
expression, the function is evaluated immediately and remains constant
|
||
throughout the use of that expression.
|
||
|
||
Conditional Breakpoint Count Functions
|
||
|
||
SoftICE supports the ability to monitor and control breakpoints based
|
||
on the number of times a particular breakpoint has or has not been
|
||
triggered. You can use the following count functions in conditional
|
||
expressions:
|
||
|
||
* BPCOUNT
|
||
|
||
* BPMISS
|
||
|
||
* BPTOTAL
|
||
|
||
* BPLOG
|
||
|
||
* BPINDEX
|
||
|
||
BPCOUNT
|
||
|
||
The value for the BPCOUNT function is the current number of times that
|
||
the breakpoint has been evaluated as TRUE.
|
||
|
||
Use this function to control the point at which a triggered breakpoint
|
||
causes a popup to occur. Each time the breakpoint is triggered, the
|
||
conditional expression associated with the breakpoint is evaluated. If
|
||
the condition evaluates to TRUE, the breakpoint instance count
|
||
(BPCOUNT) increments by one. If the conditional evaluates to FALSE,
|
||
the breakpoint miss instance count (BPMISS) increments by one.
|
||
|
||
Example:
|
||
|
||
The fifth time the breakpoint triggers, the BPCOUNT equals 5, so
|
||
the conditional expression evaluates to TRUE and SoftICE pops up.
|
||
|
||
bpx myaddr IF (bpcount==5)
|
||
|
||
Use BPCOUNT only on the righthand side of compound conditional
|
||
expressions for BPCOUNT to increment correctly:
|
||
|
||
bpx myaddr if (eax==1) && (bpcount==5)
|
||
|
||
Due to the early-out algorithm employed by the expression evaluator,
|
||
the BPCOUNT==5 expression will not be evaluated unless EAX==1. (The C
|
||
language works the same way.) Therefore, by the time BPCOUNT==5 gets
|
||
evaluated, the expression is TRUE. BPCOUNT will be incremented and if
|
||
it equals 5, the full expression evaluates to TRUE and SoftICE pops
|
||
up. If BPCOUNT != 5, the expression fails, BPMISS is incremented and
|
||
SoftICE will not pop up (although BPCOUNT is now 1 greater).
|
||
|
||
Once the full expression returns TRUE, SoftICE pops up, and all
|
||
instance counts (BPCOUNT and BPMISS) are reset to 0.
|
||
|
||
Note: Do not use BPCOUNT before the conditional expression, otherwise
|
||
BPCOUNT will not increment correctly:
|
||
|
||
bpx myaddr if (bpcount==5) && (eax==1)
|
||
|
||
BPMISS
|
||
|
||
The value for the BPMISS expression function is the current number of
|
||
times that the breakpoint was evaluated as FALSE.
|
||
|
||
The expression function is similar to the BPCOUNT function. Use it to
|
||
specify that SoftICE pop up in situations where the breakpoint is
|
||
continually evaluating to FALSE. The value of BPMISS will always be
|
||
one less than you expect, because it is not updated until the
|
||
conditional expression is evaluated. You can use the (>=) operator to
|
||
correct this delayed update condition.
|
||
|
||
Example:
|
||
|
||
bpx myaddr if (eax==43) || (bpmiss>=5)
|
||
|
||
Due to the early-out algorithm employed by the expression evaluator,
|
||
if the expression eax==43 is ever TRUE, the conditional evaluates to
|
||
TRUE and SoftICE pops up. Otherwise, BPMISS is updated each time the
|
||
conditional evaluates to FALSE. After 5 consecutive failures, the
|
||
expression evaluates to TRUE and SoftICE pops up.
|
||
|
||
BPTOTAL
|
||
|
||
The value for the BPTOTAL expression function is the total number of
|
||
times that the breakpoint was triggered.
|
||
|
||
Use this expression function to control the point at which a triggered
|
||
breakpoint causes a popup to occur. The value of this expression is
|
||
the total number of times the breakpoint was triggered (refer to the
|
||
Hits field in the output of the BSTAT command) over its lifetime. This
|
||
value is never cleared.
|
||
|
||
Example:
|
||
|
||
The first 50 times this breakpoint is triggered, the condition
|
||
evaluates to FALSE and SoftICE will not pop up. Every time after
|
||
50, the condition evaluates to TRUE, and SoftICE pops up on this
|
||
and every subsequent trap.
|
||
|
||
bpx myaddr if (bptotal > 50)
|
||
|
||
You can use BPTOTAL to implement functionality identical to that of
|
||
BPCOUNT. Use the modulo "%" operator as follows:
|
||
|
||
if (!(bptotal%COUNT))
|
||
|
||
The COUNT is the frequency with which you want the breakpoint to
|
||
trigger. If COUNT is 4, SoftICE pops up every fourth time the
|
||
breakpoint triggers.
|
||
|
||
BPLOG
|
||
|
||
Use the BPLOG expression function to log the breakpoint to the history
|
||
buffer. SoftICE does not pop up when logged breakpoints trigger.
|
||
|
||
Note: Actions only execute when SoftICE pops up, so using actions with
|
||
the BPLOG function is pointless.
|
||
|
||
The BPLOG expression function always returns TRUE. It causes SoftICE
|
||
to log the breakpoint and relevant information about the breakpoint to
|
||
the SoftICE history buffer.
|
||
|
||
Example:
|
||
|
||
Any time the breakpoint triggers and the value of EAX equals 1,
|
||
SoftICE logs the breakpoint in the history buffer. SoftICE will
|
||
not popup.
|
||
|
||
bpx myaddr if ((eax==1) && bplog)
|
||
|
||
BPINDEX
|
||
|
||
Use the BPINDEX expression function to obtain the breakpoint index to
|
||
use with breakpoint actions.
|
||
|
||
This expression function returns the index of the breakpoint that
|
||
caused SoftICE to pop up. This index is the same index used by the BL,
|
||
BC, BD, BE, BPE, BPT, and BSTAT commands. You can use this value as a
|
||
parameter to any command that is being executed as an action.
|
||
|
||
Example:
|
||
|
||
This example of a breakpoint action causes the BSTAT command to
|
||
be executed with the breakpoint that caused the action to be
|
||
executed as its parameter:
|
||
|
||
bpx myaddr do "bstat bpindex"
|
||
|
||
This example shows a breakpoint that uses an action to create
|
||
another breakpoint:
|
||
|
||
bpx myaddr do "t;bpx @esp if(tid==_tid) do \"bc bpindex\";g"
|
||
|
||
Note: BPINDEX is intended to be used with breakpoint actions, and
|
||
causes an error if it is used within a conditional expression. Its use
|
||
outside of actions is allowed, but the result is unspecified and you
|
||
should not rely on it.
|
||
|
||
Using Local Variables in Conditional Expressions
|
||
|
||
SoftICE lets you use local variable names in conditional expressions
|
||
as long as the type ofbreakpoint is an execution breakpoint (BPX or
|
||
BPM X). SoftICE does not recognize local symbols in conditional
|
||
expressions for other breakpoint types, such as BPIO or BPMD RW,
|
||
because they require an execution scope. This type of breakpoint is
|
||
not tied to a specific section of executing code, so local variables
|
||
have no meaning.
|
||
|
||
When using local variables in conditional expressions, functions
|
||
typically have a prologue where local variables are created and an
|
||
epilogue where they are destroyed. You can access local variables
|
||
after the prologue code completes execution and before the epilogue
|
||
code begins execution. Function parameters are also temporarily
|
||
inaccessible using symbol names during prologue and epilogue
|
||
execution, because of adjustments to the stack frame.
|
||
|
||
To avoid these restrictions, set a breakpoint on either the first or
|
||
last source code line within the function body. The following concepts
|
||
use the foobar function to explain this concept.
|
||
|
||
Foobar Function
|
||
|
||
1:DWORD foobar ( DWORD foo )
|
||
2:{
|
||
3: DWORD fooTmp=0;
|
||
4:
|
||
5: if(foo)
|
||
6: {
|
||
7: fooTmp=foo*2;
|
||
8: }else{
|
||
9: fooTmp=1;
|
||
10: }
|
||
11:
|
||
12: return fooTmp;
|
||
13:}
|
||
|
||
Source code lines 1 and 2 are outside the function body. These lines
|
||
execute the prologue code. If you use a local variable at this point,
|
||
you receive the following symbol error:
|
||
|
||
:BPX foobar if(foo==1)
|
||
error: Undefined Symbol (foo)
|
||
|
||
Set the conditional on the source code line 3 where the local variable
|
||
fooTmp is declared and initialized, as follows:
|
||
|
||
:BPX .3 if(foo==0)
|
||
|
||
Source code line 13 marks the end of the function body. It also begins
|
||
epilogue code execution; thus, local variables and parameters are out
|
||
of scope. To set a conditional at the end of the foobar function, use
|
||
source line 12, as follows:
|
||
|
||
:BPX.12 if(fooTmp==1)
|
||
|
||
Note: Although it is possible to use local variables as the input to a
|
||
breakpoint command, such as BPMD RW, you should avoid doing this.
|
||
Local variables are relative to the stack, so their absolute address
|
||
changes each time the function scope where the variable is declared
|
||
executes. When the original function scope exits, the address tied to
|
||
the breakpoint no longer refers to the value of the local variable.
|
||
|
||
Referencing the Stack in Conditional Breakpoints
|
||
|
||
If you create your symbol file with full symbol information, you can
|
||
access function parameters and local variables through their symbolic
|
||
names, as described in Using Local Variables in Conditional
|
||
Expressions. If, however, you are debugging without full symbol
|
||
information, you need to reference function parameters and local
|
||
variables on the stack. For example, if you translated a module with
|
||
publics only or you want to debug a function for an operating system,
|
||
reference function parameters and local variables on the stack.
|
||
|
||
This section is specific to 32-bit flat application or system code.
|
||
|
||
Function parameters are passed on the stack, so you need to
|
||
de-reference these parameters through the ESP or EBP registers. Which
|
||
one you use depends on the function's prologue and where you set the
|
||
actual breakpoint in relation to that prologue.
|
||
|
||
Most 32-bit functions have a prologue of the following form:
|
||
|
||
PUSH EBP
|
||
MOV EBP,ESP
|
||
SUB ESP,size (locals)
|
||
|
||
Which sets up a stack frame as follows:
|
||
|
||
Stack Top PARAM n ESP+(n*4), or
|
||
EBP+(n*4)+4 Pushed by
|
||
PARAM #2 ESP+8, or EBP+C Caller
|
||
|
||
PARAM #1 ESP+4, or EBP+8
|
||
|
||
RET EIP Stack pointer on
|
||
Entry
|
||
Current Base Pointer (PUSH
|
||
EBP SAVE EBP EBP, MOV EBP,ESP)
|
||
LOCALS+SIZE-1 Call prologue
|
||
|
||
Stack Pointer after
|
||
LOCALS+0 prologue (SUB ESP,
|
||
size(locals)
|
||
|
||
SAVE EBX Optional save of "C"
|
||
registers Register
|
||
SAVE ESI saved by
|
||
Stack Current Stack pointer after compiler
|
||
Bottom ESP SAVE EDI registers are saved
|
||
|
||
Use either the ESP or EBP register to address parameters. Using the
|
||
EBP register is not valid until the PUSH EBP and MOV EBP, ESP
|
||
instructions are executed. Also note that once space for local
|
||
variables is created (SUB ESP,size) the position of the parameters
|
||
relative to ESP needs to be adjusted by the size of the local
|
||
variables and any saved registers.
|
||
|
||
Typically you set a breakpoint on the function address, for example:
|
||
|
||
BPX IsWindow
|
||
|
||
When this breakpoint is triggered, the prologue has not been executed,
|
||
and parameters can easily be accessed through the ESP register. At
|
||
this point, use of EBP is not valid.
|
||
|
||
To be sure that de-referencing the stack in a conditional expression
|
||
operates as you would expect, use the following guidelines.
|
||
|
||
Note: This assumes a stack-based calling convention with arguments
|
||
pushed right-to-left.
|
||
|
||
* If you set a breakpoint at the exact function address, for example,
|
||
BPX IsWindow, use ESP+(param# * 4) to address parameters, where param#
|
||
is 1...n.
|
||
|
||
* If you set a breakpoint inside a function body (after the full
|
||
prologue has been executed), use EBP+(param# * 4)+4 to address
|
||
parameters, where param# is 1...n. Be sure that the routine does not
|
||
use the EBP register for a purpose other than a stack-frame.
|
||
|
||
* Functions that are assembly-language based or are optimized for
|
||
frame-pointer omission may require that you use the ESP register,
|
||
because EBP may not be set up correctly.
|
||
|
||
Note: Once the space for local variables is allocated on the stack,
|
||
the local variables can be addressed using a negative offset from EBP.
|
||
The first local variable is at EBP-4. Simple data types are typically
|
||
Dword sized, so their offset can be calculated in a manner similar to
|
||
function parameters. For example, with two pointer local variables,
|
||
one will be at EBP-4 and the other will be at EBP-8.
|
||
|
||
Performance
|
||
|
||
Conditional breakpoints have some overhead associated with run-time
|
||
evaluation. Under most circumstances you see little or no effect on
|
||
performance when using conditional expressions. In situations where
|
||
you set a conditional breakpoint on a highly accessed data variable or
|
||
code sequence, you may notice slower system performance. This is due
|
||
to the fact that every time the breakpoint is triggered, the
|
||
conditional expression is evaluated. If a routine is executed hundreds
|
||
of times per second (such as ExAllocatePool or SwapContext), the fact
|
||
that any type of breakpoint with or without a conditional is trapped
|
||
and evaluated with this frequency results in some performance
|
||
degradation.
|
||
|
||
Duplicate Breakpoints
|
||
|
||
Once a breakpoint is set on an address, you cannot set another
|
||
breakpoint on the same address. With conditional expressions, however,
|
||
you can create a compound expression using the logical operators (&&)
|
||
or (||) to test more than one condition at the same address.
|
||
|
||
Elapsed Time
|
||
|
||
SoftICE supports using the time stamp counter (RDTSC instruction) on
|
||
all Pentium and Pentium-Pro machines. When SoftICE first starts, it
|
||
displays the clock speed of the machine on which it is running. Every
|
||
time SoftICE pops up due to a breakpoint, the elapsed time displays
|
||
since the last time SoftICE popped up. The time displays after the
|
||
break reason in seconds, milliseconds, or microseconds:
|
||
|
||
Break due to G (ET=23.99 microseconds)
|
||
|
||
The Pentium cycle counter is highly accurate, but you must keep the
|
||
following two issues in mind:
|
||
|
||
1- There is overhead involved in popping SoftICE up and down. On a
|
||
100MHz machine, this takes approximately 5 microseconds. This number
|
||
is slightly variable due to caching and privilege level changes.
|
||
|
||
2- If a hardware interrupt occurs before the breakpoint goes off, all
|
||
the interrupt processing time is included. Interrupts are off when
|
||
SoftICE pops up, so a hardware interrupt almost always goes off as
|
||
soon as Windows NT resumes.
|
||
|
||
Breakpoint Statistics
|
||
|
||
SoftICE collects statistical information about each breakpoint,
|
||
including the following:
|
||
|
||
* Total number of hits, breaks, misses, and errors
|
||
|
||
* Current hits and misses
|
||
|
||
Use the BSTAT command to display this information. Refer to the
|
||
SoftICE Command Reference for more information on the BSTAT command.
|
||
|
||
Referring to Breakpoints in Expressions
|
||
|
||
You can combine the prefix "BP" with the breakpoint index to use as a
|
||
symbol in an expression. This works for all BPX and BPM breakpoints.
|
||
SoftICE uses the actual address of the breakpoint.
|
||
|
||
Example:
|
||
|
||
To disassemble code at the address of the breakpoint with index
|
||
0, use the command:
|
||
|
||
U BP0
|
||
|
||
Manipulating Breakpoints
|
||
|
||
SoftICE provides a variety of commands for manipulating breakpoints
|
||
such as listing, modifying, deleting, enabling, disabling, and
|
||
recalling breakpoints. Breakpoints are identified by breakpoint index
|
||
numbers, which are numbers ranging from 0 to FF (hex). Breakpoint
|
||
index numbers are assigned sequentially as breakpoints are added. The
|
||
following table describes the breakpoint manipulation commands:
|
||
|
||
BD Disable a breakpoint
|
||
BE Enable a breakpoint
|
||
BL List current breakpoints
|
||
BPEEdit a breakpoint
|
||
BPTUse breakpoint as template
|
||
BC Clear (remove) a breakpoint
|
||
BH Display breakpoint history
|
||
|
||
Note: Refer to the SoftICE Command Reference for more information on
|
||
each of these commands.
|
||
|
||
Using Embedded Breakpoints
|
||
|
||
It may be helpful for you to embed a breakpoint in your program source
|
||
rather than setting a breakpoint with SoftICE. To embed a breakpoint
|
||
in your program, do the following:
|
||
|
||
1 Place an INT 1 or INT 3 instruction at the desired point in the
|
||
program source.
|
||
|
||
2 To enable SoftICE to pop up on such embedded breakpoints, use the
|
||
following command:
|
||
|
||
SET I1HERE ON ; for INT 1 breakpoints
|
||
SET I3HERE ON ; for INT 3 breakpoints
|