连接到目标时,GDB 需要从内存中了解什么?

问题描述 投票:0回答:1

我正在尝试为定制芯片编写 GDB 存根。由于目标是自定义的,因此它需要一个 GDB 存根/服务器来处理 GDB 的请求。我似乎能够处理 GDB 在最初连接时给出的所有请求。然而,一个问题是 GDB 尝试读取接近零的地址。由于该芯片上不可能存在接近零的地址,因此这就产生了一个问题。

那么,问题是 GDB 在最初连接到目标时尝试从内存中读取什么?依赖是ELF文件还是更简单的东西?

我希望了解 GDB 在初始连接时需要从内存中读取的内容将为我指明正确的方向(也许我在 ELF 文件中映射了错误的内容?)。

我尝试查看 elf 文件,但不确定它会告诉我什么。

gdb gdbserver
1个回答
0
投票

在 GNU/Linux 系统上,当 GDB 连接到 GDB 服务器时,GDB 尝试读取内存有以下三个原因:

  1. 放置软件断点,GDB 将设置断点来捕获共享库加载/卸载事件、C++ 异常抛出/捕获事件和 C 长跳转事件等事件。 创建哪些将取决于您运行的环境(操作系统、libc 等),
  2. 在 x86-64 GNU/Linux 上(也许还有其他架构,但我必须检查),有一个内存映射的 vsyscall 页面(用于更快的系统调用处理),GDB 从该区域读取一些标头信息以找出详细信息这个地区,
  3. 最后,读取堆栈信息以呈现初始停止。 如果您使用
    target remote
    进行连接,则假定远程下级正在 GDB 连接点运行。 GDB 将读取
    $pc
    $sp
    寄存器,然后从堆栈中查询信息以呈现初始停止(例如堆栈帧和参数值)。

如果您的自定义目标是裸机设置,那么最可能的问题是您报告了虚假的

$pc
和/或
$sp
值,因此 GDB 尝试读取不应该读取的内存。

如果您不知道,您可以在 GDB 端

set debug remote on
让 GDB 报告其在远程目标方面正在执行的操作的详细信息,尽管这不会让您深入了解为什么做这些事情,但可能会有一点帮助。

另一个好的方法是只实现内存读取,并让远程给出答复,指示无法读取所请求的内存,然后 GDB 将(希望)给出一个有用的错误,指示读取失败时它试图执行的操作.

© www.soinside.com 2019 - 2024. All rights reserved.