summaryrefslogtreecommitdiff
path: root/Tools/WAD/README
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/WAD/README')
-rw-r--r--Tools/WAD/README376
1 files changed, 376 insertions, 0 deletions
diff --git a/Tools/WAD/README b/Tools/WAD/README
new file mode 100644
index 0000000..08e9abb
--- /dev/null
+++ b/Tools/WAD/README
@@ -0,0 +1,376 @@
+WAD (Wrapped Application Debugger)
+
+Author(s):
+ David M. Beazley (beazley@cs.uchicago.edu)
+
+Copyright (C) 2001
+University of Chicago
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+See the file COPYING for a complete copy of the LGPL.
+
+$Id: README 10001 2007-10-17 21:33:57Z wsfulton $
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!!!!!!! DISCLAIMER !!!!!!!!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+THIS IS EXPERIMENTAL UNMAINTAINED RESEARCH SOFTWARE THAT REPRESENTS
+WORK IN PROGRESS. IT IS NOT PORTABLE, IT HAS NOT BEEN EXHAUSTIVELY
+TESTED, AND IT MIGHT NOT WORK AT ALL. PLEASE KEEP AWAY FROM SMALL
+CHILDREN, PETS, NUCLEAR REACTORS, AIR-TRAFFIC CONTROL, AND VOTING
+MACHINES.
+
+0. Supported Platforms
+
+This software is currently only known to work with 32-bit applications
+on Sun Sparc Solaris 2.8 and recent i386-Linux systems. In addition,
+there are numerous issues concerning the interaction of this software
+with signal handling, thread libraries, and compilers. Please read
+this entire document before proceeding.
+
+1. Introduction
+
+WAD is an embedded error-recovery mechanism that attempts to convert
+fatal errors such as SIGSEGV, SIGBUS, and SIGFPE into sensible error
+messages and exceptions. It is primarily designed to support
+scripting language extension programming although it can also be used
+with stand-alone C programs.
+
+The primary goal of this system is to explore an alternative approach
+to mixed scripting-compiled debugging. It requires no modifications
+or recompilation of existing software. Therefore, it should be
+relatively easy to try out. Feedback is welcome. Contributions and
+modifications are even more welcome.
+
+2. Compilation and Installation
+
+WAD is not particularly portable and at this time, only two platforms
+are supported: Sun Sparc Solaris and i386-Linux.
+
+Installation is as follows:
+
+ ./configure
+ make
+ make install
+
+The build process creates the following shared libraries:
+
+ libwad.so - Standalone WAD. Can be linked with C/C++
+ programs.
+
+ libwadpy.so - Python WAD. Can be linked to Python extension
+ modules or imported on its own as 'import libwadpy'
+
+ libwadtcl.so - Tcl WAD. Can be linked to Tcl extension
+ modules or loaded as 'load libwadtcl.so'.
+
+ libwadpl.so - Perl WAD. Can be linked to Perl extension
+ modules or loaded as 'libwadpl'.
+
+To install the libraries, simply type 'make install'. This copies the libraries
+to /usr/local/lib (unless you modify the makefile).
+
+Notes:
+
+ - The Sun version of WAD has only been tested when compiled with the
+ Sun Workshop C/C++ compilers. However WAD works with other programs
+ that have been compiled with gcc. If gcc is installed on your
+ machine, you may want to set the following environment variables
+ before running configure:
+
+ setenv CC cc
+ setenv CXX CC
+ ./configure
+
+ - You may need to modify the Makefile to point to the installed locations
+ of various scripting language libraries if you have installed
+ them in non-traditional locations.
+
+ - The Linux version has only been tested with 2.2-12 and 2.2-14 kernels
+ and the RedHat 6.x distribution. Your mileage may vary. There
+ may be some compatibility issues related to glibc and other parts
+ of the system as well.
+
+3. Using WAD
+
+WAD has no functional API nor does it have any command line options so
+it's pretty easy to describe---simply link the appropriate WAD library with
+your C code. For example:
+
+ % cc blah.c -lwad
+
+Once linked, fatal errors will now produce stack traces. For example:
+
+% ./a.out seg
+starting.
+Segmentation fault.
+#2 0x400571eb in __libc_start_main() in 'libc-start.c', line 90
+#1 0x08048b39 in main(argc=0x2,argv=0xbffffce4) in 'debug.c', line 62
+#0 0x080489b3 in seg_crash(n=0x0) in 'debug.c', line 9
+
+/r0/beazley/Projects/WAD/Wad/debug.c, line 9
+
+ int *a = 0;
+ if (n > 0) seg_crash(n-1);
+ => *a = 3;
+ return 1;
+ }
+
+For scripting languages, WAD works in a similar manner--simply link
+your scripting language extension module with the appropriate WAD library
+(wadpy, wadtcl, wadpl). For example:
+
+ % ld -G $(OBJS) -lwadpy -o pymodule.so
+
+When the scripting module is loaded into the interpreter, WAD should
+automatically initialize.
+
+4. Debugging Modes
+
+Due to WAD's experimental nature, a number of debugging modes can be set
+through the use of environment variables. These variables control WAD's
+runtime behavior and cause the system to dump debugging information for
+various stages of error recovery. A lot of this data is pretty ugly and
+probably only of interest to you if you are trying to debug WAD itself.
+
+WAD_DEBUG_SEGMENT - Displays information about the virtual memory
+ map and mapping of addresses to segments.
+
+WAD_DEBUG_SYMBOL - Symbol table mapping.
+
+WAD_DEBUG_OBJECT - Loading/Unloading of object files.
+
+WAD_DEBUG_FILE - Loading/Unloading of raw files.
+
+WAD_DEBUG_HOLD - Freezes WAD before it returns from the signal handler.
+ Useful if you need to attach a debugger to WAD itself.
+
+WAD_DEBUG_STABS - Display stabs data.
+
+WAD_DEBUG_RETURN - Display information about WAD return points.
+
+WAD_DEBUG_SYMBOL_SEARCH - Display all symbols in the symbol table that are
+ searched.
+
+WAD_DEBUG_UNWIND - Display information about stack unwinding.
+
+WAD_DEBUG_SIGNAL - Display information about signal handling.
+
+WAD_DEBUG_INIT - Print initialization information.
+
+WAD_NOSTACK - Do NOT use an alternative signal handling stack.
+ This may be necessary on certain Linux systems when
+ threads are being used.
+
+WAD_ONESHOT - Disable WAD signal handler after first signal has
+ been received.
+
+WAD_DEBUG_MEMORY - Print information about WAD memory use.
+
+WAD_DEBUG_STRINGS - Print information about WAD string manager.
+
+5. Platform Specific Issues
+
+General:
+
+ - WAD does not gracefully recover from errors that corrupt the call
+ stack (i.e., buffer overlow).
+
+ - Errors that destroy the process heap may or may not be recoverable
+ depending on what has been destroyed.
+
+ - WAD does not currently support 64 bit applications on any platform.
+
+ - If executables have been stripped, their symbol tables might not
+ have enough information to recover from errors. Therefore, if you
+ are using Python, Tcl, or Perl from a binary distribution, you
+ may want to rebuild non-stripped versions of these packages yourself.
+
+ - WAD only works with programs that utilize the ELF32 linking format
+ and stabs debugging data. Newer formats such as DWARF2 are not
+ supported at this time.
+
+ - WAD does not correctly report argument values for structures or
+ floating point numbers yet.
+
+ - Overly aggressive compiler optimization may lead to very strange
+ WAD output.
+
+Solaris:
+
+ - WAD is extremely slow at collecting debugging information
+ from large applications.
+
+Linux:
+
+ - The interaction of threads and signals are particularly problematic
+ on this platform and may cause WAD not to work at all. Here are
+ some specific thread-based issues that may arise:
+
+ 1. WAD causes the program to crash immediately upon startup.
+ This appears to be caused by a bug in in the implementation
+ of sigaction() and the initialization of signals. This
+ only occurs if WAD is directly linked to an executable
+ using threads. It does not occur when WAD is dynamically
+ loaded into a threaded application.
+
+ 2. Programs may lock up when an error occurs. This is sometimes
+ caused by an apparently broken implementation of sigaltstack().
+ One solution to this is to set the following environment
+ variable:
+
+ setenv WAD_NOSTACK
+
+ in which case the WAD signal handler will use the same
+ stack as the thread/process that generates the error.
+
+ 3. WAD just crashes altogether and doesn't seem to do anything.
+ It appears that some versions of Linux threads do *not*
+ pass CPU context information correctly to signal handlers
+ defined in threaded programs. There is no known fix to
+ this at this time. Upgrade your system.
+
+ - WAD does not work if it is compiled as PIC code. The WAD libraries
+ should be compiled *without* the -fpic option.
+
+ - WAD has to rely upon a heuristic register recovery scheme when it
+ returns to scripting language interpreters. It seems to
+ work, but it relies upon a very specific compiler code generation
+ convention for saving registers in function prologues. It also
+ relies upon the register save conventions described in the Linux
+ Assembly HOWTO.
+
+ - If you are using WAD with pre-installed binaries for Python, Tcl,
+ and other scripting languages, it may not work correctly due to
+ stripped symbol tables. Most Linux installs such as Redhat strip
+ symbol tables from executables. This makes it difficult for WAD
+ to determine context correctly (although it may still work since
+ the dynamic loading symbol table is still available in most cases).
+
+6. Language specific issues
+
+If WAD is linked with a normal C/C++ program, errors simply produce a stack trace
+that is printed on standard error.
+
+Python:
+
+WAD tries to raise a Python exception and return. At this time, the exception
+merely contains a traceback string. However, in future versions, it may be
+possible to access a complete exception object.
+
+Tcl:
+
+WAD returns a Tcl and places the stack trace into the Tcl variable $errorInfo.
+The wish shell uses this to dump error information.
+
+Perl:
+
+Perl doesn't seem to have a very well-defined exception handling
+mechanism. Standard functions tend to just exit. The WAD handler
+produces a C stack trace and produces a Perl stack trace using some
+code derived from the sigtrap module.
+
+Note: 3/23/01 - Perl support is currently broken.
+
+7. Testing and Examples
+
+The Test directory contains some very simple code for testing WAD. In the
+most simple form, compile the stand-along test program 'debug' as follows:
+
+% cd Test
+% make
+
+Now, running it:
+
+% debug
+WAD debug program.
+
+Usage: debug type
+ seg - Fail with an uninitialized pointer.
+ bus - Fail with a bus error.
+ abort - Fail with an assertion error.
+ math - Fail with a math error.
+ heap - Blow the process heap.
+ overflow - Buffer overflow on the stack.
+
+% debug seg
+WAD debug program.
+Segmentation fault.
+#2 0x400581eb in __libc_start_main() in 'libc-start.c', line 90
+#1 0x08048b61 in main(argc=0x2,argv=0xbffffc54) in 'debug.c', line 85
+#0 0x080489d0 in seg_crash() in 'debug.c', line 15
+
+/r0/beazley/Projects/WAD/Test/debug.c, line 15
+
+ int seg_crash() {
+ int *a = 0;
+ => *a = 3;
+ return 1;
+ }
+
+Additional targets 'make python', 'make tcl', and 'make perl' are also available.
+The scripts debug.py, debug.tcl, debug.pl can be used to test these extensions.
+
+8. Documentation
+
+No official documentation exists at this time. However, details
+of WAD's design and implementation can be found in papers presented
+at the Ninth International Python Conference and the 2000 USENIX
+Technical Conference. Both papers can be obtained at:
+
+ http://systems.cs.uchicago.edu/wad
+
+
+9. To-Do
+
+If you find WAD to be interesting or useful, there are a variety of
+ways to contribute. Here is the short to-do list:
+
+ - Better register management. Try to implement in a more portable
+ way. Add some support code for recovering local variables
+ that happen to be stored in registers.
+
+ - Add heuristic for recovering functions called through an
+ -fomit-frame-pointer compiler optimization scheme. This
+ can probably be determined by looking at the function preamble
+ machine code. Then one can back-trace to the calling function
+ and look at it's preamble.
+
+ - Continued clean up and modularization of the core. Many of the
+ internal APIs could be greatly improved.
+
+ - Support for ELF64 linking format.
+
+ - Support for DWARF2 debugging data.
+
+ - Improved support for stack-overflow and heap-corruption. Although WAD
+ probably won't be able to recover, it still might be able to produce some
+ informative diagnostics.
+
+ - Removal of printf() and other high-level library calls which may not
+ operate with a corrupted heap.
+
+ - Better integration with scripting languages.
+
+ - Support for new platforms.
+
+ - Support for new scripting languages.
+
+Please contact me if you are interested in working on any of these projects.
+
+Dave Beazley (beazley@cs.uchicago.edu)
+June 24, 2001