# Heap profiling with nhc98

Heap profiling allows a programmer to see how heap space is being used within their program. This can enable space "leaks" to be identified, and their causes tracked down.

### To obtain a heap profile of a computation:

1. Compile all modules of the program with the `-p` option; also specify `-p` at link-time. Using `hmake -p` does all the necessary compiling and linking automatically. eg. to compile `MyProg.hs` and everything it depends on for heap profiling simply use `hmake -p MyProg`

2. Run the program with additional runtime arguments: e.g. `./MyProg +RTS -p -RTS` to output "producer" heap profile data to the file `MyProg.hp`

3. Convert the raw profile data to a PostScript graph with the utility hp2graph, and view it in your favorite viewer.

### Heap profiling options

`-isize` | set the profiling interval to `size` (in number of allocations, or in seconds)
`-p` | select producer profiling
`-c` | select construction profiling
`-m` | select per-module profiling
`-r[num]` | select retainer profiling - num is maximum retainer set size (default=1)
`-l` | select lifetime profiling
`-b` | select biographical profiling
`-pnames` | restrict profile to named producers
`-cnames` | restrict profile to named constructions
`-mnames` | restrict profile to named modules
`-rnames` | restrict profile to named retainers (default=1)
`-lnums` | restrict profile to numbered lifetimes (min-, -max, or min-max)
`-bname` | restrict profile to named biographical phase (lag, drag, void, or use)

The first occurrence of any of the options pcmrbl determines the primary form of the profile. Subsequent pcmrbl options introduce restrictions on the profile, for instance -p -c: asks for a producer profile restricted to producers of the `:' (list) construction. Restrictions are almost all orthogonal to each other, and you may have as many as you like. Except for biography and lifetime restrictions, the format is of a list of names, separated by commas. (In general, you may need to use quotes around the list to protect special characters from the shell.)

The latest updates to these pages are available on the WWW from `http://www.haskell.org/nhc98/`

York Functional Programming Group