Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test\debuginfo\pretty-std-collections-hash.rs fails with Visual Studio 2017 toolchain #76352

Closed
petrochenkov opened this issue Sep 5, 2020 · 7 comments
Labels
A-testsuite Area: The testsuite used to check the correctness of rustc C-bug Category: This is a bug. O-windows-msvc Toolchain: MSVC, Operating system: Windows

Comments

@petrochenkov
Copy link
Contributor

These two lines in src\etc\natvis\libstd.natvis confuse both cdb and GUI debugger available inside VS:

<Item Name="{static_cast&lt;tuple&lt;$T1, $T2&gt;*&gt;(base.table.ctrl.pointer)[-(i + 1)].__0}">static_cast&lt;tuple&lt;$T1, $T2&gt;*&gt;(base.table.ctrl.pointer)[-(i + 1)].__1</Item>
<Item>static_cast&lt;$T1*&gt;(map.base.table.ctrl.pointer)[-(i + 1)]</Item>

cdb gives this error

Unable to find type 'tuple<u64,u64> *' for cast.

GUI debugger just skips the visualization and only shows raw representation.


It is possible to fix visualization inside VS GUI debugger by replacing static_cast with C-style casts

<Item Name="{((tuple&lt;$T1, $T2&gt;*)base.table.ctrl.pointer)[-(i + 1)].__0}">((tuple&lt;$T1, $T2&gt;*)base.table.ctrl.pointer)[-(i + 1)].__1</Item>
<Item>(($T1*)map.base.table.ctrl.pointer)[-(i + 1)]</Item>

, but I haven't found a way to make cdb eat this yet.


Tests for other debuggers can use requirement directives like

// min-gdb-version: 8.2

If cdb from VS2017 toolchain is unable to perform computations required for visualizing hash set/map, then we need to introduce such requirements for cdb as well.

cc @Amanieu @MaulingMonkey

@jyn514 jyn514 added A-testsuite Area: The testsuite used to check the correctness of rustc C-bug Category: This is a bug. O-windows-msvc Toolchain: MSVC, Operating system: Windows labels Sep 5, 2020
@MaulingMonkey
Copy link
Contributor

MaulingMonkey commented Sep 5, 2020

I've seen similar errors if debug information for (u64, u64) / tuple<u64,u64> was never emitted. Something's up, but I'm not entirely convinced it's an MSVC version issue. That said, please feel free to share your own version numbers! Investigating this myself, it's possible I'm running into a second, different error? Here's what I'm seeing for the visualizers working:

cargo +toolchain build VS Code 1.48.2 w/
ms-vscode.cpptools 0.29.0
cdb 10.0.18362.1 VS 2017 15.0.28307.665
stable (1.46.0 04488af 2020-08-24) ✔️ ✔️ ✔️
nightly (1.47.0-nightly bf43421 2020-08-25) ❌ [1] ✔️ [2] ❌ [3]

It's worth noting that 1.46.0 already integrated my tuple<...> changes, so it looks like there's been a regression since then:

[...] Successfully parsed expression 'items' in type context 'hashbrown::raw::RawTable<tuple<u64, u64>>'.
[...] Successfully parsed expression 'items' in type context 'hashbrown::raw::RawTable<tuple<u64, u64>>'.
  1. VS Code lacks useful output about natvis failures sadly
  2. Interesting outlier? Logs towards the bottom.
  3. This gives me entirely different errors than you're seeing. With "Natvis: " and pdb paths also stripped:
[...]
libstd.natvis(43,19): Successfully parsed expression 'n--' in type context 'std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>'.
libstd.natvis(44,109): Error: invalid type conversion
    Error while evaluating 'static_cast<tuple<u64, u64>*>(base.table.ctrl.pointer)[-(i + 1)].__1' in the context of type 'htd.exe!std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>'.
libstd.natvis(28,4): Ignoring visualizer for type 'std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>' labeled as 'std::collections::hash::map::HashMap<*,*,*>' because one or more sub-expressions was invalid.

Test Code

fn main() {
    let mut hmap = std::collections::HashMap::<u64, u64>::new();
    hmap.insert(1, 2);
    zzz(); // breakpointing here
    println!("Hello, world! {:?}", hmap);
}

#[no_mangle] extern "C" fn zzz() {}

Versions

C:\local\htd>rustc +stable --version
rustc 1.46.0 (04488afe3 2020-08-24)

