| 11430 | } |
| 11431 | |
| 11432 | int WinDebugger::GetBreakStackFrameIdx() |
| 11433 | { |
| 11434 | AutoCrit autoCrit(mDebugManager->mCritSect); |
| 11435 | |
| 11436 | if ((mActiveBreakpoint == NULL) || (mRunState != RunState_Breakpoint)) |
| 11437 | return -1; |
| 11438 | if ((mBreakStackFrameIdx != -1) || (mActiveThread != mExplicitStopThread)) |
| 11439 | return mBreakStackFrameIdx; |
| 11440 | |
| 11441 | mBreakStackFrameIdx = 0; |
| 11442 | BF_ASSERT(mActiveBreakpoint != NULL); |
| 11443 | if (mCallStack.IsEmpty()) |
| 11444 | UpdateCallStack(); |
| 11445 | if (!mCallStack.IsEmpty()) |
| 11446 | { |
| 11447 | UpdateCallStackMethod(0); |
| 11448 | |
| 11449 | for (int stackIdx = 0; stackIdx < (int)mCallStack.size(); stackIdx++) |
| 11450 | { |
| 11451 | auto callStackEntry = mCallStack[stackIdx]; |
| 11452 | if (callStackEntry->mSubProgram == NULL) |
| 11453 | break; |
| 11454 | if ((mActiveBreakpoint->mAddr < callStackEntry->mSubProgram->mBlock.mLowPC) || |
| 11455 | (mActiveBreakpoint->mAddr >= callStackEntry->mSubProgram->mBlock.mHighPC)) |
| 11456 | break; |
| 11457 | |
| 11458 | DbgSubprogram* specificSubprogram = callStackEntry->mSubProgram; |
| 11459 | auto dwLineData = callStackEntry->mSubProgram->FindClosestLine(mActiveBreakpoint->mAddr, &specificSubprogram); |
| 11460 | if (dwLineData == NULL) |
| 11461 | break; |
| 11462 | |
| 11463 | if (mActiveBreakpoint->mLineData == dwLineData) |
| 11464 | { |
| 11465 | mBreakStackFrameIdx = stackIdx; |
| 11466 | break; |
| 11467 | } |
| 11468 | } |
| 11469 | } |
| 11470 | return mBreakStackFrameIdx; |
| 11471 | } |
| 11472 | |
| 11473 | static const char* SafeString(const char* str) |
| 11474 | { |
no test coverage detected