diff --git a/src/tracer.cpp b/src/tracer.cpp index 5848aa6..53b7040 100644 --- a/src/tracer.cpp +++ b/src/tracer.cpp @@ -35,12 +35,7 @@ void Tracer::setup_hardware_watchpoint(pid_t pid, uint64_t address, size_t size) dr7 |= (DR7_BREAK_ON_RW << 16); // Set length based on size (bits 18-19 for DR0) - uint64_t len_code; - if (size == 1) len_code = DR7_LEN_1; - else if (size == 2) len_code = DR7_LEN_2; - else if (size == 4) len_code = DR7_LEN_4; - else len_code = DR7_LEN_8; - + uint64_t len_code = (size == 4) ? DR7_LEN_4 : DR7_LEN_8; dr7 |= (len_code << 18); // Also set GE (bit 9) for exact breakpoint detection @@ -59,11 +54,7 @@ int64_t Tracer::read_memory_value(pid_t pid, uint64_t address, size_t size) { } int64_t value = 0; - if (size == 1) { - value = (int8_t)(data & 0xFF); - } else if (size == 2) { - value = (int16_t)(data & 0xFFFF); - } else if (size == 4) { + if (size == 4) { value = (int32_t)(data & 0xFFFFFFFF); } else if (size == 8) { value = data; @@ -128,9 +119,9 @@ uint64_t Tracer::get_load_address(pid_t pid, const std::string &exec_path) { return first_mapping; } -void Tracer::watch_variable(const std::string &var_name, const std::string &exec_path, - uint64_t address, size_t size, - const std::vector &args) { +int Tracer::watch_variable(const std::string &var_name, const std::string &exec_path, + uint64_t address, size_t size, + const std::vector &args) { var_name_ = var_name; prev_value_.reset(); @@ -158,12 +149,18 @@ void Tracer::watch_variable(const std::string &var_name, const std::string &exec if (!WIFSTOPPED(status)) { std::cerr << "Error: Child process not stopped after PTRACE_TRACEME" << std::endl; - return; + return 1; } // The process is stopped after exec due to PTRACE_TRACEME // Get the actual load address (for PIE binaries) uint64_t load_addr = get_load_address(pid, exec_path); + + if (load_addr == 0) { + std::cerr << "Error: Failed to determine load address for " << exec_path << std::endl; + return 1; + } + uint64_t runtime_addr = load_addr + address; // Initialize previous value by reading current memory @@ -204,7 +201,10 @@ void Tracer::watch_variable(const std::string &var_name, const std::string &exec } } } + + return 0; } else { std::cerr << "Error: fork() failed" << std::endl; + return 1; } } diff --git a/src/tracer.hpp b/src/tracer.hpp index 8bd7b6a..0035a0f 100644 --- a/src/tracer.hpp +++ b/src/tracer.hpp @@ -8,9 +8,9 @@ class Tracer { public: - void watch_variable(const std::string &var_name, const std::string &exec_path, - uint64_t address, size_t size, - const std::vector &args = {}); + int watch_variable(const std::string &var_name, const std::string &exec_path, + uint64_t address, size_t size, + const std::vector &args = {}); private: void setup_hardware_watchpoint(pid_t pid, uint64_t address, size_t size);