| 11284 | } |
| 11285 | |
| 11286 | void WinDebugger::UpdateCallStack(bool slowEarlyOut) |
| 11287 | { |
| 11288 | AutoCrit autoCrit(mDebugManager->mCritSect); |
| 11289 | |
| 11290 | if (!mIsPartialCallStack) |
| 11291 | return; |
| 11292 | |
| 11293 | if (mActiveThread == NULL) |
| 11294 | return; |
| 11295 | |
| 11296 | if (IsInRunState()) |
| 11297 | return; |
| 11298 | |
| 11299 | uint32 tickStart = BFTickCount(); |
| 11300 | |
| 11301 | CPURegisters registers; |
| 11302 | |
| 11303 | if (mCallStack.size() > 0) |
| 11304 | { |
| 11305 | WdStackFrame* wdStackFrame = mCallStack.back(); |
| 11306 | if (wdStackFrame->mIsEnd) |
| 11307 | { |
| 11308 | return; |
| 11309 | } |
| 11310 | memcpy(®isters, &wdStackFrame->mRegisters, sizeof(registers)); |
| 11311 | bool regsRolledBack = RollBackStackFrame(®isters, mCallStack.size() == 1); |
| 11312 | // If we can't roll them back then mIsEnd should have been set for the previous frame |
| 11313 | BF_ASSERT(regsRolledBack); |
| 11314 | } |
| 11315 | else |
| 11316 | { |
| 11317 | BF_ASSERT(mIsPartialCallStack); |
| 11318 | mCallStack.Reserve(1024); |
| 11319 | PopulateRegisters(®isters); |
| 11320 | BfLogDbg("UpdateCallStack starting. Thread=%d PC=0x%p\n", mActiveThread->mThreadId, registers.GetPC()); |
| 11321 | } |
| 11322 | |
| 11323 | bool isPartial = false; |
| 11324 | |
| 11325 | // Incrementally fill callstack structure to avoid stepping slowdown during deep nesting |
| 11326 | for (int fillIdx = 0; fillIdx < (slowEarlyOut ? 10000 : 100000); fillIdx++) |
| 11327 | { |
| 11328 | WdStackFrame* wdStackFrame = new WdStackFrame(); |
| 11329 | memcpy(&wdStackFrame->mRegisters, ®isters, sizeof(registers)); |
| 11330 | wdStackFrame->mIsStart = mCallStack.size() == 0; |
| 11331 | wdStackFrame->mIsEnd = false; |
| 11332 | |
| 11333 | bool rollbackSuccess = false; |
| 11334 | for (int tryCount = 0; tryCount < 16; tryCount++) |
| 11335 | { |
| 11336 | if (!RollBackStackFrame(®isters, wdStackFrame->mIsStart)) |
| 11337 | { |
| 11338 | break; |
| 11339 | } |
| 11340 | if (registers.GetPC() > 0xFFFF) |
| 11341 | { |
| 11342 | rollbackSuccess = true; |
| 11343 | break; |
no test coverage detected