diff options
author | Alejandro Sánchez Medina <alejandrosanchzmedina@gmail.com> | 2023-09-29 09:23:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-29 10:23:22 +0200 |
commit | cbd1748558e8708a3931d178b8fbd8f2d10869df (patch) | |
tree | bc17319ebd0323f86297c75d5167d7fcd9c7b4cd /doc/stdenv | |
parent | d4df1448cb2610c377feeda767ffa9e4c5949b38 (diff) |
nixpkgs manual: add an alternative example in stdenv-separateDebugInfo (#257861)
* nixpkgs manual: add an alternative example in stdenv-separateDebugInfo This change gets rid of the indirect reference to `nix-env -i` usage and shows how to achieve the same goal with a shell expression. Co-authored-by: Valentin Gagarin <valentin.gagarin@tweag.io>
Diffstat (limited to 'doc/stdenv')
-rw-r--r-- | doc/stdenv/stdenv.chapter.md | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/doc/stdenv/stdenv.chapter.md b/doc/stdenv/stdenv.chapter.md index 08ee0e349d020..366c519751c05 100644 --- a/doc/stdenv/stdenv.chapter.md +++ b/doc/stdenv/stdenv.chapter.md @@ -991,13 +991,56 @@ Hook executed at the end of the fixup phase. If set to `true`, the standard environment will enable debug information in C/C++ builds. After installation, the debug information will be separated from the executables and stored in the output named `debug`. (This output is enabled automatically; you don’t need to set the `outputs` attribute explicitly.) To be precise, the debug information is stored in `debug/lib/debug/.build-id/XX/YYYY…`, where \<XXYYYY…\> is the \<build ID\> of the binary — a SHA-1 hash of the contents of the binary. Debuggers like GDB use the build ID to look up the separated debug information. -For example, with GDB, you can add +:::{.example #ex-gdb-debug-symbols-socat} +# Enable debug symbols for use with GDB + +To make GDB find debug information for the `socat` package and its dependencies, you can use the following `shell.nix`: + +```nix +let + pkgs = import ./. { + config = {}; + overlays = [ + (final: prev: { + ncurses = prev.ncurses.overrideAttrs { separateDebugInfo = true; }; + readline = prev.readline.overrideAttrs { separateDebugInfo = true; }; + }) + ]; + }; + + myDebugInfoDirs = pkgs.symlinkJoin { + name = "myDebugInfoDirs"; + paths = with pkgs; [ + glibc.debug + ncurses.debug + openssl.debug + readline.debug + ]; + }; +in + pkgs.mkShell { + + NIX_DEBUG_INFO_DIRS = "${pkgs.lib.getLib myDebugInfoDirs}/lib/debug"; + + packages = [ + pkgs.gdb + pkgs.socat + ]; + + shellHook = '' + ${pkgs.lib.getBin pkgs.gdb}/bin/gdb ${pkgs.lib.getBin pkgs.socat}/bin/socat + ''; + } ``` -set debug-file-directory ~/.nix-profile/lib/debug -``` -to `~/.gdbinit`. GDB will then be able to find debug information installed via `nix-env -i`. +This setup works as follows: +- Add [`overlays`](#chap-overlays) to the package set, since debug symbols are disabled for `ncurses` and `readline` by default. +- Create a derivation to combine all required debug symbols under one path with [`symlinkJoin`](#trivial-builder-symlinkJoin). +- Set the environment variable `NIX_DEBUG_INFO_DIRS` in the shell. Nixpkgs patches `gdb` to use it for looking up debug symbols. +- Run `gdb` on the `socat` binary on shell startup in the [`shellHook`](#sec-pkgs-mkShell). Here we use [`lib.getBin`](#function-library-lib.attrsets.getBin) to ensure that the correct derivation output is selected rather than the default one. + +::: ### The installCheck phase {#ssec-installCheck-phase} |