Showing the changes to src/vm/tool_dispatch.cpp (1 of 6 files). Show all
Unified · Split
| @@ -245,8 +245,15 @@ cookie_t vm_tool_dispatch_t::set_breakpoint(std::shared_ptr<vm_module_t> module, · 244 unmodified lines | ||
| 245 | 245 | |
| 246 | 246 | { |
| 247 | 247 | std::lock_guard<std::mutex> lock{ _breakpoints.lock }; |
| 248 | + auto &pc_map = _breakpoints.original_opcodes[reinterpret_cast<std::uintptr_t>(module.get())]; | |
| 249 | + | |
| 250 | + // If the real opcode is already a breakpoint and it is known, return the current cookie. | |
| 248 | 251 | if (real_opcode == opcode_t::brkpt) |
| 249 | − throw vm_system_exception{ "Breakpoint already set at PC" }; | |
| 252 | + { | |
| 253 | + auto iter = pc_map.find(pc); | |
| 254 | + if (iter != pc_map.cend()) | |
| 255 | + return iter->second.second; | |
| 256 | + } | |
| 250 | 257 | |
| 251 | 258 | const auto cookie_id = _breakpoints.cookie_counter++; |
| 252 | 259 | |
| @@ -254,7 +261,6 @@ cookie_t vm_tool_dispatch_t::set_breakpoint(std::shared_ptr<vm_module_t> module, · 1 unmodified line | ||
| 254 | 261 | _breakpoints.cookie_to_details[cookie_id] = { module, pc, real_opcode }; |
| 255 | 262 | |
| 256 | 263 | // Record the original opcode |
| 257 | − auto &pc_map = _breakpoints.original_opcodes[reinterpret_cast<std::uintptr_t>(module.get())]; | |
| 258 | 264 | pc_map[pc] = std::make_pair(real_opcode, cookie_id); |
| 259 | 265 | |
| 260 | 266 | // Replace the current opcode with breakpoint |