Release notes for Purify 5.2 HP-UX

Contents
========

  o Changes from previous releases

  o Supported systems

  o Restrictions and known issues


New in This Release
===================
  - Bug fixes and compatibility with OS 
    patches.
  
  - This release uses a new FlexLm based 
    licensing. Read the new installation
    guide before installing the product.
    Use rs_install instead of pure_install 
    for the installation.

  - This is the last release to support 
    HPUX 10.01 and HPUX 10.10.

New in Purify 5.1
=================
  - HP-UX 9.x is no longer supported. 

  - Support for Cygnus GNUPro 98r2 compilers.

New in Purify 5.0.1
===================
  - Bug fixes and compatibility with OS patches.

  - 32-bit Purify 5.0.1 may be used with
    32-bit PureCoverage 5.0.1.

  - This is the last release to support 
    HP-UX 9.x. Apex Ada is no longer supported.

New in Purify 5.0
=================
  - This version supports "wide mode" applications
    on HPUX 11.00: programs using 64-bit pointers,
    compiled with the option +DA2.0W. Please read
    the Restrictions section for important
    information about 64-bit development.

  - Bug fixes and compatibility with OS patches.

New in Purify 4.4
=================

  - Bug fixes and compatibility with OS patches.

  - Supports FLEXlm based licensing when 
    installed as part of RSDSU.

  - Support for Rational's ClearQuest defect
    tracking tool.  Please see the Restrictions
    and Known Issues section below for details
    on how to use Purify with ClearQuest or
    ClearDDTS.

New in Purify 4.3
=================

  - Support for Apex 3.0.0 Ada and C++ on 
    Solaris and HPUX.

    In addition to support for code generated by
    the Apex 3.0.0 C++ and Ada compilers, this
    release provides Apex GUI integration in the
    form of the Purify Viewer Edit, Debug,
    Check-in, Check-out, and JIT debugging
    features.

New In Purify 4.2
=================

  - bug fixes


==================================================


Supported systems
=================

  Operating system and Hardware
  -----------------------------

    Purify has been tested with HP-UX
    versions 10.01, 10.10, 10.20, and
    11.00 from Hewlett Packard.

    This is the last release to support
    HP-UX versions 10.01 and 10.10. 

    Purify also supports 64-bit wide-mode
    programs on HPUX 11.00. A wide-mode program
    is one that uses 64-bit longs and pointers, 
    built with the compiler option "+DA2.0W."

  Compilers
  ---------

    Purify has been tested with the 
    following compilers:
    - Bundled cc.
    - ANSI cc.
    - C++.
    - aCC.
    - GNU gcc and g++ versions, through version 2.8.1.
    - Cygnus GNUpro v.98r2
    - f77.

    See the "Restrictions and Known Issues" 
    section for more details.

  Threads
  -------

    Purify supports these threads packages:
    - DCE threads (either libdce or libcma).
    - HP-UX kernal threads.

==================================================


