nix icon indicating copy to clipboard operation
nix copied to clipboard

coredump while printing env from the debugger

Open kjeremy opened this issue 1 year ago • 1 comments

Describe the bug

Using this flake:

{
  description = "A very basic flake";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=0874168639713f547c05947c76124f78441ea46c";
    treefmt-nix = {
      url = "github:numtide/treefmt-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, systems, nixpkgs, treefmt-nix }:
  let
    eachSystem = f: nixpkgs.lib.genAttrs (import systems) (system: f nixpkgs.legacyPackages.${system});

    # Eval the treefmt modules from ./treefmt.nix
    treefmtEval = eachSystem (pkgs: treefmt-nix.lib.evalModule pkgs ./treefmt.nix);
  in {
    formatter = eachSystem (pkgs: treefmtEval.${pkgs.system}.config.build.wrapper);
  };
}

treefmt.nix:

{ pkgs, ... }:
{
  # Used to find the project root
  projectRootFile = "flake.nix";

  #programs.nixpkgs-fmt.enable = true;
  programs.ruff.check = false;
  programs.ruff.format = false;
}

run nix eval .#formatter.x86_64-linux --show-trace --debugger

In the debugger run :c to continue past the warning about <nixpkgs-overlays>. When the debugger is stopped type in :env and watch nix dump core.

[jkolb@nixos:~/blah]$ nix eval .#formatter.x86_64-linux --show-trace --debugger
warning: Git tree '/home/jkolb/blah' is dirty
error: cannot look up '<nixpkgs-overlays>' in pure evaluation mode (use '--impure' to override)

This exception occurred in a 'tryEval' call. Use --ignore-try to skip these.

Nix 2.23.3 debugger
Type :? for help.
nix-repl> :c
error: The option `warnings' does not exist. Definition values:
       - In `/nix/store/23qfzpsx2dsgi4rzdvfarr1h0376vv42-source/programs/ruff.nix': [ ]

nix-repl> :env
Env level 0
static: firstDef baseMsg 

Env level 1
static: type config result options checked merged extendModules withWarnings legacyModules regularModules internalModule checkUnmatched 

Env level 2
static: args prefix modules check specialArgs extensionOffset evalModulesArgs 

Env level 3
static: mkIf importJSON importTOML evalModules setDefaultModuleLocation unifyModuleSyntax applyModuleArgsIfFunction mergeModules mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions pushDownProperties dischargeProperties filterOverrides sortProperties fixupOptionType mkAssert mkMerge mkOverride mkOptionDefault mkDefault mkImageMediaOverride mkForce mkVMOverride mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule mkRenamedOptionModule mkRenamedOptionModuleWith mkMergedOptionModule mkChangedOptionModule mkAliasOptionModule mkDerivedConfig doRename collectModules filterOverrides' defaultPriority mkAliasIfDef mkAliasAndWrapDefsWithPriority 

Env level 4
static: isFunction isString isBool attrNames isAttrs catAttrs mapAttrs zipAttrsWith isList head filter elem concatLists length foldl' any all sort concatMap concatStringsSep id types min warnIf attrByPath setAttrByPath getAttrFromPath mapAttrsToList mapAttrsRecursiveCond optionalAttrs recursiveUpdate imap1 findFirst optional toList reverseList optionalString isOption literalExpression showOption showFiles unknownModule mkOption showDefs showDeclPrefix showRawDecls 

Env level 5
Aborted (core dumped)

Steps To Reproduce

See above

Expected behavior

It should not crash.

nix-env (Nix) 2.23.3

Additional context

[jkolb@nixos:~/blah]$ coredumpctl info --no-pager
           PID: 267396 (nix)
           UID: 1000 (jkolb)
           GID: 100 (users)
        Signal: 6 (ABRT)
     Timestamp: Mon 2024-08-12 11:04:22 EDT (4min 37s ago)
  Command Line: nix eval .#formatter.x86_64-linux --show-trace --debugger
    Executable: /nix/store/qa76400bs3qsqxriwd4his04hi5mfhz8-nix-2.23.3/bin/nix
 Control Group: /user.slice/user-1000.slice/[email protected]/session.slice/vte-spawn-8e6e69f1-f2a7-48bf-a47b-8bf712147f6d.scope
          Unit: [email protected]
     User Unit: vte-spawn-8e6e69f1-f2a7-48bf-a47b-8bf712147f6d.scope
         Slice: user-1000.slice
     Owner UID: 1000 (jkolb)
       Boot ID: 26b8ce2a56184e92897d6341816233e0
    Machine ID: bee984703f0c4de58d57703565a26d2e
      Hostname: nixos
       Storage: /var/lib/systemd/coredump/core.nix.1000.26b8ce2a56184e92897d6341816233e0.267396.1723475062000000.zst (present)
  Size on Disk: 5.7M
       Message: Process 267396 (nix) of user 1000 dumped core.
                
                Module libkeyutils.so.1 without build-id.
                Module libkrb5support.so.0 without build-id.
                Module libcom_err.so.3 without build-id.
                Module libk5crypto.so.3 without build-id.
                Module libkrb5.so.3 without build-id.
                Module libunistring.so.5 without build-id.
                Module libattr.so.1 without build-id.
                Module libbrotlicommon.so.1 without build-id.
                Module libaws-c-common.so.1 without build-id.
                Module libaws-checksums.so.1.0.0 without build-id.
                Module libaws-c-sdkutils.so.1.0.0 without build-id.
                Module libaws-c-cal.so.1.0.0 without build-id.
                Module libaws-c-compression.so.1.0.0 without build-id.
                Module libs2n.so.1 without build-id.
                Module libaws-c-io.so.1.0.0 without build-id.
                Module libaws-c-http.so.1.0.0 without build-id.
                Module libaws-c-auth.so.1.0.0 without build-id.
                Module libaws-c-s3.so.0unstable without build-id.
                Module libaws-c-event-stream.so.1.0.0 without build-id.
                Module libaws-c-mqtt.so.1.0.0 without build-id.
                Module libgssapi_krb5.so.2 without build-id.
                Module libpsl.so.5 without build-id.
                Module libidn2.so.0 without build-id.
                Module libnghttp2.so.14 without build-id.
                Module libxml2.so.2 without build-id.
                Module libbz2.so.1 without build-id.
                Module libzstd.so.1 without build-id.
                Module liblzma.so.5 without build-id.
                Module libacl.so.1 without build-id.
                Module libz.so.1 without build-id.
                Module libssh2.so.1 without build-id.
                Module libpcre.so.1 without build-id.
                Module libhttp_parser.so.2.9 without build-id.
                Module libcpuid.so.16 without build-id.
                Module libbrotlidec.so.1 without build-id.
                Module libbrotlienc.so.1 without build-id.
                Module libseccomp.so.2 without build-id.
                Module libaws-crt-cpp.so without build-id.
                Module libaws-cpp-sdk-core.so without build-id.
                Module libaws-cpp-sdk-s3.so without build-id.
                Module libaws-cpp-sdk-transfer.so without build-id.
                Module libarchive.so.13 without build-id.
                Module libgit2.so.1.7 without build-id.
                Module libboost_context.so.1.81.0 without build-id.
                Module libgcc_s.so.1 without build-id.
                Module libstdc++.so.6 without build-id.
                Module liblowdown.so.1 without build-id.
                Module libeditline.so.1 without build-id.
                Stack trace of thread 267396:
                #0  0x00007fe24bdb57dc __pthread_kill_implementation (libc.so.6 + 0x927dc)
                #1  0x00007fe24bd63516 raise (libc.so.6 + 0x40516)
                #2  0x00007fe24bd4b935 abort (libc.so.6 + 0x28935)
                #3  0x00007fe24ca38fc0 _ZN3nix16printEnvBindingsERKNS_11SymbolTableERKNS_9StaticEnvERKNS_3EnvEi.cold (libnixexpr.so + 0x38fc0)
                #4  0x00007fe24ca97e23 _ZN3nix16printEnvBindingsERKNS_9EvalStateERKNS_4ExprERKNS_3EnvE (libnixexpr.so + 0x97e23)
                #5  0x00007fe24c7b5abd _ZN3nix7NixRepl11processLineENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE (libnixcmd.so + 0x6dabd)
                #6  0x00007fe24c7b7bf8 _ZN3nix7NixRepl8mainLoopEv (libnixcmd.so + 0x6fbf8)
                #7  0x00007fe24c7be118 _ZN3nix15AbstractNixRepl9runSimpleENS_3refINS_9EvalStateEEERKSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_5ValueESt4lessISA_E19traceable_allocatorISt4pairIKSA_SC_EEE (libnixcmd.so + 0x76118)
                #8  0x00007fe24ca9b858 _ZN3nix9EvalState12runDebugReplEPKNS_5ErrorERKNS_3EnvERKNS_4ExprE (libnixexpr.so + 0x9b858)
                #9  0x00007fe24ca93f53 _ZN3nix16EvalErrorBuilderINS_11ThrownErrorEE10debugThrowEv (libnixexpr.so + 0x93f53)
                #10 0x00007fe24cb3008c _ZNSt17_Function_handlerIFvRN3nix9EvalStateENS0_6PosIdxEPPNS0_5ValueERS4_ENS0_L12primop_throwMUlS2_S3_S6_S7_E_EE9_M_invokeERKSt9_Any_dataS2_OS3_OS6_S7_.lto_priv.0 (libnixexpr.so + 0x13008c)
                #11 0x00007fe24caa066f _ZN3nix9EvalState12callFunctionERNS_5ValueEmPPS1_S2_NS_6PosIdxE (libnixexpr.so + 0xa066f)
                #12 0x00007fe24caa415c _ZN3nix8ExprCall4evalERNS_9EvalStateERNS_3EnvERNS_5ValueE (libnixexpr.so + 0xa415c)
                #13 0x00007fe24ca9fbbc _ZN3nix7ExprLet4evalERNS_9EvalStateERNS_3EnvERNS_5ValueE (libnixexpr.so + 0x9fbbc)
                #14 0x00007fe24cb0dfe5 _ZN3nixL8prim_seqERNS_9EvalStateENS_6PosIdxEPPNS_5ValueERS3_.lto_priv.0 (libnixexpr.so + 0x10dfe5)
                #15 0x00007fe24caa09d2 _ZN3nix9EvalState12callFunctionERNS_5ValueEmPPS1_S2_NS_6PosIdxE (libnixexpr.so + 0xa09d2)
                #16 0x00007fe24caa415c _ZN3nix8ExprCall4evalERNS_9EvalStateERNS_3EnvERNS_5ValueE (libnixexpr.so + 0xa415c)
                #17 0x00007fe24ca8ab35 _ZN3nix9EvalState10forceAttrsIZNS0_10forceAttrsERNS_5ValueENS_6PosIdxESt17basic_string_viewIcSt11char_traitsIcEEEUlvE_EEvS3_T_S8_ (libnixexpr.so + 0x8ab35)
                #18 0x00007fe24caa267b _ZN3nix10ExprSelect4evalERNS_9EvalStateERNS_3EnvERNS_5ValueE (libnixexpr.so + 0xa267b)
                #19 0x00007fe24caa0341 _ZN3nix9EvalState12callFunctionERNS_5ValueEmPPS1_S2_NS_6PosIdxE (libnixexpr.so + 0xa0341)
                #20 0x00007fe24caa415c _ZN3nix8ExprCall4evalERNS_9EvalStateERNS_3EnvERNS_5ValueE (libnixexpr.so + 0xa415c)
                #21 0x00007fe24caa0341 _ZN3nix9EvalState12callFunctionERNS_5ValueEmPPS1_S2_NS_6PosIdxE (libnixexpr.so + 0xa0341)
                #22 0x00007fe24caa415c _ZN3nix8ExprCall4evalERNS_9EvalStateERNS_3EnvERNS_5ValueE (libnixexpr.so + 0xa415c)
                #23 0x00007fe24ca860ad _ZN3nix10eval_cache10AttrCursor10forceValueEv (libnixexpr.so + 0x860ad)
                #24 0x00007fe24c796481 _ZN3nix16InstallableFlake7toValueERNS_9EvalStateE (libnixcmd.so + 0x4e481)
                #25 0x000055f5838891d6 _ZN7CmdEval3runEN3nix3refINS0_5StoreEEENS1_INS0_16InstallableValueEEE (nix + 0x1311d6)
                #26 0x00007fe24c783cac _ZN3nix23InstallableValueCommand3runENS_3refINS_5StoreEEENS1_INS_11InstallableEEE (libnixcmd.so + 0x3bcac)
                #27 0x00007fe24c7a977c _ZN3nix18InstallableCommand3runENS_3refINS_5StoreEEE (libnixcmd.so + 0x6177c)
                #28 0x00007fe24c7853f7 _ZN3nix12StoreCommand3runEv (libnixcmd.so + 0x3d3f7)
                #29 0x000055f5838af903 _ZN3nix11mainWrappedEiPPc (nix + 0x157903)
                #30 0x00007fe24cca1865 _ZN3nix16handleExceptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt8functionIFvvEE (libnixmain.so + 0x23865)
                #31 0x000055f5837f8b7c main (nix + 0xa0b7c)
                #32 0x00007fe24bd4d14e __libc_start_call_main (libc.so.6 + 0x2a14e)
                #33 0x00007fe24bd4d209 __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x2a209)
                #34 0x000055f5837fd7f5 _start (nix + 0xa57f5)
                
                Stack trace of thread 267398:
                #0  0x00007fe24bdb00ce __futex_abstimed_wait_common (libc.so.6 + 0x8d0ce)
                #1  0x00007fe24bdb321d pthread_cond_clockwait@GLIBC_2.30 (libc.so.6 + 0x9021d)
                #2  0x00007fe24cc9f793 _ZNSt6thread11_State_implINS_8_InvokerISt5tupleIJZN3nix11ProgressBarC4EbEUlvE_EEEEE6_M_runEv (libnixmain.so + 0x21793)
                #3  0x00007fe24c0e86d3 execute_native_thread_routine (libstdc++.so.6 + 0xe86d3)
                #4  0x00007fe24bdb3a42 start_thread (libc.so.6 + 0x90a42)
                #5  0x00007fe24be3305c __clone3 (libc.so.6 + 0x11005c)
                
                Stack trace of thread 267397:
                #0  0x00007fe24bd6438a __sigtimedwait (libc.so.6 + 0x4138a)
                #1  0x00007fe24bd6398c sigwait (libc.so.6 + 0x4098c)
                #2  0x00007fe24c39e9c5 _ZN3nixL19signalHandlerThreadE10__sigset_t (libnixutil.so + 0xd49c5)
                #3  0x00007fe24c3a401c _ZNSt6thread11_State_implINS_8_InvokerISt5tupleIJPFv10__sigset_tES3_EEEEE6_M_runEv (libnixutil.so + 0xda01c)
                #4  0x00007fe24c0e86d3 execute_native_thread_routine (libstdc++.so.6 + 0xe86d3)
                #5  0x00007fe24bdb3a42 start_thread (libc.so.6 + 0x90a42)
                #6  0x00007fe24be3305c __clone3 (libc.so.6 + 0x11005c)
                ELF object binary architecture: AMD x86-64


Priorities

Add :+1: to issues you find important.

kjeremy avatar Aug 12 '24 15:08 kjeremy

I've taken a quick glance at the issue in lldb with address sanitizer. I can reproduce this on top of trunk (26c3fc11eada3fa7df0284190095868a947fefe2). Here's the call stack with debug build:

    frame #3: 0x00007ffff7363407 libnixutil.so`nix::panic(msg=(_M_len = 80, _M_str = "Unexpected condition in operator[] at ../subprojects/libexpr/symbol-table.hh:119")) at error.cc:455:10
    frame #4: 0x00007ffff73636b7 libnixutil.so`nix::panic(file="../subprojects/libexpr/symbol-table.hh", line=119, func="operator[]") at error.cc:464:10
    frame #5: 0x0000000000703dcd nix`nix::SymbolTable::operator[](this=0x00007ffff0b80830, s=(id = 4118161152)) const at symbol-table.hh:119:13
    frame #6: 0x00007ffff508d643 libnixexpr.so`nix::printEnvBindings(st=0x00007ffff0b80830, se=0x00006060006d1a90, env=0x00007fffd4e97050, lvl=5) at eval.cc:652:38
  * frame #7: 0x00007ffff508d4d5 libnixexpr.so`nix::printEnvBindings(st=0x00007ffff0b80830, se=0x00006060006d1af0, env=0x00007ffff0bb2a80, lvl=5) at eval.cc:646:25

Somehow the code hits the unreachable in operator[] for SymbolTable:

SymbolStr operator[](Symbol s) const
{
    if (s.id == 0 || s.id > store.size())
        unreachable();
    return SymbolStr(store[s.id - 1]);
}

However, as far as I can tell there's some memory shenanigans going on, since for the top level StaticEnv::vars vector does not make sense:

(lldb) fr va -R se.vars
(nix::StaticEnv::Vars) se.vars = {
  std::_Vector_base<std::pair<nix::Symbol, unsigned int>, std::allocator<std::pair<nix::Symbol, unsigned int> > > = {
    _M_impl = {
      std::_Vector_base<std::pair<nix::Symbol, unsigned int>, std::allocator<std::pair<nix::Symbol, unsigned int> > >::_Vector_impl_data = {
        _M_start = 0x000060300062aa00
        _M_finish = 0x0000606000707850
        _M_end_of_storage = 0x0000606000707840
      }
    }
  }
}
(lldb) p se.vars.size()
(std::vector<std::pair<nix::Symbol, unsigned int> >::size_type) 25769916874
(lldb) p se
(const nix::StaticEnv &) 0x00006060006d1a90: {
  isWith = nullptr
  up = nullptr
  vars = size=0 {}
}
(lldb) bt
* thread #1, name = 'nix', stop reason = breakpoint 7.1
  * frame #0: 0x00007ffff508d594 libnixexpr.so`nix::printEnvBindings(st=0x00007ffff0b80830, se=0x00006060006d1a90, env=0x00007fffd4e97050, lvl=5) at eval.cc:652:17
    frame #1: 0x00007ffff508d4d5 libnixexpr.so`nix::printEnvBindings(st=0x00007ffff0b80830, se=0x00006060006d1af0, env=0x00007ffff0bb2a80, lvl=5) at eval.cc:646:25
    frame #2: 0x00007ffff508d4d5 libnixexpr.so`nix::printEnvBindings(st=0x00007ffff0b80830, se=0x00006060006d4130, env=0x00007ffff0bbccf0, lvl=4) at eval.cc:646:25
    frame #3: 0x00007ffff508d4d5 libnixexpr.so`nix::printEnvBindings(st=0x00007ffff0b80830, se=0x00006060006d4af0, env=0x00007fffd4eaa080, lvl=3) at eval.cc:646:25

Size of 25769916874 is absolutely borked. The previous frame 1 is ok:

(lldb) p se.vars.size()
(std::vector<std::pair<nix::Symbol, unsigned int> >::size_type) 46

xokdvium avatar Oct 07 '24 22:10 xokdvium