Showing the changes to src/exec/debugger.cpp (1 of 4 files). Show all
Unified · Split
| @@ -389,7 +389,14 @@ namespace · 388 unmodified lines | ||
| 389 | 389 | if (pc < 0 || module->code_section.size() <= static_cast<std::size_t>(pc)) |
| 390 | 390 | throw debug_cmd_error_t{ "Invalid IP for module" }; |
| 391 | 391 | |
| 392 | − cxt.dbg.breakpoint_cookies.push_back(cxt.dbg.controller->set_breakpoint(module, pc)); | |
| 392 | + try | |
| 393 | + { | |
| 394 | + cxt.dbg.breakpoint_cookies.push_back(cxt.dbg.controller->set_breakpoint(module, pc)); | |
| 395 | + } | |
| 396 | + catch (const vm_system_exception& e) | |
| 397 | + { | |
| 398 | + throw debug_cmd_error_t{ e.what() }; | |
| 399 | + } | |
| 393 | 400 | } |
| 394 | 401 | |
| 395 | 402 | void cmd_breakpoint_clear(const std::vector<std::string> &a, dbg_cmd_cxt_t &cxt) |
| @@ -536,7 +543,7 @@ namespace · 140 unmodified lines | ||
| 536 | 543 | |
| 537 | 544 | void cmd_disassemble(const std::vector<std::string> &a, dbg_cmd_cxt_t &cxt) |
| 538 | 545 | { |
| 539 | − auto disassemble_length = int{ 1 }; | |
| 546 | + auto disassemble_length = int{ 4 }; | |
| 540 | 547 | if (a.size() > 1) |
| 541 | 548 | { |
| 542 | 549 | try |
| @@ -567,7 +574,29 @@ namespace · 24 unmodified lines | ||
| 567 | 574 | |
| 568 | 575 | auto msg = std::stringstream{}; |
| 569 | 576 | for (auto i = begin_index; i < end_index; ++i) |
| 570 | − msg << " " << std::setw(5) << i << ": " << code_section[i].op << "\n"; | |
| 577 | + { | |
| 578 | + auto op = code_section[i].op; | |
| 579 | + | |
| 580 | + auto op_prefix = " "; | |
| 581 | + | |
| 582 | + // If the opcode is a breakpoint then try and replace it with the real opcode | |
| 583 | + if (op.opcode == opcode_t::brkpt) | |
| 584 | + { | |
| 585 | + // Look up each of the known cookies to try and find the matching PC and module | |
| 586 | + for (auto bp_cookie : cxt.dbg.breakpoint_cookies) | |
| 587 | + { | |
| 588 | + const auto details = cxt.dbg.controller->get_breakpoint_details(bp_cookie); | |
| 589 | + if (details.pc == i && details.module == r.module_ref->module) | |
| 590 | + { | |
| 591 | + op.opcode = details.original_opcode; | |
| 592 | + op_prefix = " b"; | |
| 593 | + break; | |
| 594 | + } | |
| 595 | + } | |
| 596 | + } | |
| 597 | + | |
| 598 | + msg << op_prefix << std::setw(5) << i << ": " << op << "\n"; | |
| 599 | + } | |
| 571 | 600 | |
| 572 | 601 | debug_print_info(msg.str()); |
| 573 | 602 | } |
| @@ -727,7 +756,7 @@ namespace · 153 unmodified lines | ||
| 727 | 756 | |
| 728 | 757 | { "sw", "Stack walk for the current or supplied thread", "sw ([0-9]+|\\*)?", "sw, sw 34, sw *", cmd_stackwalk }, |
| 729 | 758 | { "~", "Switch to thread", "~ [0-9]+", "~ 42", cmd_switchthread }, |
| 730 | − { "d", "Disassemble the next/previous N instructions", "d (-?[0-9]+)?", "d, d -4, d 5", cmd_disassemble }, | |
| 759 | + { "d", "Disassemble the next/previous N instructions (default N = 4)", "d (-?[0-9]+)?", "d, d -4, d 5", cmd_disassemble }, | |
| 731 | 760 | { "x", "Examine memory", "x [mp|fp] [0-9]+ ([0-9]+)?", "x mp 3, x fp 20 6", cmd_examine }, |
| 732 | 761 | { "?", "Print help", nullptr, nullptr, cmd_help }, |
| 733 | 762 | |