add error handling with return codes
This commit is contained in:
parent
373fc80fa4
commit
433eae3ee8
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 = {});
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user