|
|
|
@ -9,9 +9,16 @@ param( |
|
|
|
# Maximum number of jobs to run in parallel |
|
|
|
$MaxParallelJobs = 6 |
|
|
|
|
|
|
|
# Max number of retries |
|
|
|
$MaxRetry = 5 |
|
|
|
|
|
|
|
# Wait time between check for system load |
|
|
|
$SecondsBetweenLoadChecks = 10 |
|
|
|
|
|
|
|
# Set error codes |
|
|
|
Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1 |
|
|
|
Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2 |
|
|
|
|
|
|
|
$CountMissingSymbols = { |
|
|
|
param( |
|
|
|
[string] $PackagePath # Path to a NuGet package |
|
|
|
@ -21,10 +28,15 @@ $CountMissingSymbols = { |
|
|
|
|
|
|
|
Add-Type -AssemblyName System.IO.Compression.FileSystem |
|
|
|
|
|
|
|
Write-Host "Validating $PackagePath " |
|
|
|
|
|
|
|
# Ensure input file exist |
|
|
|
if (!(Test-Path $PackagePath)) { |
|
|
|
Write-PipelineTaskError "Input file does not exist: $PackagePath" |
|
|
|
return -2 |
|
|
|
return [pscustomobject]@{ |
|
|
|
result = $using:ERROR_FILEDOESNOTEXIST |
|
|
|
packagePath = $PackagePath |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
# Extensions for which we'll look for symbols |
|
|
|
@ -45,7 +57,7 @@ $CountMissingSymbols = { |
|
|
|
Write-Host "Something went wrong extracting $PackagePath" |
|
|
|
Write-Host $_ |
|
|
|
return [pscustomobject]@{ |
|
|
|
result = -1 |
|
|
|
result = $using:ERROR_BADEXTRACT |
|
|
|
packagePath = $PackagePath |
|
|
|
} |
|
|
|
} |
|
|
|
@ -91,26 +103,37 @@ $CountMissingSymbols = { |
|
|
|
$dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools" |
|
|
|
$dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe" |
|
|
|
|
|
|
|
& $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null |
|
|
|
$totalRetries = 0 |
|
|
|
|
|
|
|
if (Test-Path $PdbPath) { |
|
|
|
return 'PDB' |
|
|
|
} |
|
|
|
elseif (Test-Path $NGenPdb) { |
|
|
|
return 'NGen PDB' |
|
|
|
} |
|
|
|
elseif (Test-Path $SODbg) { |
|
|
|
return 'DBG for SO' |
|
|
|
} |
|
|
|
elseif (Test-Path $DylibDwarf) { |
|
|
|
return 'Dwarf for Dylib' |
|
|
|
} |
|
|
|
elseif (Test-Path $SymbolPath) { |
|
|
|
return 'Module' |
|
|
|
} |
|
|
|
else { |
|
|
|
return $null |
|
|
|
while ($totalRetries -lt $using:MaxRetry) { |
|
|
|
# Save the output and get diagnostic output |
|
|
|
$output = & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String |
|
|
|
|
|
|
|
if (Test-Path $PdbPath) { |
|
|
|
return 'PDB' |
|
|
|
} |
|
|
|
elseif (Test-Path $NGenPdb) { |
|
|
|
return 'NGen PDB' |
|
|
|
} |
|
|
|
elseif (Test-Path $SODbg) { |
|
|
|
return 'DBG for SO' |
|
|
|
} |
|
|
|
elseif (Test-Path $DylibDwarf) { |
|
|
|
return 'Dwarf for Dylib' |
|
|
|
} |
|
|
|
elseif (Test-Path $SymbolPath) { |
|
|
|
return 'Module' |
|
|
|
} |
|
|
|
elseif ($output.Contains("503 Service Unavailable")) { |
|
|
|
# If we got a 503 error, we should retry. |
|
|
|
$totalRetries++ |
|
|
|
} |
|
|
|
else { |
|
|
|
return $null |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return $null |
|
|
|
} |
|
|
|
|
|
|
|
$SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath |
|
|
|
@ -155,14 +178,21 @@ function CheckJobResult( |
|
|
|
$packagePath, |
|
|
|
[ref]$DupedSymbols, |
|
|
|
[ref]$TotalFailures) { |
|
|
|
if ($result -eq '-1') { |
|
|
|
if ($result -eq $ERROR_BADEXTRACT) { |
|
|
|
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files" |
|
|
|
$DupedSymbols.Value++ |
|
|
|
} |
|
|
|
elseif ($jobResult.result -ne '0') { |
|
|
|
elseif ($result -eq $ERROR_FILEDOESNOTEXIST) { |
|
|
|
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath does not exist" |
|
|
|
$TotalFailures.Value++ |
|
|
|
} |
|
|
|
elseif ($result -gt '0') { |
|
|
|
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $result modules in the package $packagePath" |
|
|
|
$TotalFailures.Value++ |
|
|
|
} |
|
|
|
else { |
|
|
|
Write-Host "All symbols verified for package $packagePath" |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function CheckSymbolsAvailable { |
|
|
|
@ -192,8 +222,6 @@ function CheckSymbolsAvailable { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
Write-Host "Validating $FileName " |
|
|
|
|
|
|
|
Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList $FullName | Out-Null |
|
|
|
|
|
|
|
$NumJobs = @(Get-Job -State 'Running').Count |
|
|
|
|