In this section:

Overview

Tracing is a very useful enhancement of Insure++ for C++ programmers. Because C++ is such a complicated language, programmers may never know which functions are being called or in which order. Some functions are called during initialization before the main program begins execution. Tracing provides the programmer with the ability to see how functions, constructors, destructors, and more are called as the program runs.

Insure++ prints a message at the entry to every function that includes the function name, filename, and line number of the command that called it. A typical line of output from tracing looks like this:

function_name filename, line_number 

By default, the output is indented to show the proper depth of the trace.

Activating Tracing

Tracing is turned off by default. The easiest way to turn tracing on is to set the trace on value. This turns on tracing for the entire program. See Options Used by Insure++ for more information about this option.

Full traces require either the -Zi compiler switch (Windows) or -g flag (Unix) on your insure compile line. To get file names and line numbers in the trace output, you must use the stack_internal on option when compiling your program, which will slow your program down while every function call prints information.

This problem can be minimized by selectively turning on tracing during the execution of your program only in those sections of the code where you need it most. This can be done using the following Insure++ command in which  flag = 0 turns tracing off and flag = 1 turns tracing on.

void _Insure_trace_enable(int flag)

There is an additional special Insure++ function that works with tracing. The following function may be used to add your own messages to the trace:

void _Insure_trace_annotate(int indent, char *format, ...)

In the above command, indent = 0 means the string is placed in column zero, indent = 1 means string will be indented at proper level, and format should be a normal printf-style format string.

Directing Tracing Output To A File

You can direct tracing output to a specific file by setting a trace_file filename value. You can set this value in the Windows GUI by choosing Advanced tab> Advanced Configuration Settings for Insure++. See Options Used by Insure++ for details.

When you use this option, Insure++ prints a message reminding you where the tracing data is being written. If you would like to eliminate these reminders, you can use the trace_banner off option. See Options Used by Insure++ for additional information.

Example

The following code can be found in the examples\cpp directory as the file trace.cpp:

/*
* File: trace.cpp
*/
int twice(int j) {
        return j*2;
}
class Object {
public:
	int i;
	Object() {
		i = 0;
	}
	Object(int j) {
		i = j;
	}
	operator int() { return twice(i); }
};


int main() {
	Object o;
	int i;


	i = 0;
	return i;
}

You will see the following output if you compile and link trace.cpp with the -Zoi "stack_internal on" option and run the executable with the trace on value set: 

main					[called by non-insure code] 
 Object::Object 		trace.cpp, 21
 Object::operator int	trace.cpp, 24
  twice					trace.cpp, 17

For more information about these and other options see Options Used by Insure++.

  • No labels