| 1709 | } |
| 1710 | |
| 1711 | bool WinDebugger::DoUpdate() |
| 1712 | { |
| 1713 | if ((mDbgProcessId != 0) && ((mDbgAttachFlags & BfDbgAttachFlag_ShutdownOnExit) == 0)) |
| 1714 | ::DebugSetProcessKillOnExit(FALSE); |
| 1715 | else |
| 1716 | ::DebugSetProcessKillOnExit(TRUE); |
| 1717 | |
| 1718 | // |
| 1719 | { |
| 1720 | AutoCrit autoCrit(mDebugManager->mCritSect); |
| 1721 | auto _ModuleChanged = [&](DbgModule* dbgModule) |
| 1722 | { |
| 1723 | ModuleChanged(dbgModule); |
| 1724 | ClearCallStack(); // We may have actual dbgSubprograms and stuff now... |
| 1725 | }; |
| 1726 | |
| 1727 | for (auto dbgModule : mPendingImageLoad) |
| 1728 | { |
| 1729 | dbgModule->PreCacheImage(); |
| 1730 | } |
| 1731 | |
| 1732 | for (auto kv : mPendingDebugInfoLoad) |
| 1733 | { |
| 1734 | kv.mKey->PreCacheDebugInfo(); |
| 1735 | } |
| 1736 | |
| 1737 | while (!mPendingImageLoad.IsEmpty()) |
| 1738 | { |
| 1739 | auto dbgModule = mPendingImageLoad.back(); |
| 1740 | mPendingImageLoad.pop_back(); |
| 1741 | dbgModule->RequestImage(); |
| 1742 | _ModuleChanged(dbgModule); |
| 1743 | } |
| 1744 | |
| 1745 | if (!mPendingDebugInfoLoad.IsEmpty()) |
| 1746 | { |
| 1747 | Array<DbgPendingDebugInfoLoad> pendingList; |
| 1748 | for (auto kv : mPendingDebugInfoLoad) |
| 1749 | pendingList.Add(kv.mValue); |
| 1750 | mPendingDebugInfoLoad.Clear(); |
| 1751 | |
| 1752 | for (auto& entry : pendingList) |
| 1753 | { |
| 1754 | auto dbgModule = entry.mModule; |
| 1755 | entry.mModule->RequestDebugInfo(entry.mAllowRemote); |
| 1756 | // We do a "_ModuleChanged" even if the load failed, so we rehup the callstack and stop |
| 1757 | // saying "<Loading...>" |
| 1758 | _ModuleChanged(entry.mModule); |
| 1759 | } |
| 1760 | } |
| 1761 | } |
| 1762 | |
| 1763 | if (IsMiniDumpDebugger()) |
| 1764 | { |
| 1765 | // |
| 1766 | { |
| 1767 | AutoCrit autoCrit(mDebugManager->mCritSect); |
| 1768 | if (mRunState == RunState_Terminating) |
nothing calls this directly
no test coverage detected