dotnet/runtime · error · RuntimeError

not found

Error message

{} not found

What it means

Raised by download_clrjit_pintool when the attempt to download the Intel Pin-based clrjit pintool package from Azure Storage returns no files. The pintool is used for instruction-count measurements of the JIT; without it the measurement workflow cannot run. The {} is filled with the relative blob path (e.g. '<root>/<version>/<os>.<ext>').

Solutions

  1. Check network connectivity and that the Azure Storage container URI is reachable (the attempted URI is logged).
  2. Verify pintools_current_version matches a published package for your host_os; if the version bumped upstream, pull the latest superpmi.py.
  3. If a local pintool package exists, place it under the expected get_pintools_path(coreclr_args) directory so the early-return check at the top of the function succeeds.
  4. Report the missing blob upstream if the version/OS combination should exist.

Example fix

// before
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))
// after (fix invocation)
# Ensure network access, then re-run; or pre-populate the pintools cache:
mkdir -p <spmi_location>/pintools/<version>/<os>
# place pin + pintool files there, then re-run superpmi.py
Defensive patterns

Strategy: validation

Validate before calling

import os
def preflight_pintool_download(coreclr_args, pintools_current_version, az_blob_storage_superpmi_container_uri):
    pin_dir_path = os.path.join(coreclr_args.spmi_location, 'pintools', pintools_current_version, coreclr_args.host_os.lower())
    extension = 'zip' if coreclr_args.host_os.lower() == 'windows' else 'tar.gz'
    rel = f'{pintools_current_version}/{coreclr_args.host_os.lower()}.{extension}'
    uri = f'{az_blob_storage_superpmi_container_uri}/{rel}'
    logging.info('Will attempt to download pintool from: %s', uri)
    if not os.path.isdir(coreclr_args.spmi_location) or not os.access(coreclr_args.spmi_location, os.W_OK):
        raise RuntimeError(f'spmi_location not writable: {coreclr_args.spmi_location}')
    return uri

Try / catch

try:
    download_clrjit_pintool(coreclr_args)
except RuntimeError as e:
    logging.error('Pintool download failed: %s', e)
    logging.error('Ensure network access to Azure Storage, or pre-populate %s', get_pintools_path(coreclr_args))
    raise

Prevention

When it happens

Trigger: download_files([pintool_uri], pin_dir_path, ..., fail_if_not_found=False) returns an empty list, so len(local_files) <= 0 triggers the raise. Occurs when the pintool blob does not exist for the current pintools_current_version/host_os, when the download fails due to network/SAS issues, or when the version constant points at a not-yet-uploaded package.

Common situations: A new pintools_current_version that hasn't been uploaded yet; running on an OS/arch combination for which no pintool package was published; offline or behind a proxy that blocks Azure Storage; an expired SAS token in the container URI.

Related errors


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

Appendix: 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 60108ba66e)