6.1.11 GNAT Abnormal Termination or Failure to Terminate
When presented with programs that contain serious errors in syntax
GNAT may on rare occasions experience problems in operation, such
as aborting with a
segmentation fault or illegal memory access, raising an internal
exception, terminating abnormally, or failing to terminate at all.
In such cases, you can activate
various features of GNAT that can help you pinpoint the construct in your
program that is the likely source of the problem.
The following strategies are presented in increasing order of
difficulty, corresponding to your experience in using GNAT and your
familiarity with compiler internals.
- * Run `gcc' with the `-gnatf'. This first
switch causes all errors on a given line to be reported. In its absence,
only the first error on a line is displayed.
The `-gnatdO' switch causes errors to be displayed as soon as they
are encountered, rather than after compilation is terminated. If GNAT
terminates prematurely or goes into an infinite loop, the last error
message displayed may help to pinpoint the culprit.
- * Run `gcc' with the `-v (verbose)' switch. In this
mode, `gcc' produces ongoing information about the progress of the
compilation and provides the name of each procedure as code is
generated. This switch allows you to find which Ada procedure was being
compiled when it encountered a code generation problem.
- * Run `gcc' with the `-gnatdc' switch. This is a GNAT specific
switch that does for the front-end what `-v' does
for the back end. The system prints the name of each unit,
either a compilation unit or nested unit, as it is being analyzed.
- * Finally, you can start
gdb directly on the gnat1 executable. gnat1 is the
front-end of GNAT, and can be run independently (normally it is just
called from `gcc'). You can use gdb on gnat1 as you
would on a C program (but The GNAT Debugger GDB for caveats). The
where command is the first line of attack; the variable
lineno (seen by print lineno), used by the second phase of
gnat1 and by the `gcc' backend, indicates the source line at
which the execution stopped, and input_file name indicates the name of
the source file.