在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 LONGEST

linux_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)ptracePTRACE_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

回到顶部