From da26edc5088aed7f9babba1344e8d92ac37ac4aa Mon Sep 17 00:00:00 2001 From: "QCQCQC@Ubuntu" <1220204124@zust.edu.cn> Date: Mon, 7 Apr 2025 19:20:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E5=8A=A0=E8=AF=A6=E7=BB=86=E7=9A=84de?= =?UTF-8?q?bug=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- execve_intercept.c | 33 ++++++++++++++++++++++++--------- intercept.so | Bin 26576 -> 31168 bytes 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/execve_intercept.c b/execve_intercept.c index f4dbf88..04ba7ef 100644 --- a/execve_intercept.c +++ b/execve_intercept.c @@ -4,6 +4,7 @@ #include // 添加 errno 相关定义 #include #include +#include #include // 添加 SIGCHLD 相关定义 #include // 引入 bool 类型 #include @@ -15,13 +16,22 @@ #include #include #include -#include #ifdef DEBUG -#define DEBUG_LOG(fmt, ...) \ - fprintf(stderr, "[DEBUG] %s:%d:%s(): " fmt "\n", __FILE__, __LINE__, \ - __func__, ##__VA_ARGS__) +// getpid要用到 +#include +#include + +void print_stacktrace() { + void *buffer[100]; + int size = backtrace(buffer, 100); // 注意这里是 void ** 和 int 参数 + backtrace_symbols_fd(buffer, size, STDERR_FILENO); +} + +#define DEBUG_LOG(fmt, ...) \ + fprintf(stderr, "[DEBUG][PID %d] %s:%d:%s(): " fmt "\n", getpid(), \ + __FILE__, __LINE__, __func__, ##__VA_ARGS__) #else #define DEBUG_LOG(fmt, ...) ((void)0) @@ -290,7 +300,7 @@ void load_config_if_needed() { // 复制 stdout/stderr 到日志文件,同时保留终端颜色 void duplicate_output_to_log() { DEBUG_LOG("Duplicating stdout/stderr to log file: %s", LOG_OUT_FILE); - + int log_fd = open(LOG_OUT_FILE, O_WRONLY | O_CREAT | O_APPEND, 0644); if (log_fd == -1) { perror("Failed to open log file"); @@ -338,8 +348,7 @@ void duplicate_output_to_log() { while ((n = read(master_fd, buffer, sizeof(buffer))) > 0) { // 检查错误 - if (memmem(buffer, n, "error", 5) || - memmem(buffer, n, "Error", 5) || + if (memmem(buffer, n, "error", 5) || memmem(buffer, n, "Error", 5) || memmem(buffer, n, "ERROR", 5)) { has_error = 1; } @@ -427,13 +436,15 @@ int execve(const char *filename, char *const argv[], char *const envp[]) { char input = getchar(); if (input != 'Y' && input != 'y') { printf("\nExecution cancelled.\n"); - return -1; + exit(EXIT_FAILURE); + // return -1; } printf("\nContinuing execution...\n"); } else if (strcmp(shared_config->rules[i].type, "error") == 0) { printf(ANSI_COLOR_RED "[Error] %s" ANSI_COLOR_RESET "\n", shared_config->rules[i].msg); - return -1; + exit(EXIT_FAILURE); + // return -1; } break; } @@ -490,6 +501,10 @@ __attribute__((destructor)) static void cleanup_shared_memory() { } shared_config = NULL; } +#ifdef DEBUG + print_stacktrace(); +#endif + // if (log_fd != -1) { // DEBUG_LOG("Closing log file descriptor."); // close(log_fd); diff --git a/intercept.so b/intercept.so index 0dad94435ff173acb68e3808b839adec405b1d99..7dc80e5f814e6618781b3594fe0859f01d9f7a6a 100755 GIT binary patch literal 31168 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 literal 26576 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