summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2026-01-17 02:36:18 +0100
committerMitja Felicijan <mitja.felicijan@gmail.com>2026-01-17 02:36:18 +0100
commit38f07f6e9d29a85f13ea37950d36fe88d34cd5c5 (patch)
treefa378e7ce43c052bdef80d6d0ccf5d42e6deaa49
parent7e51fbebe479f772c3b0be5c78a787ae23ba8cc1 (diff)
downloadtoy-debugger-38f07f6e9d29a85f13ea37950d36fe88d34cd5c5.tar.gz
Add auto-run functionality via the `-run` flag and refactor target launch logic
-rw-r--r--README.md8
-rw-r--r--tdbg.cpp103
2 files changed, 65 insertions, 46 deletions
diff --git a/README.md b/README.md
index e28f4ed..dab96a8 100644
--- a/README.md
+++ b/README.md
@@ -40,6 +40,14 @@ Example with breakpoints:
./tdbg ./example -b example.c:54 -b example.c:60
```
+Example with auto run:
+
+```sh
+./tdbg -run ./example
+./tdbg -run ./example arg1 arg2 arg3
+./tdbg -run ./example -e MYENV=qwe -- arg1 arg2 arg3
+```
+
### Interactive Commands
| Key | Action |
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) {
int ty = y + 2;
int tx = x + 3;
-
+
auto d = [&](const std::string& key, const std::string& desc) {
draw_text(tx, ty, TB_YELLOW | TB_BOLD, TB_DEFAULT, key);
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)
draw_text(1, height - 1, TB_BLACK, TB_WHITE, state_str);
}
+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) {
+ if (target.GetNumBreakpoints() == 0) {
+ SBBreakpoint bp = target.BreakpointCreateByName("main");
+ if (bp.IsValid() && bp.GetNumLocations() > 0) {
+ log_msg(log_buffer, "No breakpoints. Added breakpoint at 'main'");
+ } else {
+ log_msg(log_buffer, "No breakpoints. Failed to add breakpoint at 'main'");
+ }
+ }
+ log_msg(log_buffer, "Launching...");
+
+ std::vector<const char*> launch_argv;
+ launch_argv.push_back(target_path.c_str());
+ for (const auto& arg : debuggee_args) {
+ launch_argv.push_back(arg.c_str());
+ }
+ launch_argv.push_back(nullptr);
+
+ std::vector<const char*> launch_env;
+ for (const auto& env : target_env) {
+ launch_env.push_back(env.c_str());
+ }
+ launch_env.push_back(nullptr);
+
+ SBLaunchInfo launch_info(launch_argv.data());
+ launch_info.SetEnvironmentEntries(launch_env.data(), true);
+ launch_info.SetWorkingDirectory(".");
+
+ SBError error;
+ SBProcess process = target.Launch(launch_info, error);
+
+ if (!process.IsValid() || error.Fail()) {
+ std::string err_msg = "Launch failed";
+ if (error.GetCString()) {
+ err_msg += ": ";
+ err_msg += error.GetCString();
+ }
+ log_msg(log_buffer, err_msg);
+ } else {
+ log_msg(log_buffer, "Launched");
+ }
+ return process;
+}
+
int main(int argc, char** argv) {
std::vector<std::string> target_env;
std::vector<std::string> startup_breakpoints;
std::vector<std::string> debuggee_args;
std::string target_path;
+ bool auto_run = false;
for (int i = 1; i < argc; ++i) {
std::string arg = argv[i];
@@ -724,6 +769,8 @@ int main(int argc, char** argv) {
target_env.push_back(argv[++i]);
} else if (arg == "-b" && i + 1 < argc) {
startup_breakpoints.push_back(argv[++i]);
+ } else if (arg == "-run") {
+ auto_run = true;
} else if (arg == "--") {
for (int j = i + 1; j < argc; ++j) {
debuggee_args.push_back(argv[j]);
@@ -737,7 +784,7 @@ int main(int argc, char** argv) {
}
if (target_path.empty()) {
- std::cerr << "Usage: " << argv[0] << " [-e KEY=VALUE] [-b BREAKPOINT] ... <target_executable> [-- arg1 arg2 ...]\n";
+ std::cerr << "Usage: " << argv[0] << " [-e KEY=VALUE] [-b BREAKPOINT] [-run] ... <target_executable> [-- arg1 arg2 ...]\n";
return 1;
}
@@ -767,9 +814,12 @@ int main(int argc, char** argv) {
}
}
- SBProcess process;
- SBThread thread;
+ SBProcess process;
+ if (auto_run) {
+ process = launch_target(target, target_path, debuggee_args, target_env, log_buffer);
+ }
+ SBThread thread;
TermboxGuard tb_guard;
bool running = true;
@@ -848,47 +898,8 @@ int main(int argc, char** argv) {
if (ev.ch == 'q') {
running = false;
} else if (ev.ch == 'r') {
- if (!process.IsValid()) {
- if (target.GetNumBreakpoints() == 0) {
- SBBreakpoint bp = target.BreakpointCreateByName("main");
- if (bp.IsValid() && bp.GetNumLocations() > 0) {
- log_msg(log_buffer, "No breakpoints. Added breakpoint at 'main'");
- } else {
- log_msg(log_buffer, "No breakpoints. Failed to add breakpoint at 'main'");
- }
- }
- log_msg(log_buffer, "Launching...");
-
- std::vector<const char*> launch_argv;
- launch_argv.push_back(target_path.c_str());
- for (const auto& arg : debuggee_args) {
- launch_argv.push_back(arg.c_str());
- }
- launch_argv.push_back(nullptr);
-
- std::vector<const char*> launch_env;
- for (const auto& env : target_env) {
- launch_env.push_back(env.c_str());
- }
- launch_env.push_back(nullptr);
-
- SBLaunchInfo launch_info(launch_argv.data());
- launch_info.SetEnvironmentEntries(launch_env.data(), true);
- launch_info.SetWorkingDirectory(".");
-
- SBError error;
- process = target.Launch(launch_info, error);
-
- if (!process.IsValid() || error.Fail()) {
- std::string err_msg = "Launch failed";
- if (error.GetCString()) {
- err_msg += ": ";
- err_msg += error.GetCString();
- }
- log_msg(log_buffer, err_msg);
- } else {
- log_msg(log_buffer, "Launched");
- }
+ if (!process.IsValid() || process.GetState() == eStateExited) {
+ process = launch_target(target, target_path, debuggee_args, target_env, log_buffer);
} else {
log_msg(log_buffer, "Already running");
}
@@ -916,7 +927,7 @@ int main(int argc, char** argv) {
case 'c': process.Continue(); break;
}
}
-
+
if (ev.key == TB_KEY_ARROW_LEFT && (ev.mod & TB_MOD_CTRL)) {
layout_config.sidebar_width = std::min(width - 20, layout_config.sidebar_width + 2);
} else if (ev.key == TB_KEY_ARROW_RIGHT && (ev.mod & TB_MOD_CTRL)) {