97 lines · 4.4 KB · Text
RawDownload
Purify (tm) and Quantify (tm) are commercial software qualityassurance tools available from IBM <http://www.ibm.com/software/rational/>.Purify is essentially a memory accessverifier and leak detector; Quantify is a C level profiler.  The restof this file assumes you generally know how to use Purify andQuantify, and that you have installed valid licenses for theseproducts.  If you haven't installed such licenses, you can ignore thefollowing since it won't help you a bit! You can easily build a Purify or Quantify instrumented version of thePython interpreter by passing the PURIFY variable to the make commandat the top of the Python tree:     make PURIFY=purify This assumes that the `purify' program is on your $PATH.  Note thatyou cannot both Purify and Quantify the Python interpreter (or anyprogram for that matter) at the same time.  If you want to build aQuantify'd interpreter, do this:     make PURIFY=quantify Starting with Python 2.3, pymalloc is enabled by default.  Thiswill cause many supurious warnings.  Modify Objects/obmalloc.cand enable Py_USING_MEMORY_DEBUGGER by uncommenting it.README.valgrind has more details about why this is necessary.See below about setting up suppressions.  Some tests may notrun well with Purify due to heavy memory or CPU usage.  Thesetests may include: test_largefile, test_import, and test_long. Please report any findings (problems or no warnings) to python-dev@python.org.It may be useful to submit a bug report for any problems.   When running the regression test (make test), I have found it usefulto set my PURIFYOPTIONS environment variable using the following(bash) shell function.  Check out the Purify documentation fordetails: p() {  chainlen='-chain-length=12'  ignoresigs='-ignore-signals="SIGHUP,SIGINT,SIGQUIT,SIGILL,SIGTRAP,SIGAVRT,SIGEMT,SIGFPE,SIGKILL,SIGBUS,SIGSEGV,SIGPIPE,SIGTERM,SIGUSR1,SIGUSR2,SIGPOLL,SIGXCPU,SIGXFSZ,SIGFREEZE,SIGTHAW,SIGRTMIN,SIGRTMAX"'  followchild='-follow-child-processes=yes'  threads='-max-threads=50'  export PURIFYOPTIONS="$chainlen $ignoresigs $followchild $threads"  echo $PURIFYOPTIONS} Note that you may want to crank -chain-length up even further.  Avalue of 20 should get you the entire stack up into the Python C codein all situations. With the regression test on a fatly configured interpreter(i.e. including as many modules as possible in your Modules/Setupfile), you'll probably get a gabillion UMR errors, and a few MLKerrors.  I think most of these can be safely suppressed by putting thefollowing in your .purify file:     suppress umr ...; "socketmodule.c"    suppress umr ...; time_strftime    suppress umr ...; "dbmmodule.c"    suppress umr ...; "gdbmmodule.c"    suppress umr ...; "grpmodule.c"    suppress umr ...; "nismodule.c"    suppress umr ...; "pwdmodule.c" Note: this list is very old and may not be accurate any longer.It's possible some of these no longer need to be suppressed.You will also need to suppress warnings (at least umr)from Py_ADDRESS_IN_RANGE. This will still leave you with just a few UMR, mostly in the readlinelibrary, which you can safely ignore.  A lot of work has gone intoPython 1.5 to plug as many leaks as possible. Using Purify or Quantify in this way will give you coarse grainedreports on the whole Python interpreter.  You can actually get morefine grained control over both by linking with the optional `pure'module, which exports (most of) the Purify and Quantify C API's intoPython.  To link in this module (it must be statically linked), edityour Modules/Setup file for your site, and rebuild the interpreter.You might want to check out the comments in the Modules/puremodule.cfile for some idiosyncrasies. Using this module, you can actually profile or leak test a smallsection of code, instead of the whole interpreter.  Using this inconjuction with pdb.py, dbx, or the profiler.py module really givesyou quite a bit of introspective power. Naturally there are a couple of caveats.  This has only been testedwith Purify 4.0.1 and Quantify 2.1-beta on Solaris 2.5.  Purify 4.0.1does not work with Solaris 2.6, but Purify 4.1 which reportedly will,is currently in beta test.  There are funky problems when Purify'ing a Python interpreter build with threads.  I've had a lot of problemsgetting this to work, so I generally don't build with threads when I'm Purify'ing.  If you get this to work, let us know! -Barry Warsaw <bwarsaw@cnri.reston.va.us>