summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>2020-06-04 17:57:17 +0300
committerHyungju Lee <leee.lee@samsung.com>2020-09-18 14:58:13 +0900
commit1200faf6de87e60718cb96f729441fe880bacc78 (patch)
treefa1f428850b5427451f743c6d205dacf16d2dee8
parentacfc7408960548202d6ac9dc8898b1d5c9b9dea8 (diff)
downloadcoreclr-accepted/tizen_5.0_base.tar.gz
coreclr-accepted/tizen_5.0_base.tar.bz2
coreclr-accepted/tizen_5.0_base.zip
In case of evaluation with implicit function call aborted by ```ICorDebugEval::Abort()```, CoreCLR crash with SIGSEGV at line https://github.com/dotnet/runtime/blob/e25517ea27311297c1e3946acb3b4382d5fa7fef/src/coreclr/src/vm/jitinterface.cpp#L14293 since ```m_pJM``` is ```NULL```. This happens because during ```EECodeInfo::Init()``` call, ```codeAddress``` parameter provide address inside native code region (this address belong to CallDescrWorkerInternal(), libcoreclr.so), but not address inside managed code, so, ```ExecutionManager::FindCodeRange()``` can't find appropriate ```RangeSection```. During investigation I found, that at line https://github.com/dotnet/runtime/blob/e25517ea27311297c1e3946acb3b4382d5fa7fef/src/coreclr/src/vm/stackwalk.cpp#L2584 current context was not changed properly (we have wrong ```Eip``` register value). I found, that ```FuncEvalFrame::UpdateRegDisplay()``` code https://github.com/dotnet/runtime/blob/e25517ea27311297c1e3946acb3b4382d5fa7fef/src/coreclr/src/debug/ee/debugger.inl#L238-L247 don't have x86/Linux support implemented. I propose changes, that were already made for other ```UpdateRegDisplay()``` implementations in order to provide proper context for x86/Linux.
-rw-r--r--src/debug/ee/debugger.inl17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/debug/ee/debugger.inl b/src/debug/ee/debugger.inl
index 612aacd609..c7aea02d6e 100644
--- a/src/debug/ee/debugger.inl
+++ b/src/debug/ee/debugger.inl
@@ -242,9 +242,24 @@ inline void FuncEvalFrame::UpdateRegDisplay(const PREGDISPLAY pRD)
pRD->SetEcxLocation(&(pDE->m_context.Ecx));
pRD->SetEaxLocation(&(pDE->m_context.Eax));
pRD->SetEbpLocation(&(pDE->m_context.Ebp));
- pRD->SP = (DWORD)GetSP(&pDE->m_context);
pRD->PCTAddr = GetReturnAddressPtr();
+
+#ifdef WIN64EXCEPTIONS
+
+ pRD->IsCallerContextValid = FALSE;
+ pRD->IsCallerSPValid = FALSE; // Don't add usage of this field. This is only temporary.
+
+ pRD->pCurrentContext->Eip = *PTR_PCODE(pRD->PCTAddr);
+ pRD->pCurrentContext->Esp = (DWORD)GetSP(&pDE->m_context);
+
+ SyncRegDisplayToCurrentContext(pRD);
+
+#else // WIN64EXCEPTIONS
+
pRD->ControlPC = *PTR_PCODE(pRD->PCTAddr);
+ pRD->SP = (DWORD)GetSP(&pDE->m_context);
+
+#endif // WIN64EXCEPTIONS
#elif defined(_TARGET_AMD64_)
pRD->IsCallerContextValid = FALSE;