#include "bkptmanager.h" #define REG_PC 15 struct unknown_bpt { unknown_bpt(VirtualAddress va) : _va(va) { } ~unknown_bpt() { printf("unknown bpt: %08lx:%08lx\n", _va.proc->pid(), _va.vaddr); } VirtualAddress _va; }; void breakpoint_manager::reg_bpt(VirtualAddress bpaddr, breakpoint_action* action) { std::pair i= _bpts.insert(breakpointmap_t::value_type(bpaddr, breakpoint_action_ptr(action))); printf("new breakpoint: %d %d %08lx:%08lx - %s\n", i.second, (*i.first).second->type(), (*i.first).first.proc->pid(), (*i.first).first.vaddr, (*i.first).second->description().c_str()); } void breakpoint_manager::del_bpt(VirtualAddress bpaddr) { // todo: use pid breakpointmap_t::iterator i= _bpts.find(bpaddr); if (i==_bpts.end()) { printf(" could not del bpt for %08lx:%08lx\n", bpaddr.proc->pid(), bpaddr.vaddr); return; } printf("deleted breakpoint: %d %08lx:%08lx - %s\n", (*i).second->type(), (*i).first.proc->pid(), (*i).first.vaddr, (*i).second->description().c_str()); _bpts.erase(i); } void breakpoint_manager::handle_bpt(ThreadContext& td) { VirtualAddress va= VirtualAddress(td.proc(), td.getreg(REG_PC)); breakpointmap_t::iterator i= _bpts.find(va); if (i==_bpts.end()) throw unknown_bpt(va); printf("handling bpt %d %08lx:%08lx - %s\n", (*i).second->type(), (*i).first.proc->pid(), (*i).first.vaddr, (*i).second->description().c_str()); (*i).second->action(); if ((*i).second->temporary()) _bpts.erase(i); }