/***********************************************************************/
TURBO DEBUGGER
TIPS AND HINTS
This file contains tips and hints concerning problems you might
encounter while using TD.EXE,TDW.EXE,and TD32.EXE,The following
topics are covered:
1,TDW.INI
2,TDW Hardware Debugging
3,Running TDW under Windows For Workgroups
4,Restart Information/Session State Saving
5,Program Reset
6,Program Interrupt Key
7,Resetting and restarting programs
8,Video Support
9,Windows debugging hints
10,Answers to common questions
------------
1,TDW.INI
------------
You must have a single copy of TDW.INI located on your system,and
it must be located in your main Windows directory (usually "\WINDOWS").
Be sure to delete any extra copies of TDW.INI that you might have on
your system.
By default,TDW.INI contains the following text:
[TurboDebugger]
VideoDll = <Your_BorlandC_Bin_Directory>\SVGA.DLL
debuggerDll = <Your_BorlandC_Bin_Directory>\TDWINTH.DLL
[VideoOptions]
You can use TD32 to debug under Win32s,However,to do so,you must
ensure you use SVGA.DLL or equivalent support in the VideoDLL entry
in the [TurboDebugger] section of TDW.INI,Use the Turbo Debugger Video
Configuration utility (TDWINI.EXE) to set the required option.
---------------------------
2,TDW Hardware Debugging
---------------------------
In order to support hardware debugging in TDW,you need to load
the device driver TDDEBUG.386,Edit your SYSTEM.INI file in the \WINDOWS
directory and add the following statement to the [386enh] section:
device=<Your_BorlandC_Bin_Directory>\TDDEBUG.386
Make sure that you comment out the line that loads the Windows driver
WINDEBUG.386 with a semicolon,For example:;c:\windows\windebug.386
---------------------------------------------
3,Running TDW under Windows For Workgroups
---------------------------------------------
If you use Windows for Workgroups 3.11,you must use TDWINTH.DLL when
you debug with TDW,Be sure the DebuggerDll setting in your
TDW.INI file explicitly points to TDWINTH.DLL,For example:
debuggerDll=<Your_BorlandC_Bin_Directory>\TDWINTH.DLL
---------------------------------------------
4,Restart Information/Session State Saving
---------------------------------------------
Turbo Debugger saves Breakpoint,Inspector,and other session information
when you exit a debugging session,Then,when you restart a debugging
session,Turbo Debugger restores this information,To ignore the restart
information,use Turbo Debugger's -ji command line switch when you load
Turbo Debugger.
If your system crashes during a debugging session,your configuration
file is likely to become corrupt,This can cause Turbo Debugger to hang
on startup,Because of this,it is advisable to delete any,TR,.TRW,or
.TR2 files from your hard disk if you crash during a debugging session.
------------------
5,Program Reset
------------------
Dialog applications that do not have a parent window will cause your
system to hang if you reload the application.
--------------------------
6,Program Interrupt Key
--------------------------
Under TD,Ctrl-Break
Under TDW,Ctrl-Alt-SysReq
Under Win32s,Ctrl-Alt-F11
Under NT,F12
--------------------------------------
7,Resetting and restarting programs
--------------------------------------
When you reload or reset a program a number of times under Windows 32s,
it is likely that you will run out of memory,This problem has been
reported to Microsoft.
If Turbo Debugger fails to start correctly,especially after a system
crash,the debugger session state and configuration files may be
corrupted,Try removing the following files:
For TD,TDCONFIG.TD
***.TR
For TDW,TDCONFIG.TDW
***.TRW
For TD32,TDCONFIG.TD2
***.TR2
Where *** equals your application's name.
These files will be found in either the working directory,
the \BorlandC\Bin directory,or the \Windows directory.
------------------
8,Video Support
------------------
Turbo Debugger requires that you use the correct Windows video driver
for your video card,For example,if you have a TSENG card,make sure
that you are using the TSENG Windows video driver (the generic VGA
video driver does not work correctly with this video card).
To find out what type of video card you have installed in your
machine,type MSD <Enter> at the DOS prompt,Use the TDWINI.EXE
utility to set up your video driver.
SVGA.DLL supports most video card configurations,provided that you
are using the correct Windows video drivers,Use the Turbo Debugger Video
Configuration utility (TDWINI.EXE) to determine the correct Video Support
for your adapter,
Screen not being repainted
--------------------------
Ensure that the "ForceRepaint" flag is set to "Yes" in the
VideoOptions section of TDW.INI:
[VideoOptions]
ForceRepaint=Yes
This can be done through the Turbo Debugger Video Configuration
utility (TDWINI.EXE).
Dual Monitor Support under Windows 32s
--------------------------------------
TD32 can support dual monitor debugging under Windows 32s.
Ensure that a monochrome adapter is installed in your machine
and set the Mono flag in the [VideoOptions] section of TDW.INI
to "Yes."
[VideoOptions]
MONO=yes
This can be done through the Turbo Debugger Video Configuration
utility,TDWINI.EXE.
---------------------------
9,Windows debugging hints
---------------------------
View|Windows Messages
1) If you set up View|Windows Messages to display messages for
more than one procedure or handle or both,do not log all
messages,Instead,log specific messages for each procedure or
handle,If you log all messages,the system might hang,in
which case you will have to reboot to continue,This behavior
is due to the large number of messages being transferred
between Windows and Turbo Debugger.
2) When setting a break on the Mouse class of messages,note that
a "mouse down" message must be followed by a "mouse up" message
before the keyboard will become active again,When you return
to the application,you might have to press the mouse button
several times (or press the <ALT> key) to get Windows to receive a
"mouse up" message,You'll know Windows has received the message
when you see it in the bottom pane of the Windows Message window
after the program breaks.
--------------------------------
10,Answers to common questions
--------------------------------
Following is a list of the most commonly asked questions about TDW:
1) Are there any syntactic or parsing differences between Turbo
Debugger's C expression evaluation and Turbo C++ for Windows'?
You can't pass constant-string arguments when evaluating
functions.
OK,myfunc(123) myfunc(string_variable)
BAD,myfunc("constant")
2) What should I be aware of when I am debugging multilanguage
programs with Turbo Debugger?
Turbo Debugger's default source language is "Source," which
means it chooses the expression language based on the current
source module,This can cause some confusion if your program
has source modules written in different languages (like C
and assembler),Since you are actually entering a language
expression any time Turbo Debugger prompts you for a value
or an address,this can cause some unexpected results:
a,Even if you are in a CPU window or a Dump window,you
must still enter addresses in the source language,
despite the fact that the window is displaying in hex.
For example,to display the contents of memory address
1234:5678,you must type one of the following
expressions,depending on your current source language:
C 0x1234:0x5678
Pascal $1234:$5678
Assembler 1234H:5678H
b,When your current language is assembler,you must be
careful when entering hex numbers,since they are
interpreted EXACTLY as they would be in an assembler
source file,This means that if you want to enter a
number that starts with one of the hex digits A - F,you
must first precede the letter with a 0 so Turbo Debugger
knows you are entering a number,Likewise,if your number
ends in B or D (indicating a binary or decimal number),you
must add an H to indicate that you really want a hex number:
OK,0aaaa 123dh 89abh
BAD,aaaa 123d 89ab
3) Why does the text "Cannot be changed" come up when I do an
assignment in the Data/Evaluate/Modify "New value" pane?
If you use the Data/Evaluate/Modify command (Ctrl-F4) to
change a variable by direct assignment,the "New value" pane
will say "Cannot be changed." This doesn't mean the
assignment didn't take effect,What it does mean is that the
assignment expression as a whole is not a memory-referencing
expression whose value you can change by moving to the
bottom pane,Here are some examples of direct assignment
expressions:
C x = 4
Pascal ratio,= 1.234
Assembler wval = 4 shl 2
If you had typed just "x," "ratio," or "wval" into the top
pane,then you would be able to move to the bottom pane and
enter a new value,The direct assignment method using the
"=" or ":=" assignment operator is quicker and more
convenient if you don't care about examining the value of
the variable before modifying it.
4) What could happen when global breakpoints are set on local
variables?
When you set global breakpoints using local variables,make
sure the breakpoints are cleared before you exit the
procedure or function that the variables are defined in,The
best way to do this is to put a breakpoint on the last line
of the procedure or function,If you do not clear the
breakpoints,your program will break unexpectedly and may
even hang on some machines because the breakpoints are being
set in memory that is not currently being used by the
procedure or function.
5) Why is execution slower when tracing (F7) than when stepping
(F8) through my programs?
TDW can do reverse execution,which means that when you are
tracing through your program,TDW could be saving all the
information about each source line you trace over,TDW only
saves this information in the Module window if you have chosen
View|Execution History and toggled the Full History local menu
command to 'Yes'.
If you want faster execution you can step over (F8) the instruction
or toggle the Full History option to 'No' in the Execution History
window,(Although reverse execution is always available in the
CPU view,you must toggle this option to 'Yes' for it to work
in the Module view,The default setting in the Module view is 'No'.)
6) What are some of the syntactic and parsing differences
between Turbo Debugger's built-in assembler and the
standalone Turbo Assembler?
A discussion follows this short example program:
,model small
,data
abc struc
mem1 dd?
mem2 db?
mem3 db " "
abc ends
align 16
a abc <1,2,"xyz">
msg1 db "testing 1 2 3",0
msg2 db "hello world",0
nmptr dw msg1
fmptr dd msg1,msg2
nfmptr dw fmptr
xx dw seg a
,code
push cs
pop ds
mov bx,offset a
mov bx,nmptr
les si,fmptr
mov ah,4ch
int 21h
end
Because the assembler expression parser does not accept all legal
TASM instruction operands,Turbo Debugger assembler expressions
can be more general than those of TASM and can use multiple levels
of memory-referencing,much like C and Pascal,However,there are a
few constructs that you may be used to that you'll have to specify
differently for the Turbo Debugger assembler expression parser to
accept them:
a,Size overrides should always appear inside the
brackets; PTR is optional after the size,Also,when
referring to a structure,you must use the name of the
structure,not the name of the variable:
OK,[byte ptr bx] [dword si] [abc bx]
BAD,byte ptr[bx] [struc abc bx] [a bx]
b,You must specify a structure name when accessing the
members of a structure with a register pointer.
OK,[abc ptr bx].mem1 [abc bx].mem3 + 1
BAD,[bx].mem1
c,You can't use multiple instances of brackets ([]) unless they are
adjacent,and you can only follow a bracketed expression with
a dot and a structure member name or another bracketed
expression:
OK,4[bx][si] [abc bx].mem2
BAD,[bx]4[si] [bx]+4
d,If you use a register as part of a memory expression
and you don't specify a size,WORD is assumed:
[bx] is the same as [word bx]
e,You can use any register you want between brackets ([]),
not just the combinations of BX,BP,SI,and DI allowed in
instruction operands,For example,
[ax+bx]
[bx+sp]
f,You can use multiple levels of brackets to follow chains of
pointers,For example,
[byte [[nfmptr]+4]]
g,Be careful with using registers to access memory locations.
You might get unexpected results if your segment
registers are not set up properly,If you don't
explicitly specify a segment register,Turbo Debugger
uses the DS register to reference memory.
h,When you do specify a segment register,make sure you
follow the same rule for size overrides,put it
INSIDE the brackets,as follows:
OK,[byte es:di] [es:fmptr]
BAD,es:[byte di]
i,Use the OFFSET operator to get the address of a
variable or structure,Turbo Debugger automatically
supplies the brackets around a variable name if you just type
the variable name alone.
a contents of structure a
[a] contents of structure a
offset a address of structure a
j,You can use the type overrides and the format control
count to examine any area of memory displayed as you wish.
[byte es:bx],10 10 bytes pointed to by es:bx
[dword ds:si],4 4 dwords pointed to by ds:si
This is very useful when specifying watch expressions.
k,Sometimes you use a word memory location or register to
point to a paragraph in memory that contains a data
structure,Access the structure with expressions like
[abc [xx]:0].mem1
[abc es:0].mem3
/************************* END OF FILE *****************************/
TURBO DEBUGGER
TIPS AND HINTS
This file contains tips and hints concerning problems you might
encounter while using TD.EXE,TDW.EXE,and TD32.EXE,The following
topics are covered:
1,TDW.INI
2,TDW Hardware Debugging
3,Running TDW under Windows For Workgroups
4,Restart Information/Session State Saving
5,Program Reset
6,Program Interrupt Key
7,Resetting and restarting programs
8,Video Support
9,Windows debugging hints
10,Answers to common questions
------------
1,TDW.INI
------------
You must have a single copy of TDW.INI located on your system,and
it must be located in your main Windows directory (usually "\WINDOWS").
Be sure to delete any extra copies of TDW.INI that you might have on
your system.
By default,TDW.INI contains the following text:
[TurboDebugger]
VideoDll = <Your_BorlandC_Bin_Directory>\SVGA.DLL
debuggerDll = <Your_BorlandC_Bin_Directory>\TDWINTH.DLL
[VideoOptions]
You can use TD32 to debug under Win32s,However,to do so,you must
ensure you use SVGA.DLL or equivalent support in the VideoDLL entry
in the [TurboDebugger] section of TDW.INI,Use the Turbo Debugger Video
Configuration utility (TDWINI.EXE) to set the required option.
---------------------------
2,TDW Hardware Debugging
---------------------------
In order to support hardware debugging in TDW,you need to load
the device driver TDDEBUG.386,Edit your SYSTEM.INI file in the \WINDOWS
directory and add the following statement to the [386enh] section:
device=<Your_BorlandC_Bin_Directory>\TDDEBUG.386
Make sure that you comment out the line that loads the Windows driver
WINDEBUG.386 with a semicolon,For example:;c:\windows\windebug.386
---------------------------------------------
3,Running TDW under Windows For Workgroups
---------------------------------------------
If you use Windows for Workgroups 3.11,you must use TDWINTH.DLL when
you debug with TDW,Be sure the DebuggerDll setting in your
TDW.INI file explicitly points to TDWINTH.DLL,For example:
debuggerDll=<Your_BorlandC_Bin_Directory>\TDWINTH.DLL
---------------------------------------------
4,Restart Information/Session State Saving
---------------------------------------------
Turbo Debugger saves Breakpoint,Inspector,and other session information
when you exit a debugging session,Then,when you restart a debugging
session,Turbo Debugger restores this information,To ignore the restart
information,use Turbo Debugger's -ji command line switch when you load
Turbo Debugger.
If your system crashes during a debugging session,your configuration
file is likely to become corrupt,This can cause Turbo Debugger to hang
on startup,Because of this,it is advisable to delete any,TR,.TRW,or
.TR2 files from your hard disk if you crash during a debugging session.
------------------
5,Program Reset
------------------
Dialog applications that do not have a parent window will cause your
system to hang if you reload the application.
--------------------------
6,Program Interrupt Key
--------------------------
Under TD,Ctrl-Break
Under TDW,Ctrl-Alt-SysReq
Under Win32s,Ctrl-Alt-F11
Under NT,F12
--------------------------------------
7,Resetting and restarting programs
--------------------------------------
When you reload or reset a program a number of times under Windows 32s,
it is likely that you will run out of memory,This problem has been
reported to Microsoft.
If Turbo Debugger fails to start correctly,especially after a system
crash,the debugger session state and configuration files may be
corrupted,Try removing the following files:
For TD,TDCONFIG.TD
***.TR
For TDW,TDCONFIG.TDW
***.TRW
For TD32,TDCONFIG.TD2
***.TR2
Where *** equals your application's name.
These files will be found in either the working directory,
the \BorlandC\Bin directory,or the \Windows directory.
------------------
8,Video Support
------------------
Turbo Debugger requires that you use the correct Windows video driver
for your video card,For example,if you have a TSENG card,make sure
that you are using the TSENG Windows video driver (the generic VGA
video driver does not work correctly with this video card).
To find out what type of video card you have installed in your
machine,type MSD <Enter> at the DOS prompt,Use the TDWINI.EXE
utility to set up your video driver.
SVGA.DLL supports most video card configurations,provided that you
are using the correct Windows video drivers,Use the Turbo Debugger Video
Configuration utility (TDWINI.EXE) to determine the correct Video Support
for your adapter,
Screen not being repainted
--------------------------
Ensure that the "ForceRepaint" flag is set to "Yes" in the
VideoOptions section of TDW.INI:
[VideoOptions]
ForceRepaint=Yes
This can be done through the Turbo Debugger Video Configuration
utility (TDWINI.EXE).
Dual Monitor Support under Windows 32s
--------------------------------------
TD32 can support dual monitor debugging under Windows 32s.
Ensure that a monochrome adapter is installed in your machine
and set the Mono flag in the [VideoOptions] section of TDW.INI
to "Yes."
[VideoOptions]
MONO=yes
This can be done through the Turbo Debugger Video Configuration
utility,TDWINI.EXE.
---------------------------
9,Windows debugging hints
---------------------------
View|Windows Messages
1) If you set up View|Windows Messages to display messages for
more than one procedure or handle or both,do not log all
messages,Instead,log specific messages for each procedure or
handle,If you log all messages,the system might hang,in
which case you will have to reboot to continue,This behavior
is due to the large number of messages being transferred
between Windows and Turbo Debugger.
2) When setting a break on the Mouse class of messages,note that
a "mouse down" message must be followed by a "mouse up" message
before the keyboard will become active again,When you return
to the application,you might have to press the mouse button
several times (or press the <ALT> key) to get Windows to receive a
"mouse up" message,You'll know Windows has received the message
when you see it in the bottom pane of the Windows Message window
after the program breaks.
--------------------------------
10,Answers to common questions
--------------------------------
Following is a list of the most commonly asked questions about TDW:
1) Are there any syntactic or parsing differences between Turbo
Debugger's C expression evaluation and Turbo C++ for Windows'?
You can't pass constant-string arguments when evaluating
functions.
OK,myfunc(123) myfunc(string_variable)
BAD,myfunc("constant")
2) What should I be aware of when I am debugging multilanguage
programs with Turbo Debugger?
Turbo Debugger's default source language is "Source," which
means it chooses the expression language based on the current
source module,This can cause some confusion if your program
has source modules written in different languages (like C
and assembler),Since you are actually entering a language
expression any time Turbo Debugger prompts you for a value
or an address,this can cause some unexpected results:
a,Even if you are in a CPU window or a Dump window,you
must still enter addresses in the source language,
despite the fact that the window is displaying in hex.
For example,to display the contents of memory address
1234:5678,you must type one of the following
expressions,depending on your current source language:
C 0x1234:0x5678
Pascal $1234:$5678
Assembler 1234H:5678H
b,When your current language is assembler,you must be
careful when entering hex numbers,since they are
interpreted EXACTLY as they would be in an assembler
source file,This means that if you want to enter a
number that starts with one of the hex digits A - F,you
must first precede the letter with a 0 so Turbo Debugger
knows you are entering a number,Likewise,if your number
ends in B or D (indicating a binary or decimal number),you
must add an H to indicate that you really want a hex number:
OK,0aaaa 123dh 89abh
BAD,aaaa 123d 89ab
3) Why does the text "Cannot be changed" come up when I do an
assignment in the Data/Evaluate/Modify "New value" pane?
If you use the Data/Evaluate/Modify command (Ctrl-F4) to
change a variable by direct assignment,the "New value" pane
will say "Cannot be changed." This doesn't mean the
assignment didn't take effect,What it does mean is that the
assignment expression as a whole is not a memory-referencing
expression whose value you can change by moving to the
bottom pane,Here are some examples of direct assignment
expressions:
C x = 4
Pascal ratio,= 1.234
Assembler wval = 4 shl 2
If you had typed just "x," "ratio," or "wval" into the top
pane,then you would be able to move to the bottom pane and
enter a new value,The direct assignment method using the
"=" or ":=" assignment operator is quicker and more
convenient if you don't care about examining the value of
the variable before modifying it.
4) What could happen when global breakpoints are set on local
variables?
When you set global breakpoints using local variables,make
sure the breakpoints are cleared before you exit the
procedure or function that the variables are defined in,The
best way to do this is to put a breakpoint on the last line
of the procedure or function,If you do not clear the
breakpoints,your program will break unexpectedly and may
even hang on some machines because the breakpoints are being
set in memory that is not currently being used by the
procedure or function.
5) Why is execution slower when tracing (F7) than when stepping
(F8) through my programs?
TDW can do reverse execution,which means that when you are
tracing through your program,TDW could be saving all the
information about each source line you trace over,TDW only
saves this information in the Module window if you have chosen
View|Execution History and toggled the Full History local menu
command to 'Yes'.
If you want faster execution you can step over (F8) the instruction
or toggle the Full History option to 'No' in the Execution History
window,(Although reverse execution is always available in the
CPU view,you must toggle this option to 'Yes' for it to work
in the Module view,The default setting in the Module view is 'No'.)
6) What are some of the syntactic and parsing differences
between Turbo Debugger's built-in assembler and the
standalone Turbo Assembler?
A discussion follows this short example program:
,model small
,data
abc struc
mem1 dd?
mem2 db?
mem3 db " "
abc ends
align 16
a abc <1,2,"xyz">
msg1 db "testing 1 2 3",0
msg2 db "hello world",0
nmptr dw msg1
fmptr dd msg1,msg2
nfmptr dw fmptr
xx dw seg a
,code
push cs
pop ds
mov bx,offset a
mov bx,nmptr
les si,fmptr
mov ah,4ch
int 21h
end
Because the assembler expression parser does not accept all legal
TASM instruction operands,Turbo Debugger assembler expressions
can be more general than those of TASM and can use multiple levels
of memory-referencing,much like C and Pascal,However,there are a
few constructs that you may be used to that you'll have to specify
differently for the Turbo Debugger assembler expression parser to
accept them:
a,Size overrides should always appear inside the
brackets; PTR is optional after the size,Also,when
referring to a structure,you must use the name of the
structure,not the name of the variable:
OK,[byte ptr bx] [dword si] [abc bx]
BAD,byte ptr[bx] [struc abc bx] [a bx]
b,You must specify a structure name when accessing the
members of a structure with a register pointer.
OK,[abc ptr bx].mem1 [abc bx].mem3 + 1
BAD,[bx].mem1
c,You can't use multiple instances of brackets ([]) unless they are
adjacent,and you can only follow a bracketed expression with
a dot and a structure member name or another bracketed
expression:
OK,4[bx][si] [abc bx].mem2
BAD,[bx]4[si] [bx]+4
d,If you use a register as part of a memory expression
and you don't specify a size,WORD is assumed:
[bx] is the same as [word bx]
e,You can use any register you want between brackets ([]),
not just the combinations of BX,BP,SI,and DI allowed in
instruction operands,For example,
[ax+bx]
[bx+sp]
f,You can use multiple levels of brackets to follow chains of
pointers,For example,
[byte [[nfmptr]+4]]
g,Be careful with using registers to access memory locations.
You might get unexpected results if your segment
registers are not set up properly,If you don't
explicitly specify a segment register,Turbo Debugger
uses the DS register to reference memory.
h,When you do specify a segment register,make sure you
follow the same rule for size overrides,put it
INSIDE the brackets,as follows:
OK,[byte es:di] [es:fmptr]
BAD,es:[byte di]
i,Use the OFFSET operator to get the address of a
variable or structure,Turbo Debugger automatically
supplies the brackets around a variable name if you just type
the variable name alone.
a contents of structure a
[a] contents of structure a
offset a address of structure a
j,You can use the type overrides and the format control
count to examine any area of memory displayed as you wish.
[byte es:bx],10 10 bytes pointed to by es:bx
[dword ds:si],4 4 dwords pointed to by ds:si
This is very useful when specifying watch expressions.
k,Sometimes you use a word memory location or register to
point to a paragraph in memory that contains a data
structure,Access the structure with expressions like
[abc [xx]:0].mem1
[abc es:0].mem3
/************************* END OF FILE *****************************/