Skip to content

DOTNET_TC_CallCountingDelayMs=0 breaks BDN disassembler #117339

@timcassell

Description

@timcassell

Description

I'm working on improving BenchmarkDotNet's jit stage, and I ran into a strange issue. When I set env var DOTNET_TC_CallCountingDelayMs=0, the disassembly breaks. CanDisassembleAllMethodCalls fails with error:

Assert.Contains() Failure: Item not found in collection
Collection: ["ForDisassemblyDiagnoser()"]
Not found: "Benchmark(Int32)"

Reproduction Steps

[DisassemblyDiagnoser(maxDepth: 3)]
[Config(typeof(Config))]
public class IntroDisassemblyDry
{
    public class Config : ManualConfig
    {
        public Config()
        {
            AddColumnProvider(DefaultColumnProviders.Instance);
            AddLogger(ConsoleLogger.Default);
            AddJob(Job.Dry
                .WithEnvironmentVariable(new("DOTNET_TC_CallCountingDelayMs", "0"))
            );
        }
    }

    [Benchmark]
    public void Foo()
    {

    }
}

Expected behavior

.NET 8.0.16 (8.0.16, 8.0.1625.21506), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI

; BenchmarkDotNet.Samples.IntroDisassemblyDry.Foo()
       push      rbp
       mov       rbp,rsp
       mov       [rbp+10],rcx
       pop       rbp
       ret
; Total bytes of code 10

Actual behavior

.NET 8.0.16 (8.0.16, 8.0.1625.21506), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI

; BenchmarkDotNet.Autogenerated.Runnable_0.__ForDisassemblyDiagnoser__()
       push      rbp
       sub       rsp,20
       lea       rbp,[rsp+20]
       mov       [rbp+10],rcx
       mov       rcx,[rbp+10]
       cmp       dword ptr [rcx+38],0B
       jne       short M00_L00
       mov       rcx,[rbp+10]
       call      qword ptr [7FF8ED8AEB38]
M00_L00:
       nop
       add       rsp,20
       pop       rbp
       ret
; Total bytes of code 41

Regression?

No response

Known Workarounds

No response

Configuration

BenchmarkDotNet v0.15.3-develop (2025-07-05), Windows 10 (10.0.19045.5965/22H2/2022Update)
AMD Ryzen 7 9800X3D 4.70GHz, 1 CPU, 16 logical and 8 physical cores
.NET SDK 10.0.100-preview.5.25277.114
  [Host] : .NET 8.0.16 (8.0.16, 8.0.1625.21506), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
  Dry    : .NET 8.0.16 (8.0.16, 8.0.1625.21506), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI

I observe the same behavior in .Net 8 and .Net 10.

Other information

The code that should be jitted for the disassembler:

https://github.com/dotnet/BenchmarkDotNet/blob/604ff55c00edb3d778e484f56cbc9b50d66245ea/src/BenchmarkDotNet/Templates/BenchmarkType.txt#L403-L411

Is this a bug, or expected? Do we need to adjust how we're doing this?

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions