delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2001/03/28/00:32:48

Message-Id: <3.0.1.32.20010328133149.006aec58@wingate>
X-Sender: n_abing#ns DOT roxas-online DOT net DOT ph AT wingate
X-Mailer: Windows Eudora Pro Version 3.0.1 (32)
Date: Wed, 28 Mar 2001 13:31:49 +0800
To: eliz AT is DOT elta DOT co DOT il
From: "Nimrod A. Abing" <n_abing AT ns DOT roxas-online DOT net DOT ph>
Subject: dpmiexcp.c with core dumping
Cc: djgpp-workers AT delorie DOT com, sandmann AT clio DOT rice DOT edu
Mime-Version: 1.0
Reply-To: djgpp-workers AT delorie DOT com

--=====================_985728709==_
Content-Type: text/plain; charset="us-ascii"

Hello.

Attached to this message is dpmiexcp.c modified to provide core dumping for
DJGPP programs. The code was originally written by George Foot as a
separate module. I merged it with dpmiexcp.c to get a more accurate core
dump. A DJGPP program can now provide a call frame traceback and a core
dump for post-mortem debugging.

As for the details...

Core dump file format
~~~~~~~~~~~~~~~~~~~~~
Core files start with a six-byte ID string (`pmdbcd', for "post mortem
debugger core dump").  This is followed by a two-byte version number
(major, minor).
	
After that header the file is divided into sections.  Each has a
four-character ID string, followed by a 32-bit size value, then that number
of data bytes.
	
All multi-byte numbers are little-endian.
	
The sections currently used are:
	
file: Stores the filename of the executable (from argv[0]).  It's not
NULL-terminated.
		
sgnl: Information about the signal that was raised. Three 32-bit numbers.
The first is the signal as passed to the handler.  The second is the
__signum field of the exception state variable; this gives more information
about the error in some cases.  The third is the __sigmask field; I'm not
sure what it's for.
		
regs: Register contents -- 32 bits each for eax, ebx, ecx, edx, esi, edi,
ebp, esp, and eip.
		
sels: Selector details -- handles, base addresses and limits for cs, ds,
es, fs, gs and ss.  All 32-bit, stored in that order (i.e. cs handle, cs
address, cs limit, ds handle, ...).
		
cftb: Call frame traceback.  This is just a list of 32-bit offsets.
		
blks: DPMI memory block information.  For each memory block, the base
address, size (guessed) and chunk count are stored as 32-bit numbers.  The
chunk count is the number of 64K chunks of this block which were dumped to
the `data' section.
		
data: Memory dump.  This is just a big block of data. It holds the first
DPMI memory block's chunks first, then the second's, etc.

envv: Environment strings. These are copied from the ``hidden''' global
environ. Strings are NULL terminated.
		
end.: Marks the end of the core file. The size should be zero for a
complete core dump. In  case of an error during the core dump, bit zero
will be set if the core file is truncated, bit one will be set if DS was
invalid.


Variables
~~~~~~~~~

There are global variables to control the behavior of the core dumper:

extern char __djgpp_core_info_filename[256];

This holds the name of the core file that will be used. Change this to
another name if you like. The default is ``core''.

extern unsigned int __djgpp_core_info_max_core_size

This is the maximum amount of 1 byte memory blocks to write to the core
file. Default is 4K. If the number of 1 byte memory blocks to write exceeds
this limit, the core file will be truncated and bit zero of `end.' ident's
size will be set.

extern int __djgpp_enable_core_dump;

Set this variable to zero to disable core dumping. This should be useful
for embedded applications written using DJGPP where the program is written
to an EPROM or in any case where it would be impossible to write a core dump.

Known Issues
~~~~~~~~~~~~

There is one issue that I know of and this is with regards to AV programs
running in the background on Win9x. Two of which are Norton Antivirus 5.0
and InoculateIT PE 5.2.9 (versions of InoculateIT before this should cause
no problems). A SIGSEGV occurs when the core dumper tries to dump the
program's memory blocks to disk. When this happens, on my PC with
InoculateIT 5.2.9, the base address for ES is 0. The core dumper correctly
handles this situation wherein a signal occurs within it's code.

This seems to be the case for programs that touch parts of memory that it
really shouldn't. For users of InoculateIT PE 5.2.9, just turn off
real-time monitoring for executing files. You can safely leave on
monitoring for opening and closing of files.

I think this happens because of the AV scanner's heuristics approach. It
seems to think that accessing memory beyond a program's boundaries is
``virus-like behavior''.

Your comments and suggestions are most welcome.


--=====================_985728709==_
Content-Type: application/zip; name="dpmiexcp.zip";
 x-mac-type="705A4950"; x-mac-creator="705A4950"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="dpmiexcp.zip"

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
BQYAAAAAAQABADgAAABlIQAAAAA=
--=====================_985728709==_
Content-Type: text/plain; charset="us-ascii"



--=====================_985728709==_--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019