dotnet/runtime · error · RuntimeError

{} not found

Error message

{} not found

What it means

Raised by download_clrjit_pintool when download_files() for the Intel Pin pintools package returned no local files (the Azure blob `{pintools_root}/{version}/{os}.{zip|tar.gz}` is missing/unreachable). Pin is required for instruction-count measurements.

Source

Thrown at src/coreclr/scripts/superpmi.py:5006

        pintool_filename = "libclrjit_inscount.so"

    return os.path.join(get_pintools_path(coreclr_args), "clrjit_inscount_" + coreclr_args.arch, pintool_filename)

def download_clrjit_pintool(coreclr_args):
    """ Download the pintool package for doing measurements of the JIT from Azure Storage.
    """

    if os.path.isfile(get_pin_exe_path(coreclr_args)):
        return

    pin_dir_path = get_pintools_path(coreclr_args)
    extension = "zip" if coreclr_args.host_os.lower() == "windows" else "tar.gz"
    pintools_rel_path = "{}/{}/{}.{}".format(az_pintools_root_folder, pintools_current_version, coreclr_args.host_os.lower(), extension)
    pintool_uri = "{}/{}".format(az_blob_storage_superpmi_container_uri, pintools_rel_path)
    local_files = download_files([pintool_uri], pin_dir_path, verbose=False, is_azure_storage=True, fail_if_not_found=False)
    if len(local_files) <= 0:
        logging.error("Error: {} not found".format(pintools_rel_path))
        raise RuntimeError("{} not found".format(pintools_rel_path))

def setup_args(args):
    """ Setup the args for SuperPMI to use.

    Args:
        args (ArgParse): args parsed by arg parser

    Returns:
        args (CoreclrArguments)

    """

    # Start setting up logging.
    # Set up the console logger immediately. Later, after we've parsed some arguments, we'll add the file logger and
    # change the console logger level to the one parsed by the arguments. We need to do this initial setup before the first
    # logging command is executed.
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

View on GitHub (pinned to 290d5ab72c)

Solutions

  1. Confirm the exact blob exists: open az_blob_storage_superpmi_container_uri + '/' + pintools_rel_path in a browser/curl.
  2. Verify network/proxy can reach the Azure storage container.
  3. Check host_os is one the pintools package is published for (windows/linux/osx).
  4. Manually download the archive and extract into get_pintools_path() to satisfy isfile(get_pin_exe_path).

Example fix

// before
# pintools archive missing for new version -> raises [186]
// after
# pin a known-good pintools_current_version, or stage the archive manually
curl -o pin.tgz <pintool_uri> && tar -xzf pin.tgz -C $SPMI/pintools/<version>/<os>
Defensive patterns

Strategy: validation

Validate before calling

import urllib.request, os
uri = az_blob_storage_superpmi_container_uri + '/' + pintools_rel_path
with urllib.request.urlopen(uri, timeout=10) as r:
    if r.status != 200:
        raise SystemExit(f'pintools blob unreachable: {uri}')
print('pintools archive reachable')

Type guard

def pintools_blob_reachable(uri: str) -> bool:
    import urllib.request
    try:
        with urllib.request.urlopen(uri, timeout=10) as r:
            return r.status == 200
    except Exception:
        return False

Try / catch

try:
    download_clrjit_pintool(coreclr_args)
except RuntimeError as e:
    if 'not found' in str(e) and 'pintools' in str(e).lower():
        stage_pintools_archive_manually(); download_clrjit_pintool(coreclr_args)

Prevention

When it happens

Trigger: isfile(get_pin_exe_path) is false on entry and the HTTP/azure download of the pintools archive yields zero files (fail_if_not_found=False suppresses the inner error).

Common situations: pintools_current_version bumped but the blob not yet published for this os; unsupported host_os; proxy blocking the storage endpoint; the version folder was rotated out.

Related errors


AI-assisted analysis of dotnet/runtime@290d5ab72c (2026-08-06). Data as JSON: /api/errors/d8316c706e48c3f7. Report an issue: GitHub.