aboutsummaryrefslogtreecommitdiff
path: root/tdbg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdbg.cpp')
-rw-r--r--tdbg.cpp103
1 files changed, 57 insertions, 46 deletions
diff --git a/tdbg.cpp b/tdbg.cpp
index 08b47f4..3daede1 100644
--- a/tdbg.cpp
+++ b/tdbg.cpp
@@ -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
715SBProcess 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
715int main(int argc, char** argv) { 759int 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)) {