Generate full pdbs for views on desktop and re-enable runtime error tests (#6442)

* Generate full pdbs for views on desktop and re-enable runtime error tests

StackTraceHelper \ PortablePdbReader used by Diagnostics is only useful for
reading portable pdbs on disk. However pdbs produced by views are entirely
in memory and therefore cannot be read. Consequently
we choose to generate full pdbs for views on Windows (when possible).
This commit is contained in:
Pranav K 2017-06-26 10:46:12 -07:00 committed by GitHub
parent 03e555a24e
commit e5da44a82f
3 changed files with 56 additions and 8 deletions

View File

@ -15,7 +15,9 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
private readonly CSharpCompilationOptions _compilationOptions;
private readonly CSharpParseOptions _parseOptions;
private readonly RazorReferenceManager _referenceManager;
private readonly DebugInformationFormat _pdbFormat = DebugInformationFormat.PortablePdb;
private readonly DebugInformationFormat _pdbFormat = SymbolsUtility.SupportsFullPdbGeneration() ?
DebugInformationFormat.Pdb :
DebugInformationFormat.PortablePdb;
public CSharpCompiler(RazorReferenceManager manager, IOptions<RazorViewEngineOptions> optionsAccessor)
{

View File

@ -0,0 +1,52 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Runtime.InteropServices;
namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{
/// <summary>
/// Utility type for determining if a platform supports full pdb file generation.
/// </summary>
internal static class SymbolsUtility
{
// Native pdb writer's CLSID
private const string SymWriterGuid = "0AE2DEB0-F901-478b-BB9F-881EE8066788";
/// <summary>
/// Determines if the current platform supports full pdb generation.
/// </summary>
/// <returns><c>true</c> if full pdb generation is supported; <c>false</c> otherwise.</returns>
public static bool SupportsFullPdbGeneration()
{
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Cross-plat always produce portable pdbs.
return false;
}
if (Type.GetType("Mono.Runtime") != null)
{
return false;
}
try
{
// Check for the pdb writer component that roslyn uses to generate pdbs
var type = Marshal.GetTypeFromCLSID(new Guid(SymWriterGuid));
if (type != null)
{
// This line will throw if pdb generation is not supported.
Activator.CreateInstance(type);
return true;
}
}
catch
{
}
return false;
}
}
}

View File

@ -7,7 +7,6 @@ using System.Net.Http.Headers;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Razor.Internal;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
namespace Microsoft.AspNetCore.Mvc.FunctionalTests
@ -92,12 +91,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Contains(expectedCompilationContent, content);
}
[ConditionalFact]
// MVC Generates portable PDBs when compiling Razor views. NET461 does not understand portable PDBs
// so line and file information cannot be determined. This is blocked until one of these issues are fixed:
// https://github.com/aspnet/Common/issues/235
// https://github.com/aspnet/Mvc/issues/6356
[FrameworkSkipCondition(RuntimeFrameworks.CLR)]
[Fact]
public async Task RuntimeErrorAreListedByErrorPageMiddleware()
{
// Arrange