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" Subject: dpmiexcp.c with core dumping Cc: djgpp-workers AT delorie DOT com, sandmann AT clio DOT rice DOT edu Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_985728709==_" 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==_--