Restrictions and Known Issues
=============================

  General
  -------

  - Instrumented programs now always use
    immediate binding for the initial load of
    shared libraries and for any dynamic loads
    using shl_load(). 

    This change was made due to a problem in HP 
    dld patches from June 1998 for HPUX 11.00 
    and August 1998 for HP-UX 10.20, which 
    caused the instrumented application to hang 
    after a call to shl_load(). One known 
    instance of this problem occurs when 
    you use getservbyname() because it loads
    network protocols using shl_load().
 
    Linker and dld patches available after 3/99
    don't have this problem. If the user has 
    an earlier patch, an upgrade is strongly
    recommended. 
 
  - Purify will not run on short
    (14-character) file systems.

  - Operating system revisions below 10.01 are no
    longer supported. 

  - The PA-RISC 1.0 CPU is no longer supported.

  - Profile Based Optimization is not supported.

  - Applications which link to over 50 large
    dynamic libraries may experience reduced
    startup times by setting the runtime option
    -lazy-dld-maps=1.
    
  Using 32-bit vs 64-bit Purify
  -------------------------------
  Purify supports both 32- and 64-bit
  development. "Wide" mode, or 64-bit
  applications are those compiled with
  the +DA2.0W option - apps using 64-bit
  pointers. "Narrow" mode applications
  are traditional 32-bit programs.

  Purify ships in 2 configurations,
  one supporting wide mode and the
  other supporting narrow. Both can
  be installed on the same file
  system, but the 64-bit version 
  can only be used on 64-bit HP-UX
  11.x systems.

  If both install directories are in
  your path, Purify will auto-select
  the correct wide or narrow mode
  version, in most situations (see
  below for limitations). For example, 
  you can install two versions of Purify:

    purify-5.1-beta-H1-hpux  (32-bit)
    purify-5.1-beta-P1-hpux  (64-bit)

  (Beta and proto release with H
  in their name are 32-bit release.
  P signifies a 64-bit release.)

  Or, for a final release:

    purify-5.1-hpux    (32-bit)
    purify-5.1-hpux64  (64-bit)

  If the two install directories are
  in your path, then running "purify"
  will automatically select the
  correct version, based on the type
  of program you are linking. The same
  is true for Quantify.

  Even if only one install directory
  is on your path, auto-selection will
  occur if both versions are properly
  installed: Running pure_install on
  each version will prompt you for the
  location of the other product.

  If you already have your licenses
  installed and do not choose to run
  pure_install, you can set up this
  connection between the two install
  directories by running the script
  "pure_link_32_64" in each install
  directory:

    % cd purify-5.1-hpux
    % pure_link_32_64
    
    % cd purify-5.1-hpux64
    % pure_link_32_64

  Auto-selection only works between 32-
  and 64-bit Purify from 5.0 onwards.

  In some situations, auto-selection
  does not have enough context to tell
  which version (32 or 64-bit) you need.
  This is true for the options:

      -help
      -printhomedir
      -test-license
      -version

  In these cases, Purify defaults to
  the 32-bit version unless you
  explicitly specify what you want,
  using the new -ptr64 and -ptr32
  options:

    % purify -ptr64 -test-license
    % quantify -ptr64 -printhomedir
    % purify -ptr32 -version
    % quantify -ptr32 -help

  Failure to include -ptr<32|64> in these
  cases may yield the wrong information.
  For example, you may get the product
  home directory for the 32-bit product
  when you wanted the 64-bit product.

  These options are NOT necessary during
  normal instrumentation and viewing
  operations:

    % purify cc -g -o foo foo.o
    % quantify -view my_app.qv

  If you attempt to use the 64-bit Purify
  using -ptr64, or by having it on your
  PATH first, on a non 11.x systems, 
  execution will fail. It only runs on
  HP-UX 11.x and later.

  Because of a defect in auto-selection,
  auto-selection does not occur when
  using "-nolink". You must use -ptr64
  or -ptr32 to ensure the correct
  version is used:

    % quantify -ptr32(or -ptr64) -nolink ld mylib.a

  - Restrictions on the HP-UX 11.00-wide
    (64-bit) version of Purify:

    - Static data checking is not supported.

    - Using Purify with old versions of
      the HP-UX linker may cause the install
      test to fail with an error from the
      linker saying the "+nodynhash" option
      is not recognized. You should obtain
      a newer linker from HP. This option
      is support by 64-bit linkers from
      07-Jan-1999 and later.

      You may also workaround this problem
      by include the following in your
      PUREOPTIONS environment variable:

         -force-no-dynhash=no

      The default setting of this option
      (to "yes") is used to workaround an HP
      bug in newer linkers.

    - Shared-library "fini" sections (static
      destructors) do not run.

    - shl_unload and dlclose are not 
      implemented. When a program attempts 
      to unload a shared library, the call
      will appear to succeed, but the
      library will not actually be closed
      or unloaded. Also, C++ "static
      destructors" are not run for the
      library.

    - There is a bug in strlen in the 64-bit
      libc which causes the example program
      "hello.c" to get numerous UMR's instead
      of only one, as you might expect.

    - The open-file summary does not include 
      the file position for 64-bit programs.

    - A breakpoint at purify_stop_here does not
      show a proper stack traceback.

    - Errors involving large amounts of memory
      do not report properly. For instance, an 
      FMR when copying a 17MB freed memory block
      would report as a 1MB FMR.

    - Shared library search is not fully
      implemented: If you application relies
      on locating a library via SHLIB_PATH,
      Purify may not be able to find it.

    - When you want to set a breakpoint on 
      purify_stop_here using HP's wdb (or gdb)
      debugger, use this command:

        b *purify_stop_here

      When you stop at purify_stop_here in
      the debugger, the debugger's stack
      trace will not be correct: You won't
      see the stack trace for you program,
      only for Purify's runtime libraries.

      The easiest way to get around this is
      to set a temporary breakpoint at the
      address which is in register r15
      using this wdb command:

         tb *$r15

      Then, you can use the "continue"
      command to stop in your program at
      the instruction that caused the
      Purify error report.

  - When a Japanese locale is specified using the
    LANG environment variable, instrumentation of
    archive libraries may fail with the message:

    Error: Child process exited with status = 1.

    This is caused by an 'ar' failure in this
    locale.  A workaround is to unsetenv LANG
    before instrumenting.

  User Interface
  --------------

  - If a large number of items are selected,
    "Expand all" followed by "Collapse all" can
    crash some unpatched versions of the
    OpenWindows 3.0 server.
    This occurs if you are displaying on a SUN
    workstation.

  - If you expand or collapse messages while the
    "Continue" or "Reset etc. Continue" buttons
    are displayed, the buttons may subsequently be
    incorrectly positioned.

  - The "Edit" and "Coverage" toolbar items may be
    slow to respond.

  - If EDITOR is set to vuepad
    (/usr/vue/bin/vuepad), the edit button will be
    unable to position the editor window to the
    correct line.  This is a vuepad limitation.
    The workaround is to use a more capable
    editor.

  - The Purify GUI menus and buttons become 
    inaccessible if either the NumLock or 
    ScrollLock key is activated. The workaround
    is to switch them off, or add the following
    line(s) to your $HOME/.Xdefaults file.
 
    ! Ignore the NumLock and ScrollLock keys on 
    ! mouse buttons
    Purify*ignoreModifierMask: Mod3|Mod2
 
    This second workaround will take effect for 
    a new Purify viewer after you restart 
    your X-session or run a command like 
    'xrdb -merge $HOME/.Xdefaults'.

  - The "Invoke ClearDDTS" Button has been
    modified to bring up the ClearQuest web
    interface.  This feature only works with
    Netscape Navigator.

    The site-wide URL for ClearQuest can be
    given during installation or set by
    manually editting the file

	pure_clearquest_url

    in your Purify home directory. A user 
    can override the site-wide URL by setting 
    the environment variable

	PURE_CLEARQUEST_URL

    This feature is partly implemented by a shell
    script, ("pure_invoke_clearquest" in your
    Purify home directory) to allow you to 
    tailor its operation to your needs.  If you 
    wish, you may copy and customize this.
    script. As long as the directory containing 
    the script appears in your search path 
    before your Purify home directory, it will 
    be used instead of the original script.

    If you prefer to use Purify with 
    ClearDDTS, you can do so by setting the 
    X resource:

	Purify*ddtsCommandString

    to 'xddts', if xddts is in your search path,
    or to the full path to your xddts executable.
    xddts is invoked by a shell script
    ("pure_invoke_ddts" in your Purify home
    directory).  If you wish to customize it,
    please read the section on customizing
    "pure_invoke_clearquest" above.

    If you already have a customized
    "pure_invoke_ddts" script in your search path,
    All you need to do is set your X resource as
    described above, and Purify will find 
    your customized script automatically.

    The following copyright applies to portions
    of this ClearQuest integration code:

    Copyright 1996 Netscape Communications 
    Corporation, all rights reserved. Created: 
    Jamie Zawinski , 24-Dec-94.
    Permission to use, copy, modify, distribute, 
    and sell this software and its documentation 
    for any purpose is hereby granted without 
    fee, provided that the above copyright 
    notice appear in all copies and that both 
    that copyright notice and this permission 
    notice appear in supporting documentation.  
    No representations are made about the 
    suitability of this software for any 
    purpose. It is provided "as is" without 
    express or implied warranty.


  Compilers
  ---------


  - The GNU gcc extensions are not tested against
    Purify.  Most gcc extensions will
    probably work fine.  Known limitations at
    present include problems with nested functions
    (e.g.: making a pointer to a nested function
    and attempting to call through it will not
    work).

  - Purify supports the aCC compiler from HP
    but there is a required patch: for HP-UX
    10.01 through 10.10, use PHSS_14507. For
    HP-UX 10.20, use PHSS_17689. For HP-UX 
    10.20 you also need PHSS_17225.


  - C revisions 9.61 through 9.65

     - These compilers generate incorrect
       debugging information for some functions.
       Programs compiled using these compilers may
       not be debuggable after translation.
       In this case Purify may produce a 
       message beginning "Failure relocating..."
       HP patch PHSS_4923 corrects this problem.

  - Exception handling

    g++ 2.7.2 exceptions are not supported.


  -  Aggressive Loading

     - Some compilers load data from memory but
       ignore the data that has been read.  Purify
       will signal a UMR if the loaded data is
       uninitialized.  In some sense this is a
       false error report because the
       uninitialized data can not affect your
       program.

  Purify'ing X Applications
  -------------------------

  - When running a Purify'd X application, there
    is a potential for deadlock if your
    application causes Purify to generate a
    message while the application is holding the X
    lock, since Purify will be unable to generate
    the message, and the application is blocked
    until the message is delivered.

    To avoid this kind of problem, you should run
    your application on a different X server than
    the Purify UI or Purify stderr output, or you
    should use the -log-file= or -view-file=
    options to specify a file to capture messages
    for inspection after your application is
    finished.

    A convenient way to debug on two displays is
    to pre-start the Purify Viewer on one display
    ("slave"), and then start the application on
    the other display ("master"):

	% purify -display slave:0 -view a.out.X &
	% a.out.X -display master:0

    The two commands must be executed on the same
    computer, but it could be the workstation
    associated with either display, or altogether
    another computer remote from both displays.
    The application will connect to the already
    started Purify Viewer, and messages will not
    conflict with the X display interactions of
    the application under test.

  Debuggers
  ---------

  -  XDB & Softdebug

     - Use /purify_xdb to
       invoke xdb on an instrumented program.

     - An instrumented program receives a signal
       18 (death of child) during its
       initialization.  Place "z 18 sir" in your
       ~/.xdbrc file to suppress this warning.
       Failure to suppress the warning will
       sometimes cause xdb to fail.

     - XDB, when debugging a program that uses
       shared libraries, reads the symbol table
       from /lib/dld.sl.  However, Purify 
       has changed your program to use an
       instrumented version of dld.sl.  The
       symptom of this mismatch is the message:

         Wait...loading shared-library map tables.
         xdb panic: Mapped addresses for dld
	      overlap text segment for dld

       There is a simple workaround for this
       problem and we've implemented it in the
       shell script /purify_xdb.
       Whenever you use xdb on an instrumented
       program use this script to invoke xdb.

     - Typing ^C while running an instrumented
       program under xdb requires caution. There
       is a high probability that the interrupt
       will occur inside the code Purify has
       added to your application.  If this is the
       case, you must single step or set a
       breakpoint and continue before you attempt
       to call any subroutines (the Purify 
       API is an example).

     - The XDB single stepping command, 's'
       sometimes fails to find the next source
       line.  When this happens, usually near a
       subroutine call, program execution
       continues until the next breakpoint.  The
       'S' command is always reliable.

  - DDE - Distributed Debugging Environment

    - The DDE debugger at release 2.10 has been
      used with instrumented programs.  The shell
      script: /purify_dde
      implements one of the workarounds.

    - Instrumented programs get a SIGCHLD signal
      at program initialization.  One workaround
      is to just hit "go" when the program stops.
      The following commands added to a .dderc
      file also help:

	prop system -on
	alias `after_debug delete intercept signal SIGCHLD; \
	  prop system -off; \
	  breakpoint -in main -entry -exit; \
	  go

  - Attaching to a running process

    JIT debugging may fail to attach to your
    application if the executable resides on an
    NFS file system mounted without the "nointr"
    option.  The HP Debugger reference manual
    says:

     "If you get a Permission denied error message
      when you attach to a running process, it is
      likely that you are running either the
      debugger or the target process over an NFS
      link and that the relevant file system is
      mounted with the default intr option.  You
      must mount the file system with the nointr
      option to resolve this problem.  Use a
      command like the following to mount the file
      system containing the debugger:

	 mount -o nointr[,other_options] \
	     system:/opt/langtools /tools

      Use a command like the following to mount
      the file system containing the target
      process:

	 mount -o nointr[,other_options] \
	     system:/test_area /test

      It is probably easier to create an auxiliary
      mount for the file system than to unmount
      and remount it."
 

  Old Style Fixups
  ----------------

  Purify does not support a type of 
  relocation information known as "old style
  fixups".  These were generated by HP-UX system
  software before release 3.0.  If Purify 
  detects old style fixups the message:
      Object file has incompatible format
	(may be older than HPUX 3.0)
  is generated.  We have seen this problem with
  HP's libsql.a and some of Oracle's Oracle6
  libraries.

  There is a simple workaround. Given a problem
  object module (or modules) the workaround is to
  have /bin/ld build a new object module.  Suppose
  the old object modules are called `foo.o' and
  `bar.o'.  Issuing the command:
       % ld -r -o new_foo.o foo.o
       % ld -r -o new_bar.o bar.o
  or
       % ld -r -o foo_and_bar.o foo.o bar.o
  would generate a new object module where the old
  style fixups have been removed.

  In the case of an archive file the following
  script will create a new archive given the full
  pathname of the original:

      #!/bin/sh
      # Remove old fixups from an archive.
      # Supply original .a name as first argument.
      cd /tmp
      lib=new_`basename $1`
      ar x $1
      rm -f $lib
      for member in `ar t $1` ; do
          ld -r -o _$member $member
          ar q $lib _$member
          rm $member _$member
      done
      echo Created `pwd`/$lib

  Threads
  -------

  - Call chains describing when memory was
    malloced or freed do not always include the
    thread id.

  - The Purify API functions purify_map_pool() and
    purify_map_pool_id() are not MT safe.

  - Customers using unsupported threads packages
    should contact Rational Software technical 
    support (support@rational.com) to ensure 
    compatibility.

  Unsupported Features
  --------------------

  - SBR and SBW errors are not reported on HPUX.