在 C/CPP 中使用 ptrace() 读取另一个进程内存

在 C/CPP 中使用 ptrace() 读取另一个进程内存

因此,最初,进程 A 创建了一个文件,其中包含从流 (UART) 读取的数据(37 字节)。

进程 B 必须获取该数据,该数据存储在 /dev/shm 中。

进程 A 写入该文件的绝对最大时间为 4 毫秒。超过此值会导致不可接受的数据丢失。文件创建平均需要 600us,这完全没问题,不会随机飙升到 7ms 或更高。

为了避免文件处理,我想通过将数组的地址作为起始参数传递来直接访问 RAM:

// Process A
sprintf(cmd, "path_to_file.out %i", (unsigned int)&rx_buffer);
system(cmd);

// Process B
int rx_buffer_address = atoi(argv[1]);

使用吉尔斯建议的程序,我能够读一次

sprintf(mem_file_name, "/proc/%d/mem", pid);
mem_fd = open(mem_file_name, O_RDONLY);
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
lseek(mem_fd, offset, SEEK_SET);
read(mem_fd, buf, _SC_PAGE_SIZE);
ptrace(PTRACE_DETACH, pid, NULL, NULL);

即使在函数中添加 close(mem_fd) 时,第二次尝试运行此方法也会重复失败,open() 返回 ENOENT(没有这样的文件或目录)并且 ptrace 返回 ESRCH(没有这样的进程)。

进一步调查表明,第一个 PTRACE_DETACH 调用已经返回 ESRCH。

查找 ptrace(),我尝试使用 PTRACE_PEEKDATA 读取内存,每次读取都会返回 0xFF。

PEEKDATA 方法访问的区域映射是否与 /mem 文件描述符不同?或者我是否遗漏了有关这两种方法甚至文件访问时间的其他内容?

相关内容