Because runtime checking is an integral debugging feature, you can perform all debugging operations while using runtime checking except collecting performance data using the Collector.
Runtime checking:
Detects memory access errors
Detects memory leaks
Collects data on memory use
Works with all languages
Works with multithreaded code
Requires no recompiling, relinking, or makefile changes
Compiling with the -g flag provides source line number correlation in the runtime checking error messages. Runtime checking can also check programs compiled with the optimization -O flag. There are some special considerations with programs not compiled with the -g option.
You can use runtime checking by using the check command.
One way to avoid seeing a large number of errors at once is to use runtime checking earlier in the development cycle, as you are developing the individual modules that make up your program. Write a unit test to drive each module and use runtime checking incrementally to check one module at a time. That way, you deal with a smaller number of errors at a time. When you integrate all of the modules into the full program, you are likely to encounter few new errors. When you reduce the number of errors to zero, you need to run runtime checking again only when you make changes to a module.
To use runtime checking, you must fulfill the following requirements:
Dynamic linking with libc.
Use of the standard libc malloc, free, and realloc functions or allocators based on those functions. Runtime checking provides an application programming interface (API) to handle other allocators. See Runtime Checking Application Programming Interface.
Programs that are not fully stripped; programs stripped with strip -x are acceptable.
For information on the limitations of runtime checking, see Runtime Checking Limitations.