add error handling with return codes

This commit is contained in:
Gabriel Ionita 2025-10-27 21:05:00 +01:00
parent 373fc80fa4
commit 433eae3ee8
Signed by: gabi
SSH Key Fingerprint: SHA256:mrbYmB/SGtDvT3etRoS6pDrMYWxR0/B5GSF6rR3qhhc
2 changed files with 18 additions and 18 deletions

View File

@ -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,7 +119,7 @@ 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,
int Tracer::watch_variable(const std::string &var_name, const std::string &exec_path,
uint64_t address, size_t size,
const std::vector<std::string> &args) {
var_name_ = var_name;
@ -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;
}
}

View File

@ -8,7 +8,7 @@
class Tracer {
public:
void watch_variable(const std::string &var_name, const std::string &exec_path,
int watch_variable(const std::string &var_name, const std::string &exec_path,
uint64_t address, size_t size,
const std::vector<std::string> &args = {});