binutils-gdb/gprofng
Vladimir Mezentsev 99c3fe52d2 gprofng: fix infinite recursion on calloc with multi-threaded applications
libcollector uses pthread_getspecific() and pthread_setspecific() to access
thread local memory. libcollector uses this memory to check that
interposed functions (like malloc, calloc or free) don't have recursion.
The first time we call calloc(), we call pthread_setspecific() to create
a thread-specific value.
On Ubuntu machine, pthread_setspecific() calls calloc(), and we cannot intercept
such recursion.
gcc supports thread-local storage. For example,
  static __thread int reentrance = 0;
I rewrote code using this instead of pthread_setspecific().

gprofng/ChangeLog
2024-03-23  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

	PR gprofng/31460
	* libcollector/heaptrace.c: Use the __thread variable to check for
	* reentry. Clean up code.
2024-03-25 16:29:41 -07:00
..
common gprofng: Add hardware counter profiling for the Ampere system 2024-02-25 17:30:35 -08:00
config Update year range in copyright notice of binutils files 2024-01-04 22:58:12 +10:30
doc Change version to 2.42.50 and regenerate files 2024-01-15 15:13:36 +00:00
examples/mxv-pthreads gprofng: add an examples directory 2024-01-10 09:44:52 -08:00
gp-display-html gprofng: change use of bignum to use of bigint 2024-02-28 16:32:29 -08:00
libcollector gprofng: fix infinite recursion on calloc with multi-threaded applications 2024-03-25 16:29:41 -07:00
src Fix 31252 gprofng causes testsuite parallel jobs fail 2024-01-22 09:56:42 -08:00
testsuite Fix 31252 gprofng causes testsuite parallel jobs fail 2024-01-22 09:56:42 -08:00
acinclude.m4
aclocal.m4 Regenerate with automake-1.15.1 2022-07-09 20:10:47 +09:30
configure Change version to 2.42.50 and regenerate files 2024-01-15 15:13:36 +00:00
configure.ac Update year range in copyright notice of binutils files 2024-01-04 22:58:12 +10:30
Makefile.am Update year range in copyright notice of binutils files 2024-01-04 22:58:12 +10:30
Makefile.in Update year range in copyright notice of binutils files 2024-01-04 22:58:12 +10:30
README gprofng docs: mention HTML / PDF in the gprofng README 2022-06-14 14:02:19 -07:00

What is gprofng?

   Gprofng is the GNU Next Generation profiler for analyzing the performance 
   of Linux applications.  Gprofng allows you to:
     - Profile C / C++ / Java / Scala applications without needing to recompile
     - Profile multi-threaded applications
     - Analyze and compare multiple experiments 
     - Use time-based sampling and / or hardware event counters

Building gprofng

   Gprofng is distributed with binutils.  To build gprofng, you build binutils.
   Overview:
      1. Set paths
      2. Verify prerequisites 
      3. Git clone 
      4. Configure, make, and make install
   Details follow for each of these.

1. Set paths

   If you are configuring binutils for the default location, it will use:
       /usr/local
   In your shell initialization procedure, set your paths using commands 
   similar to these: 
      export PATH=/usr/local/bin:$PATH
      export MANPATH=/usr/local/share/man:$MANPATH
      export INFOPATH=/usr/local/share/info/:$INFOPATH

2. Verify prerequisites

  To build a recent version of binutils, it is useful to have a developer
  system with the most recent compilers, libraries, and operating system.
  Development systems will typically already include most of these: 

     bison  bison-devel  bzip2  elfutils-debuginfod-client-devel 
     expat-devel  flex  gcc  gcc-c++  git-core  git-core-doc  gmp-devel
     help2man  libbabeltrace-devel  libipt-devel  m4  make  mpfr-devel 
     ncurses-devel  perl-Data-Dumper  tar  texinfo  xz  zlib-devel
     java-17-openjdk-devel 

  CAUTION: The list of prerequisites changes depending on your operating system
  and changes as binutils evolves.  The list above is a snapshot of the useful
  packages in early 2022 for Red Hat Enterprise Linux and Oracle Linux. 

  Your system may use other packages; for example, you may be able to use a
  different version of Java than shown above.  If there are failures, you may
  need to search for other packages as described in the "Hints" section below.

3. Git clone 

   Select a binutils repository and a branch that you would like 
   to start from.  For example, to clone from the master at 
   sourceware.org, you could say: 
     git clone http://sourceware.org/git/binutils-gdb.git CloneDir

4. Configure, make, and install

   There are many options for configure (see: configure --help).  For example,
   --prefix sets the destination, as described in the "Hints" section below.
   If the default destination /usr/local is acceptable for your needs, then
   after the clone operation finishes, you can simply say:

      mkdir build
      cd build
      ../CloneDir/configure
      make
      sudo make install

Getting started

  To start using gprofng, see the tutorial available by saying:
      info gprofng

HTML and PDF documentation

   You may want to generate an HTML or PDF version of the manual in addition
   to the above info pages.  These versions may be easier to read and easier
   to search.  To generate HTML:

      cd build        # the same build directory you created above
      cd gprofng/doc
      make html
      sudo make install-html

   If you would like PDF documentation, you will need the texi2dvi utility.
   If it is not already included in the texinfo package mentioned above, try
   installing package texinfo-tex.  To generate PDF:

      cd build        # the same build directory you created above
      cd gprofng/doc
      make pdf
      sudo make install-pdf

Hints and tips for building binutils

  - Use the script(1) command to write a log of your build.

  - If you run multiple commands at once (for example: make --jobs=10) then you
    should also use make option:
          --output-sync
    Without --output-sync, the log would be difficult to interpret.

  - Search the log for errors and warnings, for example:
        configure: WARNING: <package> is missing or unusable; some features 
                   may be unavailable. 
    The above message suggests that <package> may be needed on your system.

  - Sometimes the above message is not sufficiently specific to guide you to
    the right package.  In the directory where the failure happens, config.log
    may identify a specific missing file, and your package manager may allow
    you to search for it. For example, if build/gprofng/config.log shows that
    javac is missing, and if your package manager is dnf, you could try:
       dnf --repo='*' whatprovides '*/javac'

  - You can set a custom destination directory using configure --prefix.
    This is useful if you prefer not to change /usr/local, or if you are not
    allowed to do so.  If you set a custom prefix, be sure to change all three
    paths mentioned in the PATH section above.