blob: 5083f3c873388db110797bd335d4718163a41c4e [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/debug_agent/automation_handler.h"
namespace debug_agent {
void AutomationHandler::OnException(debug_ipc::NotifyException* exception,
const GeneralRegisters& regs, const ProcessHandle& handle,
const std::map<uint32_t, Breakpoint>& breakpoints) {
const std::vector<debug_ipc::AutomationInstruction>* full_instruction_vector = nullptr;
for (debug_ipc::BreakpointStats cur_breakpoint : exception->hit_breakpoints) {
auto cur_breakpoint_iter = breakpoints.find(cur_breakpoint.id);
if (cur_breakpoint_iter != breakpoints.end() &&
cur_breakpoint_iter->second.settings().has_automation) {
if (full_instruction_vector != nullptr) {
DEBUG_LOG(Thread) << "Skipping automatic memory collection due to hitting multiple "
"automated breakpoints at the same time.";
return;
}
full_instruction_vector = &cur_breakpoint_iter->second.settings().instructions;
}
}
if (full_instruction_vector != nullptr) {
auto auto_blocks = executor.ExecuteInstructionVect(*full_instruction_vector, regs, handle);
exception->memory_blocks.insert(exception->memory_blocks.begin(), auto_blocks.begin(),
auto_blocks.end());
}
}
} // namespace debug_agent