GNAT Abnormal Termination or Failure to Terminate (GNAT User’s Guide for Native Platforms)

#### 6.1.11 GNAT Abnormal Termination or Failure to Terminate ¶

When presented with programs that contain serious errors in syntax or semantics, GNAT may, on rare occasions, experience problems 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 for you to use in such cases 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 switch causes all errors on a given line to be reported. In its absence, GNAT only displays the first error on a line.

  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 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` back end, indicates the source line at which the execution stopped, and `input_file name` indicates the name of the source file.