提交 adb3ebef 编写于 作者: K Kevin Halverson

Merge pull request #1871 from KevinH-MS/master

Use SymReader from debugger (that supports CDI from EnC pdbs)...
......@@ -39,9 +39,7 @@ public int GetSymAttribute(int methodToken, string name, int bufferLength, out i
// The EE should never be calling ISymUnmanagedReader.GetSymAttribute.
// In order to account for EnC updates, it should always be calling
// ISymUnmanagedReader3.GetSymAttributeByVersion instead.
// TODO (DevDiv #1145183): throw ExceptionUtilities.Unreachable;
return GetSymAttributeByVersion(methodToken, 1, name, bufferLength, out count, customDebugInformation);
throw ExceptionUtilities.Unreachable;
}
public int GetSymAttributeByVersion(int methodToken, int version, string name, int bufferLength, out int count, byte[] customDebugInformation)
......
......@@ -101,9 +101,7 @@ public int GetSymAttribute(int token, string name, int sizeBuffer, out int lengt
// The EE should never be calling ISymUnmanagedReader.GetSymAttribute.
// In order to account for EnC updates, it should always be calling
// ISymUnmanagedReader3.GetSymAttributeByVersion instead.
// TODO (DevDiv #1145183): throw ExceptionUtilities.Unreachable;
return UnversionedReader.GetSymAttribute(token, name, sizeBuffer, out lengthBuffer, buffer);
throw ExceptionUtilities.Unreachable;
}
public int GetSymAttributeByVersion(int methodToken, int version, string name, int bufferLength, out int count, byte[] customDebugInformation)
......
......@@ -161,13 +161,7 @@ public static byte[] GetCustomDebugInfoBytes(this ISymUnmanagedReader reader, in
methodToken,
methodVersion,
(ISymUnmanagedReader pReader, int pMethodToken, int pMethodVersion, int pBufferLength, out int pCount, byte[] pCustomDebugInfo) =>
{
// TODO (DevDiv #1145183): cast should always succeed.
var pReader3 = pReader as ISymUnmanagedReader3;
return pReader3 == null
? pReader.GetSymAttribute(pMethodToken, CdiAttributeName, pBufferLength, out pCount, pCustomDebugInfo)
: pReader3.GetSymAttributeByVersion(pMethodToken, pMethodVersion, CdiAttributeName, pBufferLength, out pCount, pCustomDebugInfo);
});
((ISymUnmanagedReader3)pReader).GetSymAttributeByVersion(pMethodToken, pMethodVersion, CdiAttributeName, pBufferLength, out pCount, pCustomDebugInfo));
}
public static int GetUserEntryPoint(this ISymUnmanagedReader symReader)
......
......@@ -10,6 +10,6 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.EditAndContinue
[Guid("B69910A9-4AD6-475F-859A-5DC0B1072A5D")]
internal interface IENCSymbolReaderProvider
{
void GetSymbolReader([MarshalAs(UnmanagedType.IUnknown)]out object ppSymbolReader);
void GetSymbolReader(out IntPtr ppSymbolReaderMta);
}
}
......@@ -87,12 +87,7 @@ internal sealed class VsENCRebuildableProjectImpl
private ISymUnmanagedReader _pdbReader;
// used when the symbol reader is retrieved from the debugger:
private object _pdbReaderObj;
// used when we can't retrive the reader from the debugger due to bug 775251
private SymbolReaderProvider _pdbProvider;
private byte[] _pdbImage;
private IntPtr _pdbReaderMtaPointer;
#endregion
......@@ -327,19 +322,15 @@ public int StopDebuggingPE()
_committedBaseline = null;
_activeStatementIds = null;
if (_pdbReaderObj != null)
{
Marshal.ReleaseComObject(_pdbReaderObj);
_pdbReaderObj = null;
}
Debug.Assert((_pdbReader == null) == (_pdbReaderMtaPointer == IntPtr.Zero));
if (_pdbProvider != null)
if (_pdbReader != null)
{
_pdbProvider.Dispose();
_pdbProvider = null;
Marshal.ReleaseComObject(_pdbReader);
_pdbReader = null;
}
_pdbReader = null;
_pdbReaderMtaPointer = IntPtr.Zero;
// The HResult is ignored by the debugger.
return VSConstants.S_OK;
......@@ -941,27 +932,8 @@ public unsafe int BuildForEnc(object pUpdatePE)
Interop.IENCDebugInfo debugInfo;
updater.GetENCDebugInfo(out debugInfo);
#if TODO // bug 779679: If we use a SymReader provided by the debugger the DPB may stay locked even after the debug session ends.
try
{
var symbolReaderProvider = (Interop.IENCSymbolReaderProvider)debugInfo;
symbolReaderProvider.GetSymbolReader(out this.pdbReaderObj);
}
catch (InvalidCastException) // bug 775251
{
#endif
try
{
string pdbPath = Path.ChangeExtension(_vsProject.TryGetObjOutputPath(), ".pdb");
_pdbImage = File.ReadAllBytes(pdbPath);
}
catch (Exception)
{
return VSConstants.E_FAIL;
}
#if TODO
}
#endif
symbolReaderProvider.GetSymbolReader(out _pdbReaderMtaPointer);
_committedBaseline = EmitBaseline.CreateInitialBaseline(_metadata, GetBaselineEncDebugInfo);
}
......@@ -1078,17 +1050,9 @@ private EditAndContinueMethodDebugInformation GetBaselineEncDebugInfo(MethodDefi
if (_pdbReader == null)
{
if (_pdbReaderObj != null)
{
_pdbReader = (ISymUnmanagedReader)_pdbReaderObj;
}
else
{
Debug.Assert(_pdbImage != null);
_pdbProvider = SymbolReaderProvider.Create(_pdbImage);
_pdbReader = _pdbProvider.SymbolReader;
_pdbImage = null;
}
Debug.Assert(_pdbReaderMtaPointer != IntPtr.Zero);
object pdbReaderObj = Marshal.GetObjectForIUnknown(_pdbReaderMtaPointer);
_pdbReader = (ISymUnmanagedReader)pdbReaderObj;
}
int methodToken = MetadataTokens.GetToken(methodHandle);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册