| 164 | } |
| 165 | |
| 166 | void DebugMessageHandler::SendBreakpointTriggered(std::vector<CallStackFrame> const & callStack, |
| 167 | QueryResultInfo const * results) |
| 168 | { |
| 169 | auto const & lastFrame = *callStack.rbegin(); |
| 170 | BackendToDebugger msg; |
| 171 | auto trigger = msg.mutable_breakpointtriggered(); |
| 172 | MakeMsgCallStack(*trigger, callStack); |
| 173 | |
| 174 | if (results != nullptr) { |
| 175 | if (results->succeeded) { |
| 176 | trigger->set_query_succeeded(BkBreakpointTriggered::SUCCEEDED); |
| 177 | } else { |
| 178 | trigger->set_query_succeeded(BkBreakpointTriggered::FAILED); |
| 179 | } |
| 180 | |
| 181 | auto tuple = trigger->mutable_query_results(); |
| 182 | MakeMsgTuple(*tuple, results->results); |
| 183 | |
| 184 | trigger->set_query_node_id(results->queryNodeId); |
| 185 | } else { |
| 186 | trigger->set_query_succeeded(BkBreakpointTriggered::NOT_A_QUERY); |
| 187 | } |
| 188 | |
| 189 | Send(msg); |
| 190 | |
| 191 | std::wstringstream tup; |
| 192 | if (lastFrame.tupleLL != nullptr) { |
| 193 | DebugDumpTuple(tup, *lastFrame.tupleLL); |
| 194 | } else if (lastFrame.tuplePtrLL != nullptr) { |
| 195 | DebugDumpTuple(tup, *lastFrame.tuplePtrLL); |
| 196 | } |
| 197 | Debug(L" <-- BkBreakpointTriggered(type %d, node %d/goal %d, tuple (%s))", |
| 198 | lastFrame.frameType, |
| 199 | lastFrame.node ? lastFrame.node->Id : 0, |
| 200 | lastFrame.goal ? lastFrame.goal->Id : 0, |
| 201 | tup.str().c_str()); |
| 202 | } |
| 203 | |
| 204 | void DebugMessageHandler::SendGlobalBreakpointTriggered(GlobalBreakpointReason reason) |
| 205 | { |
no test coverage detected