当前位置: 首页 > 面试题库 >

在Linux中访问另一个进程虚拟内存(调试)

沈飞翔
2023-03-14
问题内容

gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?


问题答案:

gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?

在Linux上读取内存

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;
}

在Linux上写内存

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 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为 交换空间(又称  

  • 问题内容: 我想要一个小的“应用程序加载器”程序,该程序可以通过TCP从外部服务器接收其他二进制应用程序文件并运行它们。 我可以通过将传输的文件保存到硬盘上并使用system()调用来运行它来完成此操作。但是,我想知道是否有可能从内存中启动新应用程序而不接触硬盘驱动器。 加载新应用程序后,加载程序应用程序的状态无关紧要。我更喜欢使用C,但是也欢迎使用C ++解决方案。我还要坚持使用标准Linux

  • 主要内容:虚拟内存如何工作?,按需分页,虚拟内存管理系统的快照虚拟内存是一种存储方案,为用户提供了一个拥有非常大的主内存的幻觉。 这是通过将辅助存储器的一部分作为主存储器来完成的。 在这种方案中,用户可以加载比可用主存更大的进程,因为存在内存可用于加载进程的错觉。 操作系统不是在主内存中加载一个大进程,而是在主内存中加载多个进程的不同部分。 通过这样做,多程序的程度将会增加,因此CPU利用率也会增加。 虚拟内存如何工作? 在现代语言中,虚拟内存近来变得非常普

  • 编辑: > 继Ingo Leonhardt之后,我在以root用户身份而不是以标准用户身份登录后尝试了。这样做解决了root的问题(然后程序可以在以root身份登录时分配所有物理内存)。但这只适用于root用户,不适用于其他用户。但是,至少这意味着原则上内核可以很好地处理这一点,而且只有一个配置问题。 关于:我尝试显式地添加 null > 这是我自己的愚蠢造成的。在我的用户设置中有一个(早已被遗忘

  • 处理器的虚拟内存子系统为每个进程实现了虚拟地址空间。这让每个进程认为它在系统中是独立的。虚拟内存的优点列表别的地方描述的非常详细,所以这里就不重复了。本节集中在虚拟内存的实际的实现细节,和相关的成本。 虚拟地址空间是由CPU的内存管理单元(MMU)实现的。OS必须填充页表数据结构,但大多数CPU自己做了剩下的工作。这事实上是一个相当复杂的机制;最好的理解它的方法是引入数据结构来描述虚拟地址空间。

  • 问题内容: 我正在尝试直接为嵌入式Linux项目访问物理内存,但是我不确定如何最好地指定使用的内存。 如果我定期引导设备并访问/ dev / mem,则可以轻松地对其几乎任何位置进行读写。但是,在这种情况下,我正在访问可以轻松分配给任何进程的内存。我不想做 我的/ dev / mem代码是(删除了所有错误,等等。): 这可行。但是,我想使用没有其他人会碰到的内存。我尝试通过使用mem = XXXm