summaryrefslogtreecommitdiff
path: root/docs/users_guide/gone_wrong.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/users_guide/gone_wrong.rst')
-rw-r--r--docs/users_guide/gone_wrong.rst138
1 files changed, 138 insertions, 0 deletions
diff --git a/docs/users_guide/gone_wrong.rst b/docs/users_guide/gone_wrong.rst
new file mode 100644
index 0000000000..5737c2d989
--- /dev/null
+++ b/docs/users_guide/gone_wrong.rst
@@ -0,0 +1,138 @@
+.. _wrong:
+
+What to do when something goes wrong
+====================================
+
+.. index::
+ single: problems
+
+If you still have a problem after consulting this section, then you may
+have found a *bug*—please report it! See :ref:`bug-reporting` for
+details on how to report a bug and a list of things we'd like to know
+about your bug. If in doubt, send a report — we love mail from irate users
+:-!
+
+(:ref:`vs-Haskell-defn`, which describes Glasgow Haskell's shortcomings
+vs. the Haskell language definition, may also be of interest.)
+
+.. _wrong-compiler:
+
+When the compiler “does the wrong thing”
+----------------------------------------
+
+.. index::
+ single: compiler problems
+ single: problems with the compiler
+
+"Help! The compiler crashed (or panic'd)!"
+ These events are *always* bugs in the GHC system—please report them.
+
+"This is a terrible error message."
+ If you think that GHC could have produced a better error message,
+ please report it as a bug.
+
+"What about this warning from the C compiler?"
+ For example: ``…warning: \`Foo' declared \`static' but never
+ defined.`` Unsightly, but shouldn't be a problem.
+
+Sensitivity to ``.hi`` interface files
+ GHC is very sensitive about interface files. For example, if it
+ picks up a non-standard ``Prelude.hi`` file, pretty terrible things
+ will happen. If you turn on
+ ``-XNoImplicitPrelude``-XNoImplicitPrelude option, the compiler will
+ almost surely die, unless you know what you are doing.
+
+ Furthermore, as sketched below, you may have big problems running
+ programs compiled using unstable interfaces.
+
+"I think GHC is producing incorrect code"
+ Unlikely :-) A useful be-more-paranoid option to give to GHC is
+ ``-dcore-lint``-dcore-lint option; this causes a “lint” pass to
+ check for errors (notably type errors) after each Core-to-Core
+ transformation pass. We run with ``-dcore-lint`` on all the time; it
+ costs about 5% in compile time.
+
+Why did I get a link error?
+ If the linker complains about not finding ``_<something>_fast``,
+ then something is inconsistent: you probably didn't compile modules
+ in the proper dependency order.
+
+"Is this line number right?"
+ On this score, GHC usually does pretty well, especially if you
+ "allow" it to be off by one or two. In the case of an instance or
+ class declaration, the line number may only point you to the
+ declaration, not to a specific method.
+
+ Please report line-number errors that you find particularly
+ unhelpful.
+
+.. _wrong-compile:
+
+When your program “does the wrong thing”
+----------------------------------------
+
+.. index::
+ single: problems running your program
+
+(For advice about overly slow or memory-hungry Haskell programs, please
+see :ref:`sooner-faster-quicker`).
+
+"Help! My program crashed!"
+ (e.g., a "segmentation fault" or "core dumped") segmentation fault
+
+ If your program has no foreign calls in it, and no calls to
+ known-unsafe functions (such as ``unsafePerformIO``) then a crash is
+ always a BUG in the GHC system, except in one case: If your program
+ is made of several modules, each module must have been compiled
+ after any modules on which it depends (unless you use ``.hi-boot``
+ files, in which case these *must* be correct with respect to the
+ module source).
+
+ For example, if an interface is lying about the type of an imported
+ value then GHC may well generate duff code for the importing module.
+ *This applies to pragmas inside interfaces too!* If the pragma is
+ lying (e.g., about the “arity” of a value), then duff code may
+ result. Furthermore, arities may change even if types do not.
+
+ In short, if you compile a module and its interface changes, then
+ all the modules that import that interface *must* be re-compiled.
+
+ A useful option to alert you when interfaces change is
+ ``-ddump-hi-diffs`` option. It will run ``diff`` on
+ the changed interface file, before and after, when applicable.
+
+ .. index::
+ single: -ddump-hi-diffs
+
+ If you are using ``make``, GHC can automatically generate the
+ dependencies required in order to make sure that every module *is*
+ up-to-date with respect to its imported interfaces. Please see
+ :ref:`makefile-dependencies`.
+
+ If you are down to your last-compile-before-a-bug-report, we would
+ recommend that you add a ``-dcore-lint`` option (for extra checking)
+ to your compilation options.
+
+ So, before you report a bug because of a core dump, you should
+ probably:
+
+ ::
+
+ % rm *.o # scrub your object files
+ % make my_prog # re-make your program; use -ddump-hi-diffs to highlight changes;
+ # as mentioned above, use -dcore-lint to be more paranoid
+ % ./my_prog ... # retry...
+
+ Of course, if you have foreign calls in your program then all bets
+ are off, because you can trash the heap, the stack, or whatever.
+
+"My program entered an 'absent' argument."
+ This is definitely caused by a bug in GHC. Please report it (see
+ :ref:`bug-reporting`).
+
+"What's with this arithmetic (or floating-point) exception?"
+ ``Int``, ``Float``, and ``Double`` arithmetic is *unchecked*.
+ Overflows, underflows and loss of precision are either silent or
+ reported as an exception by the operating system (depending on the
+ platform). Divide-by-zero *may* cause an untrapped exception (please
+ report it if it does).