add controller command

This commit is contained in:
5ec1cff
2023-11-12 21:00:18 +08:00
parent 040643337d
commit 0ac9bb819b
3 changed files with 22 additions and 17 deletions

View File

@@ -20,8 +20,17 @@ int main(int argc, char **argv) {
auto pid = strtol(argv[2], 0, 0); auto pid = strtol(argv[2], 0, 0);
return !trace_zygote(pid); return !trace_zygote(pid);
} else if (argc >= 3 && argv[1] == "ctl"sv) { } else if (argc >= 3 && argv[1] == "ctl"sv) {
// TODO if (argv[2] == "start"sv) {
return 1; send_control_command(START);
} else if (argv[2] == "stop"sv) {
send_control_command(STOP);
} else if (argv[2] == "exit"sv) {
send_control_command(EXIT);
} else {
printf("Usage: %s ctl start|stop|exit\n", argv[0]);
return 1;
}
return 0;
} else { } else {
LOGE("usage: %s monitor | trace <pid> | ctl <command>", argv[0]); LOGE("usage: %s monitor | trace <pid> | ctl <command>", argv[0]);
return 1; return 1;

View File

@@ -2,3 +2,11 @@
void init_monitor(); void init_monitor();
bool trace_zygote(int pid); bool trace_zygote(int pid);
enum Command {
START = 1,
STOP,
EXIT
};
void send_control_command(Command cmd);

View File

@@ -23,11 +23,6 @@ using namespace std::string_view_literals;
#define STOPPED_WITH(sig, event) WIFSTOPPED(status) && (status >> 8 == ((sig) | (event << 8))) #define STOPPED_WITH(sig, event) WIFSTOPPED(status) && (status >> 8 == ((sig) | (event << 8)))
enum Command {
START = 1,
STOP,
EXIT
};
enum TracingState { enum TracingState {
TRACING = 1, TRACING = 1,
@@ -105,7 +100,6 @@ public:
}; };
static TracingState tracing_state = TRACING; static TracingState tracing_state = TRACING;
static bool exit_requested = false;
struct SocketHandler : public EventHandler { struct SocketHandler : public EventHandler {
int sock_fd_; int sock_fd_;
@@ -149,7 +143,6 @@ struct SocketHandler : public EventHandler {
} }
switch (cmd) { switch (cmd) {
case START: case START:
if (exit_requested) break;
if (tracing_state == STOPPING) { if (tracing_state == STOPPING) {
tracing_state = TRACING; tracing_state = TRACING;
} else if (tracing_state == STOPPED) { } else if (tracing_state == STOPPED) {
@@ -159,7 +152,6 @@ struct SocketHandler : public EventHandler {
} }
break; break;
case STOP: case STOP:
if (exit_requested) break;
if (tracing_state == TRACING) { if (tracing_state == TRACING) {
LOGI("stop tracing requested"); LOGI("stop tracing requested");
tracing_state = STOPPING; tracing_state = STOPPING;
@@ -168,12 +160,7 @@ struct SocketHandler : public EventHandler {
break; break;
case EXIT: case EXIT:
LOGI("prepare for exit ..."); LOGI("prepare for exit ...");
exit_requested = true; loop.Stop();
if (tracing_state == TRACING) {
LOGI("stop tracing requested");
tracing_state = STOPPING;
ptrace(PTRACE_INTERRUPT, 1, 0, 0);
}
break; break;
} }
} }
@@ -232,7 +219,7 @@ public:
while ((pid = waitpid(-1, &status, __WALL | WNOHANG)) != 0) { while ((pid = waitpid(-1, &status, __WALL | WNOHANG)) != 0) {
if (pid == -1) { if (pid == -1) {
if (tracing_state == STOPPED && errno == ECHILD) break; if (tracing_state == STOPPED && errno == ECHILD) break;
err(EXIT_FAILURE, "waitpid"); PLOGE("waitpid");
} }
if (pid == 1) { if (pid == 1) {
if (STOPPED_WITH(SIGTRAP, PTRACE_EVENT_FORK)) { if (STOPPED_WITH(SIGTRAP, PTRACE_EVENT_FORK)) {
@@ -346,4 +333,5 @@ void send_control_command(Command cmd) {
printf("send %ld != %ld\n", nsend, sizeof(cmd)); printf("send %ld != %ld\n", nsend, sizeof(cmd));
exit(1); exit(1);
} }
printf("command sent\n");
} }