diff options
author | Koundinya Veluri <kouvel@users.noreply.github.com> | 2018-02-11 16:57:09 -0800 |
---|---|---|
committer | Noah Falk <noahfalk@users.noreply.github.com> | 2018-02-11 16:57:08 -0800 |
commit | ce060415550334e598ee2efbc4beed0f07ede3f9 (patch) | |
tree | 47e868f8019cf55ef537a5508503fb971f960278 /src | |
parent | 78cd08538b59e8c2cff032f39a919b00eb552d74 (diff) | |
download | coreclr-ce060415550334e598ee2efbc4beed0f07ede3f9.tar.gz coreclr-ce060415550334e598ee2efbc4beed0f07ede3f9.tar.bz2 coreclr-ce060415550334e598ee2efbc4beed0f07ede3f9.zip |
Fix stack trace population to get proper source/line info for tier 1 methods (#16302)
Fixes https://github.com/dotnet/coreclr/issues/16224
Diffstat (limited to 'src')
-rw-r--r-- | src/debug/ee/debugger.cpp | 38 | ||||
-rw-r--r-- | src/debug/ee/debugger.h | 2 | ||||
-rw-r--r-- | src/debug/ee/functioninfo.cpp | 6 | ||||
-rw-r--r-- | src/vm/codeman.cpp | 13 | ||||
-rw-r--r-- | src/vm/codeman.h | 3 | ||||
-rw-r--r-- | src/vm/eedbginterface.h | 2 | ||||
-rw-r--r-- | src/vm/eedbginterfaceimpl.cpp | 8 | ||||
-rw-r--r-- | src/vm/eedbginterfaceimpl.h | 2 |
8 files changed, 59 insertions, 15 deletions
diff --git a/src/debug/ee/debugger.cpp b/src/debug/ee/debugger.cpp index 94792dac2c..c5b8a633bd 100644 --- a/src/debug/ee/debugger.cpp +++ b/src/debug/ee/debugger.cpp @@ -14139,6 +14139,9 @@ bool Debugger::GetILOffsetFromNative (MethodDesc *pFunc, const BYTE *pbAddr, } CONTRACTL_END; + _ASSERTE(pFunc != NULL); + _ASSERTE(pbAddr != NULL); + if (!HasLazyData()) { DebuggerLockHolder dbgLockHolder(this); @@ -14152,23 +14155,36 @@ bool Debugger::GetILOffsetFromNative (MethodDesc *pFunc, const BYTE *pbAddr, pFunc = pFunc->GetWrappedMethodDesc(); } - DebuggerJitInfo *jitInfo = - GetJitInfo(pFunc, (const BYTE *)pbAddr); + if (pFunc->IsDynamicMethod()) + { + return false; + } - if (jitInfo != NULL) + DebuggerMethodInfo *methodInfo = GetOrCreateMethodInfo(pFunc->GetModule(), pFunc->GetMemberDef()); + if (methodInfo == NULL) { - CorDebugMappingResult map; - DWORD whichIDontCare; + return false; + } - *ilOffset = jitInfo->MapNativeOffsetToIL( - nativeOffset, - &map, - &whichIDontCare); + PCODE methodStartAddress = g_pEEInterface->GetNativeCodeStartAddress((PCODE)pbAddr); + if (methodStartAddress == NULL) + { + return false; + } - return true; + DebuggerJitInfo *jitInfo = methodInfo->FindOrCreateInitAndAddJitInfo(pFunc, methodStartAddress); + if (jitInfo == NULL) + { + return false; } - return false; + CorDebugMappingResult map; + DWORD whichIDontCare; + *ilOffset = jitInfo->MapNativeOffsetToIL( + nativeOffset, + &map, + &whichIDontCare); + return true; } /****************************************************************************** diff --git a/src/debug/ee/debugger.h b/src/debug/ee/debugger.h index 25e4682418..6ba4e69868 100644 --- a/src/debug/ee/debugger.h +++ b/src/debug/ee/debugger.h @@ -1010,7 +1010,7 @@ public: DebuggerJitInfo * FindJitInfo(MethodDesc * pMD, TADDR addrNativeStartAddr); // Creating the Jit-infos. - DebuggerJitInfo *FindOrCreateInitAndAddJitInfo(MethodDesc* fd, TADDR startAddr); + DebuggerJitInfo *FindOrCreateInitAndAddJitInfo(MethodDesc* fd, PCODE startAddr); DebuggerJitInfo *CreateInitAndAddJitInfo(MethodDesc* fd, TADDR startAddr, BOOL* jitInfoWasCreated); diff --git a/src/debug/ee/functioninfo.cpp b/src/debug/ee/functioninfo.cpp index fc443f9ed5..d4521110ba 100644 --- a/src/debug/ee/functioninfo.cpp +++ b/src/debug/ee/functioninfo.cpp @@ -1548,7 +1548,7 @@ DebuggerJitInfo * DebuggerMethodInfo::FindJitInfo(MethodDesc * pMD, * */ -DebuggerJitInfo *DebuggerMethodInfo::FindOrCreateInitAndAddJitInfo(MethodDesc* fd, TADDR startAddr) +DebuggerJitInfo *DebuggerMethodInfo::FindOrCreateInitAndAddJitInfo(MethodDesc* fd, PCODE startAddr) { CONTRACTL { @@ -1569,7 +1569,7 @@ DebuggerJitInfo *DebuggerMethodInfo::FindOrCreateInitAndAddJitInfo(MethodDesc* f if (startAddr == NULL) { // This will grab the start address for the current code version. - startAddr = (TADDR)g_pEEInterface->GetFunctionAddress(fd); + startAddr = g_pEEInterface->GetFunctionAddress(fd); if (startAddr == NULL) { return NULL; @@ -1577,7 +1577,7 @@ DebuggerJitInfo *DebuggerMethodInfo::FindOrCreateInitAndAddJitInfo(MethodDesc* f } else { - _ASSERTE(g_pEEInterface->GetNativeCodeMethodDesc((PCODE)startAddr) == fd); + _ASSERTE(g_pEEInterface->GetNativeCodeMethodDesc(startAddr) == fd); } // Check the lsit to see if we've already populated an entry for this JitInfo. diff --git a/src/vm/codeman.cpp b/src/vm/codeman.cpp index b3ff114019..ec5313ff4a 100644 --- a/src/vm/codeman.cpp +++ b/src/vm/codeman.cpp @@ -4156,6 +4156,19 @@ ExecutionManager::FindCodeRangeWithLock(PCODE currentPC) return GetRangeSection(currentPC); } + +//************************************************************************** +PCODE ExecutionManager::GetCodeStartAddress(PCODE currentPC) +{ + WRAPPER_NO_CONTRACT; + _ASSERTE(currentPC != NULL); + + EECodeInfo codeInfo(currentPC); + if (!codeInfo.IsValid()) + return NULL; + return (PCODE)codeInfo.GetStartAddress(); +} + //************************************************************************** MethodDesc * ExecutionManager::GetCodeMethodDesc(PCODE currentPC) { diff --git a/src/vm/codeman.h b/src/vm/codeman.h index 983e2ca555..0663d598c1 100644 --- a/src/vm/codeman.h +++ b/src/vm/codeman.h @@ -1245,6 +1245,9 @@ public: // Special version with profiler hook static BOOL IsManagedCode(PCODE currentPC, HostCallPreference hostCallPreference, BOOL *pfFailedReaderLock); + // Returns method's start address for a given PC + static PCODE GetCodeStartAddress(PCODE currentPC); + // Returns methodDesc for given PC static MethodDesc * GetCodeMethodDesc(PCODE currentPC); diff --git a/src/vm/eedbginterface.h b/src/vm/eedbginterface.h index 241ef332e2..3c5bdc8053 100644 --- a/src/vm/eedbginterface.h +++ b/src/vm/eedbginterface.h @@ -135,6 +135,8 @@ public: #endif // #ifndef DACCESS_COMPILE + virtual PCODE GetNativeCodeStartAddress(PCODE address) = 0; + virtual MethodDesc *GetNativeCodeMethodDesc(const PCODE address) = 0; #ifndef DACCESS_COMPILE diff --git a/src/vm/eedbginterfaceimpl.cpp b/src/vm/eedbginterfaceimpl.cpp index 976e6b6745..69fe3bd38b 100644 --- a/src/vm/eedbginterfaceimpl.cpp +++ b/src/vm/eedbginterfaceimpl.cpp @@ -469,6 +469,14 @@ BOOL EEDbgInterfaceImpl::IsManagedNativeCode(const BYTE *address) return ExecutionManager::IsManagedCode((PCODE)address); } +PCODE EEDbgInterfaceImpl::GetNativeCodeStartAddress(PCODE address) +{ + WRAPPER_NO_CONTRACT; + _ASSERTE(address != NULL); + + return ExecutionManager::GetCodeStartAddress(address); +} + MethodDesc *EEDbgInterfaceImpl::GetNativeCodeMethodDesc(const PCODE address) { CONTRACT(MethodDesc *) diff --git a/src/vm/eedbginterfaceimpl.h b/src/vm/eedbginterfaceimpl.h index 7451246a21..7172e9ae44 100644 --- a/src/vm/eedbginterfaceimpl.h +++ b/src/vm/eedbginterfaceimpl.h @@ -122,6 +122,8 @@ public: BOOL IsManagedNativeCode(const BYTE *address); + PCODE GetNativeCodeStartAddress(PCODE address) DAC_UNEXPECTED(); + MethodDesc *GetNativeCodeMethodDesc(const PCODE address) DAC_UNEXPECTED(); #ifndef USE_GC_INFO_DECODER |