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
- Check network connectivity and that the Azure Storage container URI is reachable (the attempted URI is logged).
- Verify pintools_current_version matches a published package for your host_os; if the version bumped upstream, pull the latest superpmi.py.
- 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.
- 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
- Ensure network access to Azure Storage in CI for the first pintool download.
- Keep superpmi.py updated so pintools_current_version matches published packages.
- Cache the pintools directory across CI runs to avoid repeated downloads.
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
- No baseline JIT found
- Didn't find any collections using
- No baseline JIT found
- Azure failed to download
- Couldn't determine newest 'main' git hash
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)