diff options
Diffstat (limited to 'tdbg.cpp')
| -rw-r--r-- | tdbg.cpp | 103 |
1 files changed, 57 insertions, 46 deletions
| @@ -665,7 +665,7 @@ void draw_help_view(int width, int height) { | |||
| 665 | 665 | ||
| 666 | int ty = y + 2; | 666 | int ty = y + 2; |
| 667 | int tx = x + 3; | 667 | int tx = x + 3; |
| 668 | 668 | ||
| 669 | auto d = [&](const std::string& key, const std::string& desc) { | 669 | auto d = [&](const std::string& key, const std::string& desc) { |
| 670 | draw_text(tx, ty, TB_YELLOW | TB_BOLD, TB_DEFAULT, key); | 670 | draw_text(tx, ty, TB_YELLOW | TB_BOLD, TB_DEFAULT, key); |
| 671 | draw_text(tx + 13, ty, TB_DEFAULT, TB_DEFAULT, desc); | 671 | draw_text(tx + 13, ty, TB_DEFAULT, TB_DEFAULT, desc); |
| @@ -712,11 +712,56 @@ void draw_status_bar(SBProcess &process, InputMode mode, int width, int height) | |||
| 712 | draw_text(1, height - 1, TB_BLACK, TB_WHITE, state_str); | 712 | draw_text(1, height - 1, TB_BLACK, TB_WHITE, state_str); |
| 713 | } | 713 | } |
| 714 | 714 | ||
| 715 | SBProcess launch_target(SBTarget& target, const std::string& target_path, const std::vector<std::string>& debuggee_args, const std::vector<std::string>& target_env, std::vector<std::string>& log_buffer) { | ||
| 716 | if (target.GetNumBreakpoints() == 0) { | ||
| 717 | SBBreakpoint bp = target.BreakpointCreateByName("main"); | ||
| 718 | if (bp.IsValid() && bp.GetNumLocations() > 0) { | ||
| 719 | log_msg(log_buffer, "No breakpoints. Added breakpoint at 'main'"); | ||
| 720 | } else { | ||
| 721 | log_msg(log_buffer, "No breakpoints. Failed to add breakpoint at 'main'"); | ||
| 722 | } | ||
| 723 | } | ||
| 724 | log_msg(log_buffer, "Launching..."); | ||
| 725 | |||
| 726 | std::vector<const char*> launch_argv; | ||
| 727 | launch_argv.push_back(target_path.c_str()); | ||
| 728 | for (const auto& arg : debuggee_args) { | ||
| 729 | launch_argv.push_back(arg.c_str()); | ||
| 730 | } | ||
| 731 | launch_argv.push_back(nullptr); | ||
| 732 | |||
| 733 | std::vector<const char*> launch_env; | ||
| 734 | for (const auto& env : target_env) { | ||
| 735 | launch_env.push_back(env.c_str()); | ||
| 736 | } | ||
| 737 | launch_env.push_back(nullptr); | ||
| 738 | |||
| 739 | SBLaunchInfo launch_info(launch_argv.data()); | ||
| 740 | launch_info.SetEnvironmentEntries(launch_env.data(), true); | ||
| 741 | launch_info.SetWorkingDirectory("."); | ||
| 742 | |||
| 743 | SBError error; | ||
| 744 | SBProcess process = target.Launch(launch_info, error); | ||
| 745 | |||
| 746 | if (!process.IsValid() || error.Fail()) { | ||
| 747 | std::string err_msg = "Launch failed"; | ||
| 748 | if (error.GetCString()) { | ||
| 749 | err_msg += ": "; | ||
| 750 | err_msg += error.GetCString(); | ||
| 751 | } | ||
| 752 | log_msg(log_buffer, err_msg); | ||
| 753 | } else { | ||
| 754 | log_msg(log_buffer, "Launched"); | ||
| 755 | } | ||
| 756 | return process; | ||
| 757 | } | ||
| 758 | |||
| 715 | int main(int argc, char** argv) { | 759 | int main(int argc, char** argv) { |
| 716 | std::vector<std::string> target_env; | 760 | std::vector<std::string> target_env; |
| 717 | std::vector<std::string> startup_breakpoints; | 761 | std::vector<std::string> startup_breakpoints; |
| 718 | std::vector<std::string> debuggee_args; | 762 | std::vector<std::string> debuggee_args; |
| 719 | std::string target_path; | 763 | std::string target_path; |
| 764 | bool auto_run = false; | ||
| 720 | 765 | ||
| 721 | for (int i = 1; i < argc; ++i) { | 766 | for (int i = 1; i < argc; ++i) { |
| 722 | std::string arg = argv[i]; | 767 | std::string arg = argv[i]; |
| @@ -724,6 +769,8 @@ int main(int argc, char** argv) { | |||
| 724 | target_env.push_back(argv[++i]); | 769 | target_env.push_back(argv[++i]); |
| 725 | } else if (arg == "-b" && i + 1 < argc) { | 770 | } else if (arg == "-b" && i + 1 < argc) { |
| 726 | startup_breakpoints.push_back(argv[++i]); | 771 | startup_breakpoints.push_back(argv[++i]); |
| 772 | } else if (arg == "-run") { | ||
| 773 | auto_run = true; | ||
| 727 | } else if (arg == "--") { | 774 | } else if (arg == "--") { |
| 728 | for (int j = i + 1; j < argc; ++j) { | 775 | for (int j = i + 1; j < argc; ++j) { |
| 729 | debuggee_args.push_back(argv[j]); | 776 | debuggee_args.push_back(argv[j]); |
| @@ -737,7 +784,7 @@ int main(int argc, char** argv) { | |||
| 737 | } | 784 | } |
| 738 | 785 | ||
| 739 | if (target_path.empty()) { | 786 | if (target_path.empty()) { |
| 740 | std::cerr << "Usage: " << argv[0] << " [-e KEY=VALUE] [-b BREAKPOINT] ... <target_executable> [-- arg1 arg2 ...]\n"; | 787 | std::cerr << "Usage: " << argv[0] << " [-e KEY=VALUE] [-b BREAKPOINT] [-run] ... <target_executable> [-- arg1 arg2 ...]\n"; |
| 741 | return 1; | 788 | return 1; |
| 742 | } | 789 | } |
| 743 | 790 | ||
| @@ -767,9 +814,12 @@ int main(int argc, char** argv) { | |||
| 767 | } | 814 | } |
| 768 | } | 815 | } |
| 769 | 816 | ||
| 770 | SBProcess process; | 817 | SBProcess process; |
| 771 | SBThread thread; | 818 | if (auto_run) { |
| 819 | process = launch_target(target, target_path, debuggee_args, target_env, log_buffer); | ||
| 820 | } | ||
| 772 | 821 | ||
| 822 | SBThread thread; | ||
| 773 | TermboxGuard tb_guard; | 823 | TermboxGuard tb_guard; |
| 774 | 824 | ||
| 775 | bool running = true; | 825 | bool running = true; |
| @@ -848,47 +898,8 @@ int main(int argc, char** argv) { | |||
| 848 | if (ev.ch == 'q') { | 898 | if (ev.ch == 'q') { |
| 849 | running = false; | 899 | running = false; |
| 850 | } else if (ev.ch == 'r') { | 900 | } else if (ev.ch == 'r') { |
| 851 | if (!process.IsValid()) { | 901 | if (!process.IsValid() || process.GetState() == eStateExited) { |
| 852 | if (target.GetNumBreakpoints() == 0) { | 902 | process = launch_target(target, target_path, debuggee_args, target_env, log_buffer); |
| 853 | SBBreakpoint bp = target.BreakpointCreateByName("main"); | ||
| 854 | if (bp.IsValid() && bp.GetNumLocations() > 0) { | ||
| 855 | log_msg(log_buffer, "No breakpoints. Added breakpoint at 'main'"); | ||
| 856 | } else { | ||
| 857 | log_msg(log_buffer, "No breakpoints. Failed to add breakpoint at 'main'"); | ||
| 858 | } | ||
| 859 | } | ||
| 860 | log_msg(log_buffer, "Launching..."); | ||
| 861 | |||
| 862 | std::vector<const char*> launch_argv; | ||
| 863 | launch_argv.push_back(target_path.c_str()); | ||
| 864 | for (const auto& arg : debuggee_args) { | ||
| 865 | launch_argv.push_back(arg.c_str()); | ||
| 866 | } | ||
| 867 | launch_argv.push_back(nullptr); | ||
| 868 | |||
| 869 | std::vector<const char*> launch_env; | ||
| 870 | for (const auto& env : target_env) { | ||
| 871 | launch_env.push_back(env.c_str()); | ||
| 872 | } | ||
| 873 | launch_env.push_back(nullptr); | ||
| 874 | |||
| 875 | SBLaunchInfo launch_info(launch_argv.data()); | ||
| 876 | launch_info.SetEnvironmentEntries(launch_env.data(), true); | ||
| 877 | launch_info.SetWorkingDirectory("."); | ||
| 878 | |||
| 879 | SBError error; | ||
| 880 | process = target.Launch(launch_info, error); | ||
| 881 | |||
| 882 | if (!process.IsValid() || error.Fail()) { | ||
| 883 | std::string err_msg = "Launch failed"; | ||
| 884 | if (error.GetCString()) { | ||
| 885 | err_msg += ": "; | ||
| 886 | err_msg += error.GetCString(); | ||
| 887 | } | ||
| 888 | log_msg(log_buffer, err_msg); | ||
| 889 | } else { | ||
| 890 | log_msg(log_buffer, "Launched"); | ||
| 891 | } | ||
| 892 | } else { | 903 | } else { |
| 893 | log_msg(log_buffer, "Already running"); | 904 | log_msg(log_buffer, "Already running"); |
| 894 | } | 905 | } |
| @@ -916,7 +927,7 @@ int main(int argc, char** argv) { | |||
| 916 | case 'c': process.Continue(); break; | 927 | case 'c': process.Continue(); break; |
| 917 | } | 928 | } |
| 918 | } | 929 | } |
| 919 | 930 | ||
| 920 | if (ev.key == TB_KEY_ARROW_LEFT && (ev.mod & TB_MOD_CTRL)) { | 931 | if (ev.key == TB_KEY_ARROW_LEFT && (ev.mod & TB_MOD_CTRL)) { |
| 921 | layout_config.sidebar_width = std::min(width - 20, layout_config.sidebar_width + 2); | 932 | layout_config.sidebar_width = std::min(width - 20, layout_config.sidebar_width + 2); |
| 922 | } else if (ev.key == TB_KEY_ARROW_RIGHT && (ev.mod & TB_MOD_CTRL)) { | 933 | } else if (ev.key == TB_KEY_ARROW_RIGHT && (ev.mod & TB_MOD_CTRL)) { |
