gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?
在Linux上读取内存 :
1)如字节数来读取比更少3 * sizeof (long)或文件系统/proc不可用或从读取/proc/PID/mem不成功则ptrace使用具有PTRACE_PEEKTEXT读取数据。
3 * sizeof (long)
/proc
/proc/PID/mem
ptrace
PTRACE_PEEKTEXT
这些是函数中的这些条件linux_proc_xfer_partial():
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()使用:
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; }
在Linux上写内存 :
1)ptrace与PTRACE_POKETEXT或一起PTRACE_POKEDATA使用。
PTRACE_POKETEXT
PTRACE_POKEDATA
至于第二个问题:
在哪里可以找到有关…设置硬件观察点的信息
gdb,内部观察点:s http://sourceware.org/gdb/wiki/Internals%20Watchpoints
参考: