summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKoundinya Veluri <kouvel@users.noreply.github.com>2018-02-11 16:57:09 -0800
committerNoah Falk <noahfalk@users.noreply.github.com>2018-02-11 16:57:08 -0800
commitce060415550334e598ee2efbc4beed0f07ede3f9 (patch)
tree47e868f8019cf55ef537a5508503fb971f960278 /src
parent78cd08538b59e8c2cff032f39a919b00eb552d74 (diff)
downloadcoreclr-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.cpp38
-rw-r--r--src/debug/ee/debugger.h2
-rw-r--r--src/debug/ee/functioninfo.cpp6
-rw-r--r--src/vm/codeman.cpp13
-rw-r--r--src/vm/codeman.h3
-rw-r--r--src/vm/eedbginterface.h2
-rw-r--r--src/vm/eedbginterfaceimpl.cpp8
-rw-r--r--src/vm/eedbginterfaceimpl.h2
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