Dec 232017
Very slick "trace-back" program for TPascal 4.0.
File STKDMP.ZIP from The Programmer’s Corner in
Category Pascal Source Code
Very slick “trace-back” program for TPascal 4.0.
File Name File Size Zip Size Zip Type
STAKDUMP.ASM 9302 2079 deflated
STAKDUMP.DOC 4815 1963 deflated
STAKDUMP.OBJ 690 471 deflated
STAKDUMP.PAS 1156 552 deflated

Download File STKDMP.ZIP Here

Contents of the STAKDUMP.DOC file

STAKDUMP - Error handler with Stack Trace for Turbo Pascal 4.0
Kim Kokkonen
TurboPower Software
Version 1.0
Released to the public domain

When Turbo Pascal encounters a runtime error, it normally reports the error
number and the location of the error, and then halts execution. This is a
useful feature that allows you to track down errors quickly.

Knowing the location of the error is sometimes not enough. Suppose for
example that you have some small routines that are called from many places
within a program. If a runtime error occurs within one of those routines, you
probably won't have any idea why the error really occurred, since the small
routine could have been called from anywhere.

The STAKDUMP unit solves this problem by reporting not only the address of the
actual error, but also the addresses of all calls made in reaching the error.
The Turbo Graphix Toolbox for Turbo 3 has a similar routine but it isn't
adequate for Turbo 4, which mixes near and far calls as required by the unit
structure of the program.

STAKDUMP is a small unit that exports no identifiers at all. You use it by
inserting it as the first unit in the USES statement of your program. STAKDUMP
uses about 700 bytes of code space.

STAKDUMP automatically installs itself as a Turbo exit handler. When the
program terminates, the exit handler gains control. If a runtime error has
occurred, STAKDUMP writes the error number and the error address, followed by
any stacked return addresses. It writes to the standard output device after
first resetting it so that the results will appear on the console screen.

STAKDUMP reports addresses in the relative segment format used by the
compiler. The base code segment of the program is 0 in this format. You can
use any of the addresses with the TPC.EXE /F "find error" option to relate
back to the source code. Alternatively you can find the addresses in a MAP
file produced by the TPMAP utility.

STAKDUMP has one major limitation: it will work only when your program is run
as a standalone EXE file. Within the user-interface compiler TURBO.EXE, or
when run using the TPC /R option, the program's code is loaded in a different
manner and at different relative addresses than when it is an EXE file.
STAKDUMP senses these situations and simply passes control to the normal Turbo
error handler. Similarly, you can't use TURBO.EXE's "find error" command to
find errors reported when running the EXE file. You must use the TPC /F option
to find the source locations.

STAKDUMP traces the BP chain on the stack. While within any routine in Turbo
Pascal, the word at SS:[BP] contains the calling routine's BP value. (While
within the main block, SS:[BP] contains the initial value of the stack
pointer. This value is used to terminate the trace.) The word at SS:[BP+2]
contains the return offset of the current call. If the call was FAR, the word
at SS:[BP+4] contains the return segment of the current call. Otherwise,
SS:[BP+4] contains an undefined value, perhaps a parameter.

The tricky part of STAKDUMP lies in determining whether each call was NEAR or
FAR. It does so by doing a partial disassembly of the code. For each error
address, STAKDUMP scans forward in the object code until it finds a RET
instruction. Based on the type of the return instruction, STAKDUMP can tell
whether the current call was NEAR or FAR, and thus whether SS:[BP+4] has a new
code segment or not.

STAKDUMP must assume the presence of a chain of stack frame pointers. Code
generated by the Turbo compiler always maintains this chain by inserting the
instruction sequence


at the beginning of every procedure and function. If an external assembly
language routine does not set up a stack frame in this way and is active at
the time a runtime error occurs, STAKDUMP will not be able to follow the stack
chain and will either produce garbage or halt with an error of its own.

The disassembly technique places further restrictions that apply only to
external assembly language routines. First, the disassembler cannot deal with
data placed within the code stream. Second, the disassembler assumes that the
return instruction for any routine is at the end of the routine.

STAKDUMP is written primarily in assembly language to save code space.
STAKDUMP.ASM will assemble with MASM 4.0, MASM 5.0 or A86.

 December 23, 2017  Add comments

Leave a Reply