return m_debugger->SetBreakpoints(filename, existingBreakpoints, tmpBreakpoints);
}
+ return E_FAIL;
+}
+
+HRESULT MIProtocol::SetFunctionBreakpointCondition(uint32_t id, const std::string &condition)
+{
const auto &fbIter = m_funcBreakpoints.find(id);
if (fbIter == m_funcBreakpoints.end())
return E_FAIL;
std::vector<Breakpoint> tmpBreakpoints;
m_debugger->SetBreakpoints(filename, remainingBreakpoints, tmpBreakpoints);
}
+}
+void MIProtocol::DeleteFunctionBreakpoints(const std::unordered_set<uint32_t> &ids)
+{
std::vector<FunctionBreakpoint> remainingFuncBreakpoints;
for (auto &fb : m_funcBreakpoints)
{
if (ids.find(fb.first) == ids.end())
remainingFuncBreakpoints.push_back(fb.second);
}
- if (remainingFuncBreakpoints.size() != m_funcBreakpoints.size())
- {
- std::vector<Breakpoint> tmpBreakpoints;
- m_debugger->SetFunctionBreakpoints(remainingFuncBreakpoints, tmpBreakpoints);
- }
+
+ if (remainingFuncBreakpoints.size() == m_funcBreakpoints.size())
+ return;
+
+ std::vector<Breakpoint> tmpBreakpoints;
+ m_debugger->SetFunctionBreakpoints(remainingFuncBreakpoints, tmpBreakpoints);
}
void MIProtocol::EmitStoppedEvent(StoppedEvent event)
ids.insert(id);
}
DeleteBreakpoints(ids);
+ DeleteFunctionBreakpoints(ids);
return S_OK;
} },
{ "break-condition", [this](const std::vector<std::string> &args, std::string &output) -> HRESULT {
return E_FAIL;
}
- return SetBreakpointCondition(id, args.at(1));
+ HRESULT Status = SetBreakpointCondition(id, args.at(1));
+ if (SUCCEEDED(Status))
+ return Status;
+
+ return SetFunctionBreakpointCondition(id, args.at(1));
} },
{ "exec-step", [this](const std::vector<std::string> &args, std::string &output) -> HRESULT {
return StepCommand(args, output, Debugger::STEP_IN);
HRESULT SetBreakpoint(const std::string &filename, int linenum, const std::string &condition, Breakpoint &breakpoints);
HRESULT SetFunctionBreakpoint(const std::string &module, const std::string &funcname, const std::string ¶ms, const std::string &condition, Breakpoint &breakpoint);
HRESULT SetBreakpointCondition(uint32_t id, const std::string &condition);
+ HRESULT SetFunctionBreakpointCondition(uint32_t id, const std::string &condition);
void DeleteBreakpoints(const std::unordered_set<uint32_t> &ids);
+ void DeleteFunctionBreakpoints(const std::unordered_set<uint32_t> &ids);
static HRESULT PrintFrameLocation(const StackFrame &stackFrame, std::string &output);
};