nixpkgs/pkgs/development/libraries/glibc/mtrace.nix
Maximilian Bosch 02bce71cab
mtrace: init at 2.33-50
`mtrace(1)` is a small Perl script that interprets and provides
human-readable output for `malloc(3)` traces.

Even though this is actually part of `glibc` itself I decided to place
this into its own package. The main reason for this is that this script
has a runtime dependency on Perl which would complicate `stdenv`
bootstrapping since we'd have to compile another Perl that doesn't depend on
the bootstrap tools that is used as runtime dependency for the
stage2 glibc.

Since this is only a dev/debugging tool, splitting this up seemed like a
reasonable choice to me.

On a leaking C program, this can be used like this:

    $ env MALLOC_TRACE=$(pwd)/trace ./a.out
    $ ./result/bin/mtrace ./trace

    Memory not freed:
    -----------------
               Address     Size     Caller
    0x0000000001875690      0x4  at 0x401151

Closes #141924
2021-10-25 01:01:29 +02:00

39 lines
1.2 KiB
Nix

{ glibc, perl }:
# Small wrapper which only exposes `mtrace(3)` from `glibc`. This can't be placed
# into `glibc` itself because it depends on Perl which would mean that the final
# `glibc` inside a stdenv bootstrap has a dependency `glibc -> perl -> bootstrap tools`,
# so this is now in its own package that isn't used for bootstrapping.
#
# `glibc` needs to be overridden here because it's still needed to `./configure` the source in order
# to have a build environment where we can call the needed make target.
glibc.overrideAttrs ({ meta ? {}, ... }: {
pname = "glibc-mtrace";
buildPhase = ''
runHook preBuild
mkdir malloc
make -C ../glibc-${glibc.minorRelease}/malloc objdir=`pwd` `pwd`/malloc/mtrace;
runHook postBuild
'';
installPhase = ''
mkdir -p $out/bin
mv malloc/mtrace $out/bin/
'';
# Perl interpreter used for `mtrace`.
buildInputs = [ perl ];
# Reset a few things declared by `pkgs.glibc`.
outputs = [ "out" ];
separateDebugInfo = false;
meta = meta // {
description = "Perl script used to interpret and provide human readable output of the trace log contained in the file mtracedata, whose contents were produced by mtrace(3).";
};
})