在Linux中访问另一个进程虚拟内存(调试)
gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?
回答:
gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?
:
1)如字节数来读取比更少3 * sizeof
(long)或文件系统/proc
不可用或从读取/proc/PID/mem
不成功则ptrace
使用具有PTRACE_PEEKTEXT
读取数据。
这些是函数中的这些条件linux_proc_xfer_partial()
:
/* Don't bother for one word. */ if (len < 3 * sizeof (long))
return 0;
/* We could keep this file open and cache it - possibly one per
thread. That requires some juggling, but is even faster. */
xsnprintf (filename, sizeof filename, "/proc/%d/mem",
ptid_get_pid (inferior_ptid));
fd = gdb_open_cloexec (filename, O_RDONLY | O_LARGEFILE, 0);
if (fd == -1)
return 0;
2)如果要读取的字节数大于或等于3 *
sizeof(long)并且/proc
可用,则使用pread64
或(lseek()
和read()
使用:
static LONGESTlinux_proc_xfer_partial (struct target_ops *ops, enum target_object object,
const char *annex, gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset, LONGEST len)
{
.....
/* If pread64 is available, use it. It's faster if the kernel
supports it (only one syscall), and it's 64-bit safe even on
32-bit platforms (for instance, SPARC debugging a SPARC64
application). */
#ifdef HAVE_PREAD64
if (pread64 (fd, readbuf, len, offset) != len)
#else
if (lseek (fd, offset, SEEK_SET) == -1 || read (fd, readbuf, len) != len)
#endif
ret = 0;
else
ret = len;
close (fd);
return ret;
}
:
1)ptrace
与PTRACE_POKETEXT
或一起PTRACE_POKEDATA
使用。
至于第二个问题:
在哪里可以找到有关…设置硬件观察点的信息
gdb,内部观察点:s
http://sourceware.org/gdb/wiki/Internals%20Watchpoints
参考:
- http://linux.die.net/man/2/ptrace
- http://www.alexonlinux.com/how-debugger-works
以上是 在Linux中访问另一个进程虚拟内存(调试) 的全部内容, 来源链接: utcz.com/qa/426605.html