QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 808|回复: 1

请教各位gdbserver的两个问题

[复制链接]
发表于 2004-11-23 17:25:04 | 显示全部楼层 |阅读模式
1)gdbserver为什么不支持remote debugging protocol的x命令,即以二进制形式写target内存?好像只支持M命令,不过这是以字符方式写。
2)gdbserver中linux_write_memory ,有一处看不大懂,为什么要先读再写?先PTRACE_PEEKTEXT再PTRACE_POKETEXT?难道是为了对齐边界什么的,但不是很清楚,哪位朋友给我具体说说,谢谢。

static int
linux_write_memory (CORE_ADDR memaddr, const char *myaddr, int len)
{
  register int i;
  /* Round starting address down to longword boundary.  */
  register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
  /* Round ending address up; get number of longwords that makes.  */
  register int count
  = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE);
  /* Allocate buffer of that many longwords.  */
  register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
  extern int errno;

  if (debug_threads)
    {
      fprintf (stderr, "Writing %02x to %08lx\n", (unsigned)myaddr[0], (long)memaddr);
    }

  /* Fill start and end extra bytes of buffer with existing memory data.  */

  buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid,
                      (PTRACE_ARG3_TYPE) addr, 0);

  if (count > 1)
    {
      buffer[count - 1]
        = ptrace (PTRACE_PEEKTEXT, inferior_pid,
                  (PTRACE_ARG3_TYPE) (addr + (count - 1)
                                      * sizeof (PTRACE_XFER_TYPE)),
                  0);
    }

  /* Copy data to be written over corresponding part of buffer */

  memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);

  /* Write the entire buffer.  */

  for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
    {
      errno = 0;
      ptrace (PTRACE_POKETEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, buffer);
      if (errno)
        return errno;
    }

  return 0;
}
发表于 2004-11-29 20:35:59 | 显示全部楼层
简单补充一下.
1.应该不是所有的gdbserver都不支持X,
某些版本uclinux-dist下带的可能是这样.
M和X功能是一样的.X速度快,M适用广.
gdb client下指令前会测试gdbserver是否支持二进制传输.
2.ARM的ptrace(kernel)需要4字节对齐的地址,所以gdbserver需要适配.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-20 14:49 , Processed in 0.120256 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表