Final version.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@1086 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
b78219ef58
commit
e768ea9933
1 changed files with 54 additions and 54 deletions
|
|
@ -4,7 +4,7 @@
|
||||||
%make two column with no page numbering, default is 10 point
|
%make two column with no page numbering, default is 10 point
|
||||||
%\documentstyle{article}
|
%\documentstyle{article}
|
||||||
\documentstyle[twocolumn,times]{article}
|
\documentstyle[twocolumn,times]{article}
|
||||||
%\pagestyle{empty}
|
\pagestyle{empty}
|
||||||
|
|
||||||
%set dimensions of columns, gap between columns, and space between paragraphs
|
%set dimensions of columns, gap between columns, and space between paragraphs
|
||||||
%\setlength{\textheight}{8.75in}
|
%\setlength{\textheight}{8.75in}
|
||||||
|
|
@ -119,7 +119,7 @@ generation tools can be used
|
||||||
to automatically produce bindings between existing code and a
|
to automatically produce bindings between existing code and a
|
||||||
variety of scripting language environments
|
variety of scripting language environments
|
||||||
\cite{swig,sip,pyfort,f2py,advperl,heidrich,vtk,gwrap,wrappy}. As a result, a large number of
|
\cite{swig,sip,pyfort,f2py,advperl,heidrich,vtk,gwrap,wrappy}. As a result, a large number of
|
||||||
programmers are using scripting languages to control
|
programmers are now using scripting languages to control
|
||||||
complex C/C++ programs or as a tool for re-engineering legacy
|
complex C/C++ programs or as a tool for re-engineering legacy
|
||||||
software. This approach is attractive because it allows programmers
|
software. This approach is attractive because it allows programmers
|
||||||
to benefit from the flexibility and rapid development of
|
to benefit from the flexibility and rapid development of
|
||||||
|
|
@ -136,7 +136,7 @@ Because of this, scripted software tends to rely heavily
|
||||||
upon shared libraries, dynamic loading, scripts, and
|
upon shared libraries, dynamic loading, scripts, and
|
||||||
third-party extensions. In this sense, one might argue that the
|
third-party extensions. In this sense, one might argue that the
|
||||||
benefits of scripting are achieved at the expense of creating a
|
benefits of scripting are achieved at the expense of creating a
|
||||||
more complicated and diverse development environment.
|
more complicated development environment.
|
||||||
|
|
||||||
A consequence of this complexity is an increased degree of difficulty
|
A consequence of this complexity is an increased degree of difficulty
|
||||||
associated with debugging programs that utilize multiple languages,
|
associated with debugging programs that utilize multiple languages,
|
||||||
|
|
@ -205,12 +205,11 @@ than a traditional stand-alone program. As a result, a user may not
|
||||||
have a good sense of how to actually attach an external debugger to their
|
have a good sense of how to actually attach an external debugger to their
|
||||||
script. In addition, execution may occur within a
|
script. In addition, execution may occur within a
|
||||||
complex run-time environment involving events, threads, and network
|
complex run-time environment involving events, threads, and network
|
||||||
connections. Because of this, it can be difficult to reproduce
|
connections. Because of this, it can be difficult for the user to reproduce
|
||||||
and identify certain types of catastrophic errors if they depend on
|
and identify certain types of catastrophic errors if they depend on
|
||||||
timing or unusual event sequences. Finally, this approach
|
timing or unusual event sequences. Finally, this approach
|
||||||
assumes that a programmer has a C development environment installed on
|
requires a programmer to have a C development environment installed on
|
||||||
their machine and that they know how to use a low-level source
|
their machine. Unfortunately, this may not hold in practice.
|
||||||
debugger. Unfortunately, neither of these assumptions may hold in practice.
|
|
||||||
This is because scripting languages are often used to provide programmability to
|
This is because scripting languages are often used to provide programmability to
|
||||||
applications where end-users write scripts, but do not write low-level C code.
|
applications where end-users write scripts, but do not write low-level C code.
|
||||||
|
|
||||||
|
|
@ -283,7 +282,7 @@ handling and reporting mechanism to the scripting language
|
||||||
interpreter. We have implemented this approach in the form of an
|
interpreter. We have implemented this approach in the form of an
|
||||||
experimental system known as WAD. WAD is packaged as dynamically
|
experimental system known as WAD. WAD is packaged as dynamically
|
||||||
loadable shared library that can either be loaded as a scripting
|
loadable shared library that can either be loaded as a scripting
|
||||||
language extension or linked to existing extension modules as a
|
language extension module or linked to existing extension modules as a
|
||||||
library. The core of the system is generic and requires no
|
library. The core of the system is generic and requires no
|
||||||
modifications to the scripting interpreter or existing extension
|
modifications to the scripting interpreter or existing extension
|
||||||
modules. Furthermore, the system does not introduce a performance
|
modules. Furthermore, the system does not introduce a performance
|
||||||
|
|
@ -313,7 +312,7 @@ supply a stack trace as opposed to a vague complaint that the program
|
||||||
\begin{picture}(400,250)(0,0)
|
\begin{picture}(400,250)(0,0)
|
||||||
\put(50,-110){\special{psfile = tcl.ps hscale = 60 vscale = 60}}
|
\put(50,-110){\special{psfile = tcl.ps hscale = 60 vscale = 60}}
|
||||||
\end{picture}
|
\end{picture}
|
||||||
\caption{Dialog box with traceback information for a failed assertion in a Tcl/Tk extension}
|
\caption{Dialog box with WAD generated traceback information for a failed assertion in a Tcl/Tk extension}
|
||||||
\end{figure*}
|
\end{figure*}
|
||||||
|
|
||||||
\section{Scripting Language Internals}
|
\section{Scripting Language Internals}
|
||||||
|
|
@ -343,7 +342,6 @@ wrap_foo(ClientData clientData,
|
||||||
/* Call a function */
|
/* Call a function */
|
||||||
|
|
||||||
result = foo(args);
|
result = foo(args);
|
||||||
|
|
||||||
/* Set result */
|
/* Set result */
|
||||||
...
|
...
|
||||||
if (success) {
|
if (success) {
|
||||||
|
|
@ -370,8 +368,7 @@ NumberMethods ComplexMethods {
|
||||||
complex_mul,
|
complex_mul,
|
||||||
complex_div,
|
complex_div,
|
||||||
...
|
...
|
||||||
};
|
};\end{verbatim}
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
\noindent
|
\noindent
|
||||||
Once registered with the interpreter, the methods in this structure
|
Once registered with the interpreter, the methods in this structure
|
||||||
|
|
@ -406,7 +403,7 @@ interpreter. Similarly, automatic wrapper generators such as SWIG can produce
|
||||||
code to convert C++ exceptions and other C-related error handling
|
code to convert C++ exceptions and other C-related error handling
|
||||||
schemes to scripting language errors \cite{swigexcept}. On the other
|
schemes to scripting language errors \cite{swigexcept}. On the other
|
||||||
hand, segmentation faults, failed assertions, and similar problems
|
hand, segmentation faults, failed assertions, and similar problems
|
||||||
produce signals that cause the interpreter to crash.
|
produce signals that cause the interpreter to abort execution.
|
||||||
|
|
||||||
Most scripting languages provide limited support for Unix signal
|
Most scripting languages provide limited support for Unix signal
|
||||||
handling \cite{stevens}. However, this support is not sufficiently advanced to
|
handling \cite{stevens}. However, this support is not sufficiently advanced to
|
||||||
|
|
@ -570,25 +567,6 @@ Unfortunately, no reference to the interpreter object is available in the
|
||||||
signal handler nor is a reference to interpreter guaranteed to exist in
|
signal handler nor is a reference to interpreter guaranteed to exist in
|
||||||
the context of a function that generated the error.
|
the context of a function that generated the error.
|
||||||
|
|
||||||
\begin{table}[t]
|
|
||||||
\begin{center}
|
|
||||||
\begin{tabular}{ll}
|
|
||||||
Python symbol & Error return value \\ \hline
|
|
||||||
call\_builtin & NULL \\
|
|
||||||
PyObject\_Print & -1 \\
|
|
||||||
PyObject\_CallFunction & NULL \\
|
|
||||||
PyObject\_CallMethod & NULL \\
|
|
||||||
PyObject\_CallObject & NULL \\
|
|
||||||
PyObject\_Cmp & -1 \\
|
|
||||||
PyObject\_DelAttrString & -1 \\
|
|
||||||
PyObject\_DelItem & -1 \\
|
|
||||||
PyObject\_GetAttrString & NULL \\
|
|
||||||
\end{tabular}
|
|
||||||
\end{center}
|
|
||||||
\label{returnpoints}
|
|
||||||
\caption{A partial list of symbolic return locations in the Python interpreter}
|
|
||||||
\end{table}
|
|
||||||
|
|
||||||
To work around this problem, WAD implements a feature
|
To work around this problem, WAD implements a feature
|
||||||
known as argument stealing. When examining the call-stack, the signal
|
known as argument stealing. When examining the call-stack, the signal
|
||||||
handler has full access to all function arguments and local variables of each function
|
handler has full access to all function arguments and local variables of each function
|
||||||
|
|
@ -627,6 +605,27 @@ At this time, argument stealing is only applicable to simple types
|
||||||
such as integers and pointers. However, this appears to be adequate for generating
|
such as integers and pointers. However, this appears to be adequate for generating
|
||||||
scripting language errors.
|
scripting language errors.
|
||||||
|
|
||||||
|
|
||||||
|
\begin{table}[t]
|
||||||
|
\begin{center}
|
||||||
|
\begin{tabular}{ll}
|
||||||
|
Python symbol & Error return value \\ \hline
|
||||||
|
call\_builtin & NULL \\
|
||||||
|
PyObject\_Print & -1 \\
|
||||||
|
PyObject\_CallFunction & NULL \\
|
||||||
|
PyObject\_CallMethod & NULL \\
|
||||||
|
PyObject\_CallObject & NULL \\
|
||||||
|
PyObject\_Cmp & -1 \\
|
||||||
|
PyObject\_DelAttrString & -1 \\
|
||||||
|
PyObject\_DelItem & -1 \\
|
||||||
|
PyObject\_GetAttrString & NULL \\
|
||||||
|
\end{tabular}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\label{returnpoints}
|
||||||
|
\caption{A partial list of symbolic return locations in the Python interpreter}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
\section{Register Management}
|
\section{Register Management}
|
||||||
|
|
||||||
A final issue concerning the return mechanism has to do with the
|
A final issue concerning the return mechanism has to do with the
|
||||||
|
|
@ -712,7 +711,7 @@ As a fall-back, WAD could be configured to return control to a location
|
||||||
previously specified with {\tt setjmp}. Unfortunately, this either
|
previously specified with {\tt setjmp}. Unfortunately, this either
|
||||||
requires modifications to the interpreter or its extension modules.
|
requires modifications to the interpreter or its extension modules.
|
||||||
Although this kind of instrumentation could be facilitated by automatic
|
Although this kind of instrumentation could be facilitated by automatic
|
||||||
wrapper code generators, it is not a preferred solution.
|
wrapper code generators, it is not a preferred solution and is not discussed further.
|
||||||
|
|
||||||
\section{Initialization}
|
\section{Initialization}
|
||||||
|
|
||||||
|
|
@ -726,20 +725,21 @@ enabled by linking it to an extension module as a shared
|
||||||
library. For instance:
|
library. For instance:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
% ld -shared ... -lwadpy
|
% ld -shared $(OBJS) -lwadpy
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
In this case, WAD initializes itself whenever the extension module is
|
In this latter case, WAD initializes itself whenever the extension module is
|
||||||
loaded. The same shared library is used for both situations by making
|
loaded. The same shared library is used for both situations by making
|
||||||
sure two types of initialization techniques are used. First, an empty
|
sure two types of initialization techniques are used. First, an empty
|
||||||
initialization function is written to make WAD appear like a proper
|
initialization function is written to make WAD appear like a proper
|
||||||
scripting language extension module (although it adds no functions to
|
scripting language extension module (although it adds no functions to
|
||||||
the interpreter). Second, the real initialization of the system is
|
the interpreter). Second, the real initialization of the system is
|
||||||
placed into the initialization section of the WAD shared library
|
placed into the initialization section of the WAD shared library
|
||||||
object file (the ``init'' section for ELF files). This code always executes
|
object file (the ``init'' section of ELF files). This code always executes
|
||||||
when a library is loaded by the dynamic loader. A fairly portable way
|
when a library is loaded by the dynamic loader is commonly used to
|
||||||
to force code into the initialization section is to use a C++
|
properly initialize C++ objects. Therefore, a fairly portable way
|
||||||
statically constructed object like this:
|
to force code into the initialization section is to encapsulate the
|
||||||
|
initialization in a C++ statically constructed object like this:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
class InitWad {
|
class InitWad {
|
||||||
|
|
@ -765,7 +765,7 @@ is impossible if WAD is linked directly to an interpreter as
|
||||||
its initialization process would execute before before the main program of the
|
its initialization process would execute before before the main program of the
|
||||||
interpreter started. However,
|
interpreter started. However,
|
||||||
if you wanted to permanently add WAD to an interpreter, the problem is easily
|
if you wanted to permanently add WAD to an interpreter, the problem is easily
|
||||||
corrected by first removing the C++ initializer from WAD and then replacing it with an
|
corrected by first removing the C++ initializer from WAD and then replacing it with an explicit
|
||||||
initialization call someplace within the interpreter's startup function.
|
initialization call someplace within the interpreter's startup function.
|
||||||
|
|
||||||
\section{Exception Objects}
|
\section{Exception Objects}
|
||||||
|
|
@ -804,7 +804,7 @@ except SegFault,e:
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
Inspection of the exception object also makes it possible to write post mortem
|
Inspection of the exception object also makes it possible to write post mortem
|
||||||
script debuggers that merge the call stacks of the two languages together and
|
script debuggers that merge the call stacks of the two languages and
|
||||||
provide cross language diagnostics. Figure 4 shows an
|
provide cross language diagnostics. Figure 4 shows an
|
||||||
example of a simple mixed language debugging session using the WAD
|
example of a simple mixed language debugging session using the WAD
|
||||||
post-mortem debugger (wpm) after an extension error has occurred in a
|
post-mortem debugger (wpm) after an extension error has occurred in a
|
||||||
|
|
@ -861,7 +861,7 @@ difficulties of accurately recovering register values).
|
||||||
elif ty == 2:
|
elif ty == 2:
|
||||||
>>> \end{verbatim}
|
>>> \end{verbatim}
|
||||||
}
|
}
|
||||||
\caption{Cross-language debugging session in Python where user is walking up the call stack.}
|
\caption{Cross-language debugging session in Python where a user is walking a mixed language call stack.}
|
||||||
\end{figure*}
|
\end{figure*}
|
||||||
|
|
||||||
\section{Implementation Details}
|
\section{Implementation Details}
|
||||||
|
|
@ -908,7 +908,7 @@ to port between different Unix systems. For instance, code to read
|
||||||
ELF object files and stabs debugging data is essentially identical for
|
ELF object files and stabs debugging data is essentially identical for
|
||||||
Linux and Solaris. In addition, the high-level control logic is
|
Linux and Solaris. In addition, the high-level control logic is
|
||||||
unchanged between platforms. Platform specific differences primarily
|
unchanged between platforms. Platform specific differences primarily
|
||||||
arise in the obvious places including the examination of CPU
|
arise in the obvious places such as the examination of CPU
|
||||||
registers, manipulation of the process context in the signal handler,
|
registers, manipulation of the process context in the signal handler,
|
||||||
reading virtual memory maps from /proc, and so forth. Additional
|
reading virtual memory maps from /proc, and so forth. Additional
|
||||||
changes would also need to be made on systems with different object
|
changes would also need to be made on systems with different object
|
||||||
|
|
@ -924,10 +924,10 @@ Due to the heavy dependence on Unix signal handling, process
|
||||||
introspection, and object file formats, it is unlikely that WAD could
|
introspection, and object file formats, it is unlikely that WAD could
|
||||||
be easily ported to non-Unix systems such as Windows. However, it may
|
be easily ported to non-Unix systems such as Windows. However, it may
|
||||||
be possible to provide a similar capability using advanced features of
|
be possible to provide a similar capability using advanced features of
|
||||||
structured exception handling \cite{seh}. For instance, structured
|
Windows structured exception handling \cite{seh}. For instance, structured
|
||||||
exception handlers can be used to catch hardware faults, they can
|
exception handlers can be used to catch hardware faults, they can
|
||||||
receive process context information, and they can arrange to take
|
receive process context information, and they can arrange to take
|
||||||
corrective action.
|
corrective action much like the signal implementation described here.
|
||||||
|
|
||||||
\section{Modification of Interpreters?}
|
\section{Modification of Interpreters?}
|
||||||
|
|
||||||
|
|
@ -1038,13 +1038,13 @@ application may fail in a manner that does not represent the original
|
||||||
programming error. It might also cause the WAD signal handler to be
|
programming error. It might also cause the WAD signal handler to be
|
||||||
immediately reinvoked with a different process state--causing it to
|
immediately reinvoked with a different process state--causing it to
|
||||||
report information about a different type of failure. To address
|
report information about a different type of failure. To address
|
||||||
these kinds of problems, WAD tries to create a tracefile {\tt
|
these kinds of problems, WAD creates a tracefile {\tt
|
||||||
wadtrace} in the current working directory that contains information
|
wadtrace} in the current working directory that contains information
|
||||||
about each error that it has handled. If no recovery was possible, a
|
about each error that it has handled. If no recovery was possible, a
|
||||||
programmer can look at this file to obtain all of the stack traces
|
programmer can look at this file to obtain all of the stack traces
|
||||||
that were generated by WAD.
|
that were generated.
|
||||||
|
|
||||||
Finally, if an application is experiencing a very serious problem, WAD
|
If an application is experiencing a very serious problem, WAD
|
||||||
does not prevent a standard debugger from being attached to the
|
does not prevent a standard debugger from being attached to the
|
||||||
process. This is because the debugger overrides the current signal
|
process. This is because the debugger overrides the current signal
|
||||||
handling so that it can catch fatal errors. As a result, even if WAD
|
handling so that it can catch fatal errors. As a result, even if WAD
|
||||||
|
|
@ -1144,7 +1144,7 @@ mixed-mode debugging of Java and native methods using features of the
|
||||||
Java Platform Debugger Architecture (JPDA) \cite{jpda}. Mixed-mode
|
Java Platform Debugger Architecture (JPDA) \cite{jpda}. Mixed-mode
|
||||||
debugging support for Java may also be supported in advanced debugging systems
|
debugging support for Java may also be supported in advanced debugging systems
|
||||||
such as ICAT \cite{icat}.
|
such as ICAT \cite{icat}.
|
||||||
However, these systems do not appear to have taken the approach of
|
However, none of these systems appear to have taken the approach of
|
||||||
converting hardware faults into Java errors or exceptions.
|
converting hardware faults into Java errors or exceptions.
|
||||||
|
|
||||||
\section{Future Directions}
|
\section{Future Directions}
|
||||||
|
|
@ -1160,7 +1160,7 @@ to recover partial debugging information from corrupted call stacks \cite{debug}
|
||||||
A more interesting extension of this work would be to see how the
|
A more interesting extension of this work would be to see how the
|
||||||
exception handling approach of WAD could be incorporated with
|
exception handling approach of WAD could be incorporated with
|
||||||
the integrated development environments and script-level debugging
|
the integrated development environments and script-level debugging
|
||||||
systems that have already been developed. It would also be interesting
|
systems that have already been developed. For instance, it would be interesting
|
||||||
to see if a graphical debugging front-end such as DDD could be modified
|
to see if a graphical debugging front-end such as DDD could be modified
|
||||||
to handle mixed-language stack traces within the context of a script-level debugger \cite{ddd}.
|
to handle mixed-language stack traces within the context of a script-level debugger \cite{ddd}.
|
||||||
|
|
||||||
|
|
@ -1210,9 +1210,6 @@ reviewers and Rob Miller for their useful comments.
|
||||||
\bibitem{ousterhout} J. K. Ousterhout, {\em Tcl: An Embeddable Command Language},
|
\bibitem{ousterhout} J. K. Ousterhout, {\em Tcl: An Embeddable Command Language},
|
||||||
Proceedings of the USENIX Association Winter Conference, 1990. p.133-146.
|
Proceedings of the USENIX Association Winter Conference, 1990. p.133-146.
|
||||||
|
|
||||||
\bibitem{ouster1} J. K. Ousterhout, {\em Scripting: Higher-Level Programming for the 21st Century},
|
|
||||||
IEEE Computer, Vol 31, No. 3, p. 23-30, 1998.
|
|
||||||
|
|
||||||
\bibitem{perl} L. Wall, T. Christiansen, and R. Schwartz, {\em Programming Perl}, 2nd. Ed.
|
\bibitem{perl} L. Wall, T. Christiansen, and R. Schwartz, {\em Programming Perl}, 2nd. Ed.
|
||||||
O'Reilly \& Associates, 1996.
|
O'Reilly \& Associates, 1996.
|
||||||
|
|
||||||
|
|
@ -1253,6 +1250,9 @@ Software/g-wrap}.
|
||||||
\bibitem{wrappy} G. Couch, C. Huang, and T. Ferrin, {\em Wrappy :A Python Wrapper
|
\bibitem{wrappy} G. Couch, C. Huang, and T. Ferrin, {\em Wrappy :A Python Wrapper
|
||||||
Generator for C++ Classes}, O'Reilly Open Source Software Convention, 1999.
|
Generator for C++ Classes}, O'Reilly Open Source Software Convention, 1999.
|
||||||
|
|
||||||
|
\bibitem{ouster1} J. K. Ousterhout, {\em Scripting: Higher-Level Programming for the 21st Century},
|
||||||
|
IEEE Computer, Vol 31, No. 3, p. 23-30, 1998.
|
||||||
|
|
||||||
\bibitem{gdb} R. Stallman and R. Pesch, {\em Using GDB: A Guide to the GNU Source-Level Debugger}.
|
\bibitem{gdb} R. Stallman and R. Pesch, {\em Using GDB: A Guide to the GNU Source-Level Debugger}.
|
||||||
Free Software Foundation and Cygnus Support, Cambridge, MA, 1991.
|
Free Software Foundation and Cygnus Support, Cambridge, MA, 1991.
|
||||||
|
|
||||||
|
|
@ -1321,7 +1321,7 @@ IEEE Computer, Vol 20, No. 11, p. 75-89, 1987.
|
||||||
|
|
||||||
\bibitem{pydebug} P. Stoltz, {\em PyDebug, a New Application for Integrated
|
\bibitem{pydebug} P. Stoltz, {\em PyDebug, a New Application for Integrated
|
||||||
Debugging of Python with C and Fortran Extensions}, O'Reilly Open Source Software Convention,
|
Debugging of Python with C and Fortran Extensions}, O'Reilly Open Source Software Convention,
|
||||||
San Diego, 2001.
|
San Diego, 2001 (to appear).
|
||||||
|
|
||||||
\bibitem{jpda} Sun Microsystems, {\em Java Platform Debugger Architecture},
|
\bibitem{jpda} Sun Microsystems, {\em Java Platform Debugger Architecture},
|
||||||
http://java.sun.com/products/jpda
|
http://java.sun.com/products/jpda
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue