[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

The following is an example of debugging an Enforcer hit that occurred
using a test program called ownertest.  This hit was generated on an
A2500 with a 2.04 ROM image loaded using ZKick:

Program Counter (approximate)=  201946          Fault address       =       0
User stack pointer           =  566110          DOS process address =  38E888
Data: 00282D90 00000000 000003ED 0038FD8C 00000001 00000001 000E203B 00000001
Addr: 00225469 00000001 00282DE0 00448A3A 004487C0 004487CC 00001420 00002E28
Stck: 00448A3A 00223BA2 00280810 000003ED 0038FD8C 00000001 00000001 000E203B
READ-BYTE  (---)(F)(-)    SR=0010   SSW=0751
Background CLI, "ownertest"

The Program Counter is at $201946.  On a machine with the Kickstart in
ROM, the ROM addresses range from $F80000 to $FFFFFF under 2.0 or
greater and from $FC0000 to $FFFFFF under 1.3.  On a softkicked A3000,
the addresses are in the same range as real ROM addresses.  On a
softkicked A2500, $201946 is a ROM address (in this case, the ROM
ranges from $200000 to $27FFFF).  The first thing to do is figure out
in which ROM module the Enforcer hit occurred.  The debugging tool
owner , by Michael Sinz, will figure that out:

    1.Ram Disk:> owner 0x201946

    Address  - Owner
    --------   -----
    00201946 - in resident module: exec 37.132 (23.5.91)

Note that Owner looks at the ROM addresses of the Amiga on which it is
executing, so you must run owner on the machine that generated the
Enforcer hit.

Next, use the debugging tool lvo to figure out what function entry in
the Exec ROM module is closest to that ROM address.  Like owner, lvo
also looks at local machine's ROM addresses, so you have to run owner
on the machine that generated the Enforcer hit.  Note that lvo requires
the FD files to be in an ``FD:'' assign directory.  Pass the address
and the module name (from owner) to lvo.

    1.Ram Disk:> lvo exec romaddress=0x201946

    Closest to $201946 without going over:
    exec.library LVO $feec -276 FindName() jumps to $20192a on this system

Hmmm.  A lot of functions use FindName() on Exec lists, so, in this
case, the Program Counter does not pinpoint the problem.  However, it
does hint that FindName() probably received a bad string pointer.  The
``READ-BYTE'' attribute of the Enforcer hit is an extra clue that the
Ownertest program has a problem with a string pointer, since the most
common READ-BYTE actions are on strings.

Let's check the Enforcer stack dump and see if there are any other ROM
addresses there which might have called FindName():

    Stck: 00448A3A 00223BA2 00280810 000003ED 0038FD8C 00000001 00000001
          000E203B

The address closest to the top of the stack that looks like a ROM
address on this particular system is 0x00223BA2.  Let's see what ROM
module contains this address:

    1.Ram Disk:> owner 0x223BA2

    Address  - Owner
    --------   -----
    00223BA2 - in resident module: graphics 37.35 (23.5.91)

Let's see what function in the Graphics library is closest to this ROM
address:

    1.Ram Disk:> lvo graphics 0x223BA2

    Closest to $223ba2 without going over:
    graphics.library  LVO $ffb8 -72  OpenFont() jumps to $223b84 on this
    system

It looks like the ownertest program has a problem with a font name that
was not properly initialized.