C:\local\htd>rustc +nightly --version
rustc 1.47.0-nightly (bf4342114 2020-08-25)
C:\local\htd>code --version
1.48.2
a0479759d6e9ea56afa657e454193f72aef85bd0
x64
C:\local\htd>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com" /?
Microsoft Visual Studio 2017 Version 15.0.28307.665.
C:\local\htd>"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb" /version
cdb version 10.0.18362.1

Debugging

C:\local\htd>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com" /debugexe target\debug\htd.exe

.vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name":                         "Debug",
            "type":                         "cppvsdbg",
            "request":                      "launch",
            "cwd":                          "${workspaceFolder}",
            "program":                      "${workspaceFolder}/target/debug/htd.exe",
            "enableDebugHeap":              true,
            "preLaunchTask":                "cargo build",
            "internalConsoleOptions":       "openOnSessionStart",
        },
    ]
}

.vscode/tasks.json

{
    "version": "2.0.0",
    "problemMatcher": "$rustc",
    "type": "shell",
    "tasks": [
        {
            "label":    "cargo build",
            "command":  "cargo +nightly build",
            "group":    { "kind": "build", "isDefault": true }
        },
    ]
}

nightly + cdb logs

C:\local\htd>cargo +nightly build
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
C:\local\htd>"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb" target\debug\htd.exe
[...]
0:000> bp `src\main.rs:4`
WARNING: Line information loading disabled
*** WARNING: Unable to verify checksum for htd.exe
0:000> g
ModLoad: 00007ffb`b99a0000 00007ffb`b9a1f000   C:\WINDOWS\System32\bcryptPrimitives.dll
Breakpoint 0 hit
htd!htd::main+0x3e:
00007ff7`eac97ade e8bd000000      call    htd!htd::zzz (00007ff7`eac97ba0)
0:000> dx hmap
hmap             : { size=0x1 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 0x1 [Type: unsigned __int64]
    [capacity]       : 0x3
    [state]          [Type: std::collections::hash::map::RandomState]
    ["0x1"]          : 0x2 [Type: unsigned __int64]
0:000>

@MaulingMonkey
Copy link
Contributor

MaulingMonkey commented Sep 5, 2020

Okay, so, I believe there's two separate issues here:

static_cast was never legal, but worked when compiled with 1.46.0 - inside a natvis - for... reasons?

Your C-casts fix this for both VSC and VS, as would reinterpret_cast. They also work in my version of CDB. Feel free to submit a PR with those natvis changes - or I can do so if it's inconvenient for you (I already have a fork/checkouts).

static_casting map.base.table.ctrl.pointer from u8* to tuple<...>* isn't legal - the types are unrelated. In retrospect, this should've never worked, and yet for some reason it does when:

  • The executable is built with rustc 1.46.0 (but not with 1.47.0-nightly)
  • The expression is inside a natvis (but not when the expression is duplicated in the watch window!)

I'm slowly going mad trying to understand why this ever worked, or what changed. hmap.base.table.ctrl is a core::ptr::non_null::NonNull<u8>, and hmap.base.table.ctrl.pointer is a unsigned char* as far as Visual Studio is concerned. This applies to both 1.46.0 and 1.47.0-nightly. I'm seeing no differences. I vaguely suspect some incredibly obscure edge case - perhaps some backwards compatability path that was accidentally being used then, which isn't being used now for some unknown reason...? Ultimately I suppose the exact reason doesn't matter...

whatever cdb version you're using may not be able to handle C++ at all

CDB not liking it even with C-casts would make sense if CDB can't handle C++ types at all - types or casts (in which case it'd be pointless to wait to try and fix those casts for CDB too, as they'll never work for tuples with that version of CDB.) I'd love to know your cdb version/path/source to see if I can replicate this / test introducing a min-cdb-version. I believe I sourced mine from the Windows 10 SDK.

EDIT: Although, then how the heck does it get as far as trying to resolve tuple specifically? Hmm...

@petrochenkov
Copy link
Contributor Author

petrochenkov commented Sep 5, 2020

@MaulingMonkey
Here's the log build\x86_64-pc-windows-msvc\test\debuginfo\pretty-std-collections-hash.cdb\pretty-std-collections-hash.out that contains all the versions and paths used when running the test (with C-style cast applied) and the debugger output as well.

Expand
Microsoft (R) Windows Debugger Version 10.0.14321.1024 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\test\debuginfo\pretty-std-collections-hash.cdb\a.exe
Symbol search path is: srv*
Executable search path is: 
ModLoad: 00007ff7`ed610000 00007ff7`ed627000   a.exe   
ModLoad: 00007ffb`1d610000 00007ffb`1d7bd000   ntdll.dll
ModLoad: 00007ffb`1c5f0000 00007ffb`1c72f000   C:\Windows\system32\KERNEL32.DLL
ModLoad: 00007ffb`1aaa0000 00007ffb`1abb5000   C:\Windows\system32\KERNELBASE.dll
ModLoad: 00007ffb`19310000 00007ffb`1939e000   C:\Windows\system32\apphelp.dll
SHIMVIEW: ShimInfo(Complete)
ModLoad: 00007ffa`e0720000 00007ffa`e0b02000   C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\stage2\lib\rustlib\x86_64-pc-windows-msvc\lib\std-3e140cd10516e859.dll
ModLoad: 00007ffb`0f780000 00007ffb`0f799000   C:\Windows\SYSTEM32\VCRUNTIME140.dll
ModLoad: 00007ffb`0f770000 00007ffb`0f774000   C:\Windows\SYSTEM32\api-ms-win-crt-runtime-l1-1-0.dll
ModLoad: 00007ffb`0f6c0000 00007ffb`0f6c5000   C:\Windows\SYSTEM32\api-ms-win-crt-math-l1-1-0.dll
ModLoad: 00007ffb`0f730000 00007ffb`0f734000   C:\Windows\SYSTEM32\api-ms-win-crt-stdio-l1-1-0.dll
ModLoad: 00007ffb`0f6f0000 00007ffb`0f6f3000   C:\Windows\SYSTEM32\api-ms-win-crt-locale-l1-1-0.dll
ModLoad: 00007ffb`0f720000 00007ffb`0f723000   C:\Windows\SYSTEM32\api-ms-win-crt-heap-l1-1-0.dll
ModLoad: 00007ffb`1c8e0000 00007ffb`1c98a000   C:\Windows\system32\ADVAPI32.dll
ModLoad: 00007ffb`1c4c0000 00007ffb`1c51a000   C:\Windows\system32\WS2_32.dll
ModLoad: 00007ffb`19d90000 00007ffb`19db1000   C:\Windows\SYSTEM32\USERENV.dll
ModLoad: 00007ffb`0f760000 00007ffb`0f764000   C:\Windows\SYSTEM32\api-ms-win-crt-string-l1-1-0.dll
ModLoad: 00007ffb`0f740000 00007ffb`0f744000   C:\Windows\SYSTEM32\api-ms-win-crt-convert-l1-1-0.dll
ModLoad: 00007ffb`1c520000 00007ffb`1c5ca000   C:\Windows\system32\msvcrt.dll
ModLoad: 00007ffb`1d4e0000 00007ffb`1d538000   C:\Windows\SYSTEM32\sechost.dll
ModLoad: 00007ffb`1c7a0000 00007ffb`1c8e0000   C:\Windows\system32\RPCRT4.dll
ModLoad: 00007ffb`1ad00000 00007ffb`1ad09000   C:\Windows\system32\NSI.dll
ModLoad: 00007ffb`1a740000 00007ffb`1a755000   C:\Windows\SYSTEM32\profapi.dll
ModLoad: 00007ffb`0f5c0000 00007ffb`0f6b4000   C:\Windows\SYSTEM32\ucrtbase.DLL
ModLoad: 00007ffb`1ac10000 00007ffb`1ac3e000   C:\Windows\system32\SspiCli.dll
ModLoad: 00007ffb`1a680000 00007ffb`1a68b000   C:\Windows\SYSTEM32\CRYPTBASE.DLL
ModLoad: 00007ffb`1a610000 00007ffb`1a673000   C:\Windows\SYSTEM32\bcryptPrimitives.dll
(1478.25f4): Break instruction exception - code 80000003 (first chance)
ntdll!LdrpDoDebuggerBreak+0x30:
00007ffb`1d6d1c20 cc              int     3
0:000> version
Windows 8.1 Version 9600 MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
kernelbase.dll version: 6.3.9600.19724 (winblue_ltsb_escrow.200519-1914)
Machine Name:
Debug session time: Sat Sep  5 12:51:02.474 2020 (UTC + 3:00)
System Uptime: 7 days 1:57:25.609
Process Uptime: 0 days 0:00:00.015
  Kernel time: 0 days 0:00:00.000
  User time: 0 days 0:00:00.000
Live user mode: <Local>

Microsoft (R) Windows Debugger Version 10.0.14321.1024 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

command line: '"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -lines -cf C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\test\debuginfo\pretty-std-collections-hash.cdb\pretty-std-collections-hash.debugger.script C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\test\debuginfo\pretty-std-collections-hash.cdb\a.exe'  Debugger Process 0x2C0C 
dbgeng:  image 10.0.14321.1024, built Thu Jul 28 08:25:22 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbgeng.dll]
dbghelp: image 10.0.14321.1024, built Thu Jul 28 08:23:41 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll]
        DIA version: 40116
Extension DLL search Path:
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\WINXP;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\arcade;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\pri;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64;C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\stage2\lib\rustlib\x86_64-pc-windows-msvc\lib;C:\Program Files (x86)\Windows Kits\10\bin\x64;C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64;C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\stage0-bootstrap-tools\x86_64-pc-windows-msvc\release\deps;C:\msys64\home\we\rust\build\x86_64-pc-windows-msvc\stage0\bin;C:\Users\we\.cargo\bin;C:\Python38;C:\Program Files\CMake\bin;C:\Program Files\Git\cmd;C:\ProgramData\chocolatey\bin;C:\msys64\mingw64\bin;C:\msys64\usr\local\bin;C:\msys64\usr\bin;C:\msys64\usr\bin;C:\Windows\System32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\
Extension DLL chain:
    dbghelp: image 10.0.14321.1024, API 10.0.6, built Thu Jul 28 08:23:41 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll]
    ext: image 10.0.14321.1024, API 1.0.0, built Thu Jul 28 08:22:16 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\ext.dll]
    exts: image 10.0.14321.1024, API 1.0.0, built Thu Jul 28 08:22:41 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\WINXP\exts.dll]
    uext: image 10.0.14321.1024, API 1.0.0, built Thu Jul 28 08:22:26 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\uext.dll]
    ntsdexts: image 10.0.14393.33, API 1.0.0, built Thu Jul 28 08:32:24 2016
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\WINXP\ntsdexts.dll]
0:000> .nvlist
Loaded NatVis Files:
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\atlmfc.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\concurrency.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\cpp_rest.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\Kernel.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\stl.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\Windows.Data.Json.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\Windows.Devices.Geolocation.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\Windows.Devices.Sensors.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\Windows.Media.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\windows.natvis
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Visualizers\winrt.natvis
0:000> bp `pretty-std-collections-hash.rs:94`
*** WARNING: Unable to verify checksum for a.exe
0:000>  g
Breakpoint 0 hit
a!pretty_std_collections_hash::main+0xf9:
00007ff7`ed61d6d9 e8b2000000      call    a!pretty_std_collections_hash::zzz (00007ff7`ed61d790)
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_set,d
hash_set,d       : { size=15 } [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::set::HashSet<u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : 3 [Type: u64]
    [1]              : 5 [Type: u64]
    [2]              : 2 [Type: u64]
    [3]              : 8 [Type: u64]
    [4]              : 7 [Type: u64]
    [5]              : 10 [Type: u64]
    [6]              : 12 [Type: u64]
    [7]              : 4 [Type: u64]
    [8]              : 14 [Type: u64]
    [9]              : 0 [Type: u64]
    [10]             : 6 [Type: u64]
    [11]             : 11 [Type: u64]
    [12]             : 13 [Type: u64]
    [13]             : 1 [Type: u64]
    [14]             : 9 [Type: u64]
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000>  dx hash_map,d
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000> 
hash_map,d       : { size=15 } [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [<Raw View>]     [Type: std::collections::hash::map::HashMap<u64, u64, std::collections::hash::map::RandomState>]
    [size]           : 15 [Type: unsigned __int64]
    [capacity]       : 28
    [state]          [Type: std::collections::hash::map::RandomState]
    [0]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [1]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [2]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [3]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [4]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [5]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [6]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [7]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [8]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [9]              : Unable to find type 'tuple<u64,u64> *' for cast.
    [10]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [11]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [12]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [13]             : Unable to find type 'tuple<u64,u64> *' for cast.
    [14]             : Unable to find type 'tuple<u64,u64> *' for cast.
0:000> qq
quit:
C:\Users\we>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com" /?

Microsoft Visual Studio 2017 Version 15.0.28307.1234.

@MaulingMonkey
Copy link
Contributor

MaulingMonkey commented Sep 5, 2020

Okay, things have clicked into place - the way I was overriding the stdlib natvis files worked in VS/VSC but not in CDB like I thought they were. And while 1.46.0 had my tuple changes (which worked), it did not have the natvis/hashbrown changes using 'em. VS/VSC have never liked static_cast when reinterpret_cast is required, and CDB before 10.0.18362.1 doesn't like the tuple casts at all (but at/after that version, CDB doesn't care what kind of cast is used at all.)

Rust changes to make:

  • Add // min-cdb-version: 10.0.18362.1 + support to make older CDB happy
  • Make your changes to natvis casting to make VS/VSC happy

And the testing I did:

SDK CDB rustc 1.47.0-nightly (bf43421 2020-08-25) built-in .natvis Note
10.0.19041.0 10.0.19041.1 ✔️ CI
10.0.18362.1 10.0.18362.1 ✔️ MaulingMonkey
10.0.17763.0 10.0.17763.132 Unable to find type 'tuple<u64,u64> *' for cast.
10.0.17134.12 10.0.17134.12 Unable to find type 'tuple<u64,u64> *' for cast.
10.0.16299.91 10.0.16299.91 Unable to find type 'tuple<u64,u64> *' for cast.
10.0.15063.468 10.0.15063.468 Unable to find type 'tuple<u64,u64> *' for cast.
10.0.14393.795 10.0.14321.1024 Unable to find type 'tuple<u64,u64> *' for cast. petrochenkov
10.0.10586.212 10.0.10586.567 Expected ')' at '+ 1)].__1'
10.0.10240 10.0.10240? ❔ Untested

@petrochenkov
Copy link
Contributor Author

@MaulingMonkey
Thank you for investigating all this!

@MaulingMonkey
Copy link
Contributor

And thank you, @petrochenkov, for bringing this breakage to my attention - so it can get fixed before it lands in stable!

PRs should address everything (famous last words 🤞)

Dylan-DPC-zz pushed a commit to Dylan-DPC-zz/rust that referenced this issue Sep 6, 2020
…=petrochenkov

debuginfo:  Ignore HashMap .natvis tests before cdb 10.0.18362.1

CDB <10.0.18362.1 chokes on casts within HashMap's natvis visualizers.  This PR adds support for "min-cdb-version" (per existing "min-gdb-version" and "min-lldb-version" filters) and uses it.  CI uses a more recent version of CDB for testing and thus should still run the tests.

Credit to @petrochenkov per rust-lang#76352 for helping catch this.

### SDK Testing

| Win 10 SDK                                                             |  x64 CDB          | rustc 1.47.0-nightly (bf43421 2020-08-25) built-in .natvis  | Note |
| --------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------- | ---- |
| [10.0.19041.0](https://go.microsoft.com/fwlink/p/?linkid=2120843)     | 10.0.19041.1      | ✔️                                                            | CI
| [10.0.18362.1](https://go.microsoft.com/fwlink/?linkid=2083338)       | 10.0.18362.1      | ✔️                                                            | MaulingMonkey
| [10.0.17763.0](https://go.microsoft.com/fwlink/p/?LinkID=2033908)     | 10.0.17763.132    | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.17134.12](https://go.microsoft.com/fwlink/p/?linkid=870807)     | 10.0.17134.12     | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.16299.91](https://go.microsoft.com/fwlink/p/?linkid=864422)     | 10.0.16299.91     | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.15063.468](https://go.microsoft.com/fwlink/p/?LinkId=845298)    | 10.0.15063.468    | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.14393.795](https://go.microsoft.com/fwlink/p/?LinkId=838916)    | 10.0.14321.1024   | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.` | petrochenkov
| [10.0.10586.212](https://go.microsoft.com/fwlink/p/?LinkID=698771)    | 10.0.10586.567    | ❌ `Expected ')' at '+ 1)].__1'`
| [10.0.10240](https://go.microsoft.com/fwlink/p/?LinkId=619296)        | 10.0.10240?       | ❔ Untested

### Rust Testing

```cmd
x.py test --stage 1 src/tools/tidy
x.py test --stage 1 --build x86_64-pc-windows-msvc src\test\debuginfo
```

Also verified test still fails when intentionally broken w/ CDB version >= min-cdb-version.
bors added a commit to rust-lang-ci/rust that referenced this issue Sep 6, 2020
…etrochenkov

debuginfo:  Ignore HashMap .natvis tests before cdb 10.0.18362.1

CDB <10.0.18362.1 chokes on casts within HashMap's natvis visualizers.  This PR adds support for "min-cdb-version" (per existing "min-gdb-version" and "min-lldb-version" filters) and uses it.  CI uses a more recent version of CDB for testing and thus should still run the tests.

Credit to @petrochenkov per rust-lang#76352 for helping catch this.

### SDK Testing

| Win 10 SDK                                                             |  x64 CDB          | rustc 1.47.0-nightly (bf43421 2020-08-25) built-in .natvis  | Note |
| --------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------- | ---- |
| [10.0.19041.0](https://go.microsoft.com/fwlink/p/?linkid=2120843)     | 10.0.19041.1      | ✔️                                                            | CI
| [10.0.18362.1](https://go.microsoft.com/fwlink/?linkid=2083338)       | 10.0.18362.1      | ✔️                                                            | MaulingMonkey
| [10.0.17763.0](https://go.microsoft.com/fwlink/p/?LinkID=2033908)     | 10.0.17763.132    | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.17134.12](https://go.microsoft.com/fwlink/p/?linkid=870807)     | 10.0.17134.12     | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.16299.91](https://go.microsoft.com/fwlink/p/?linkid=864422)     | 10.0.16299.91     | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.15063.468](https://go.microsoft.com/fwlink/p/?LinkId=845298)    | 10.0.15063.468    | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.`
| [10.0.14393.795](https://go.microsoft.com/fwlink/p/?LinkId=838916)    | 10.0.14321.1024   | ❌ `Unable to find type 'tuple<u64,u64> *' for cast.` | petrochenkov
| [10.0.10586.212](https://go.microsoft.com/fwlink/p/?LinkID=698771)    | 10.0.10586.567    | ❌ `Expected ')' at '+ 1)].__1'`
| [10.0.10240](https://go.microsoft.com/fwlink/p/?LinkId=619296)        | 10.0.10240?       | ❔ Untested

### Rust Testing

```cmd
x.py test --stage 1 src/tools/tidy
x.py test --stage 1 --build x86_64-pc-windows-msvc src\test\debuginfo
```

Also verified test still fails when intentionally broken w/ CDB version >= min-cdb-version.
Dylan-DPC-zz pushed a commit to Dylan-DPC-zz/rust that referenced this issue Sep 7, 2020
…, r=petrochenkov

Fix HashMap visualizers in Visual Studio (Code)

CDB (as used in unit tests) doesn't care that we're using static_cast between unrelated types (`u8*` to `tuple<$T1, $T2>*`).
Visual Studio & Visual Studio Code care.  These should've been reinterpret_cast or C casts.

Credit to @petrochenkov per rust-lang#76352 for helping catch this.

### Testing

```cmd
x.py test --stage 1 src/tools/tidy
x.py test --stage 1 --build x86_64-pc-windows-msvc src\test\debuginfo
```
Dylan-DPC-zz pushed a commit to Dylan-DPC-zz/rust that referenced this issue Sep 8, 2020
…, r=petrochenkov

Fix HashMap visualizers in Visual Studio (Code)

CDB (as used in unit tests) doesn't care that we're using static_cast between unrelated types (`u8*` to `tuple<$T1, $T2>*`).
Visual Studio & Visual Studio Code care.  These should've been reinterpret_cast or C casts.

Credit to @petrochenkov per rust-lang#76352 for helping catch this.

### Testing

```cmd
x.py test --stage 1 src/tools/tidy
x.py test --stage 1 --build x86_64-pc-windows-msvc src\test\debuginfo
```
@petrochenkov
Copy link
Contributor Author

This was fixed in #76389 and #76390.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-testsuite Area: The testsuite used to check the correctness of rustc C-bug Category: This is a bug. O-windows-msvc Toolchain: MSVC, Operating system: Windows
Projects
None yet
Development

No branches or pull requests

3 participants