我想在Android上从ptaced子进程(/ proc/pid/mem)读取和写入内存。在读/写之前,我使用ptrace(Status = 4991,WIFSTOPPED(Status)= true)连接到进程。从Android平台上的Java代码读取/写入/ proc/<pid>/mem
int lSize = (int) (pAddressEnd - pAddressStart);
ByteBuffer lByteBuffer = ByteBuffer.allocate(lSize);
RandomAccessFile lRandomAccessFile = null;
try {
lRandomAccessFile = new RandomAccessFile(mFileName, "r");
lRandomAccessFile.getChannel().read(lByteBuffer, pAddressStart);
lRandomAccessFile.close();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
...
有时候内存访问通过正确的,但有时它抛出异常:
java.lang.RuntimeException: java.io.IOException: pread failed: EIO (I/O error)
...
at java.lang.Thread.run(Thread.java:841)
Caused by: java.io.IOException: pread failed: EIO (I/O error)
at java.nio.FileChannelImpl.readImpl(FileChannelImpl.java:315)
at java.nio.FileChannelImpl.read(FileChannelImpl.java:283)
at test.Process$Mem.readByteBuffer(Process.java:285)
... 33 more
Caused by: libcore.io.ErrnoException: pread failed: EIO (I/O error)
at libcore.io.Posix.preadBytes(Native Method)
at libcore.io.Posix.pread(Posix.java:99)
at libcore.io.BlockGuardOs.pread(BlockGuardOs.java:124)
at java.nio.FileChannelImpl.readImpl(FileChannelImpl.java:305)
... 35 more
尝试总是写内存抛出异常。
我可以使用RandomAccessFile.getChannel()。read()方法读取内存吗?和RandomAccessFile.getChannel()。write()用于写入内存?如何正确使用它?
你的问题似乎跟ptrace完全没有关系。知道如何帮助你但对ptrace没有兴趣的人会忽略你的问题,而那些知道ptrace(一种Java,我认为不支持C的概念),但不是Java随机访问文件的人会遇到你的问题和浪费他们的时间,直到他们意识到他们无法帮助你。有效的沟通/描述你的问题是至关重要的,你似乎在第一次尝试时失败了。我强烈建议您编辑您的问题,并根据您的需求合理清晰地设置标题和内容。 – mah
@mah:这个问题似乎对我来说足够合理,特别是考虑到英语显然不是他们的第一语言。将/ dev/X/mem与ptrace结合是一种完全标准的技术。此外,像'失败悲惨'这样的短语可能不是建设性的...... –
@DavidGiven我想我同意“失败悲惨”有点苛刻。尽管如此,我仍然觉得问题的标题至少需要与匹配其中的内容和预编辑的内容相匹配,但在此情况并非如此。虽然ptrace和读取/ dev/X/mem确实是相关的,但是表达的问题不仅与ptrace无关,除了偶然的(我想要读取的过程是ptraced)语句之外,ptrace甚至不会出现在它中。我不清楚(直到去海报的档案)英语是次要的,但这不是与Q. – mah