1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>Using Rational Purify with CIAO</title>
<!-- $Id$ -->
</head>
<body>
<h1>Using Rational Purify with CIAO</h1>
<p>This document is about using Purify with Visual Studio 7.1 to track down
memory leaks and other bugs in CIAO applications. For the Linux/Unix
environment, Valgrind is a better-suited tool - see Will Otte's documentation
on using Valgrind with CIAO in this directory.</p>
<p>Purify can be run from within Visual Studio, or standalone. The executable is
c:\Program Files\Rational\PurifyPlus\purifyw.exe. Typing this will bring up the
same Purify window you see if you run it from within Visual Studio. You can
install Purify from the web by going to <A href="file://\\Atlantis\software\RationSuiteEnterprise-v2003-06-12">
\\Atlantis\software\RationSuiteEnterprise-v2003-06-12</A> and clicking
on <code>C57BPML.zip</code>. This will install a whole bunch of Rational stuff
by default, so you will probaby want to deselect everything but PurifyPlus,
although Quantify is a good bottleneck-finder when you're trying to improve
performance, so that might be worth installing and playing with as well. During
the installation process, you'll be prompted for a mode of licensing. Select
the use of a license server, and then you'll be prompted for its address. Use <code>
rational.vuse.vanderbilt.edu</code>.</p>
<p>The option to exclude all modules in Windows directories will probably be set
by default, but if you notice memory leaks reported for Windows stuff, you
might want to double check this and turn it off. From the PurifyPlus menu bar
item in Visual Studio, it's at <b>PurifyPlus->Purify->Settings->DefaultSettings->PowerCheck</b>.
When run for the first time, Purify will instrument all libraries linked to the
executable. Select <b>PurifyPlus->Purify->Run</b>, and a window will pop
up prompting you for the executable name, command line options, and working
directory.</p>
<p>Purify's output will appear in the Visual Studio text editing window. This
output can be saved to the given filename. The type of error reported is
indicated by a 3-letter code - the most common are UMR (Unitialized Memory
Read), FMM (Freeing Mismatched Memory), and MLK (Memory Leak). Each of these
can be expanded to show the call stack. The depth of the call stack can be
modified in Settings if it's not deep enough. FMM messages will show both
allocation and deallocation call stacks.</p>
Quite often in CIAO, we will want to Purify a process that is spawned by
another process, and therefore not directly runnable in Purify. This is fairly
easy to do, but it must be done from the command line. If the name of the child
process we want to instrument is <code>child.exe</code>, then it can be
instrumented by typing
<br>
<code>purifyw /Run=no /Replace=yes child.exe</code><br>
This will rename the original executable as <code>child.exe.Original</code>,
and the new instrumented executable will be <code>child.exe</code>. Now when
you run the parent process under Purify, you'll see one window opened up in
Visual Studio's text editor for this process, and when the child process is
spawned, a second window will open. A couple of caveats to make this work
smoothly:
<ul>
<li>
Instrumented executables run 2 to 5 times slower than uninstrumented ones, so
any timeouts in the code should be extended accordingly. For example, if an
instrumented NodeApplication is spawned by NodeManager, add <code>-d 15</code> or
<code>-d 20</code>
to NodeManager's command line.
<li>
If an instrumented process is simply killed, there will probably be many
spurious error messages, mostly related to ORB resources that were not cleaned
up by a graceful shutdown. All processes tested with Purify should have a
graceful shutdown built in to eliminate these bogus memory leak messages.
</li>
</ul>
<hr>
<address>Jeff Parsons</address>
<!-- hhmts start --> Last modified: Oct 3 2005
<!-- hhmts end -->
</body>
</html>
|