|Version 15 (modified by igloo, 5 years ago) (diff)|
This part of the wiki collects all the information related to debugging GHC: that includes debugging the compiler itself, the libraries, the runtime system, the code generator, or the build system.
- Testing and measuring
- Use the testsuite to test the compiler on thousands of regression tests
- HackageTesting: Testing GHC against all of hackage.
- Use the nofib suite, and the nofib-analyse tool, to compare performance on 50-odd benchmarks.
- Use count_lines to count the number of lines of code in the compiler
- Use compareSizes to compare the sizes of corresponding .o or .hi files in two trees.
- Reproducing the test case. You may need to install some packages to reproduce the test case, and that may take a little care: Debugging/InstallingPackagesInplace.
- Debugging the compiler itself. If you're debugging a compiler panic or some problem in GHC itself, then go to Debugging/Compiler
- Debugging a compiled program. If the compiled program crashes or panics, then go to Debugging/CompiledCode
- Debugging the runtime system. See Debugging/RuntimeSystem
- Debugging when running under GHCi. See Commentary/Compiler/Backends/GHCi
- Performance debugging.
- Debugging/ProfilingGhc: Profiling the compiler itself.
- Debugging/TickyTicky: for debugging performance-related issues in compiled code. Typically for performance debugging of the Simplifier and Core-level optimisations.
- Debugging/LowLevelProfiling: way to investigate low-level performance, typically for performance debugging of the code generator or RTS.
- Build failures. If you're trying to debug a build failure, then you probably want to look at
The count_lines script, which is put in $(TOP)/inplace/bin, counts source lines and comments. The command-line arguments are the Haskell source files to count.
bash-3.2$ $head/count_lines compiler/*/*hs Code Comments compiler/basicTypes 4565 5092 compiler/cmm 9685 4703 ... compiler/utils 6316 4669 compiler/vectorise 2608 669 TOTAL: 105893 86247 Code Comments Annotations.lhs 57 44 AsmCodeGen.lhs 591 333 Bag.lhs 140 51 .... ZipCfgExtras.hs 43 33 ZipDataflow.hs 779 271 TOTAL: 105893 86247
The source for count_lines is in $(TOP)/utils/count_lines.
The compareSizes program compares the sizes of corresponding files in two trees:
$ ./compareSizes --hi ~/ghc/darcs/ghc ~/ghc/6.12-branch/ghc Size | Change | Filename 25644 | -0.99% | compiler/stage1/build/Demand.hi 21103 | -0.98% | compiler/stage2/build/Demand.hi 180044 | -0.98% | libraries/base/dist-install/build/GHC/Classes.hi 6415 | -0.58% | .../Data/Array/Parallel/Prelude/Base/Tuple.hi 6507 | -0.57% | .../Data/Array/Parallel/Prelude/Base/Tuple.hi [...] 3264 | 3.16% | .../Parallel/Unlifted/Sequential/Flat/Enum.hi 51389 | 3.30% | .../build/Language/Haskell/Extension.hi 1415 | 72.18% | libraries/base/dist-install/build/Data/Tuple.hi 28752162 | -0.00% | TOTAL
- --o to compare object files.
- --hi to compare interface files [DEFAULT]
There's a hack to avoid descending into '*_split' directories.
The source for compareSizes is in $(TOP)/utils/compare_sizes.