使用 Gem5

问题描述

gem5 内置了对 GDB 远程调试器接口的支持。我想使用远程 gdb 和 Gem5(在 se 模式下)调试一个非常小的代码

如下图所示,我要调试的程序(仅用于测试)有一个 scanf 语句来读取用户的值。但是,当我在 gdb(在主机上)中键入 cont 时,程序(在 Gem5 中的模拟机器上)不会在此语句处停止输入值。即使我在这条语句上设置了断点,gem5 上的程序也不会停止(使我能够输入 int 变量的值)并完成其工作。 正如我们从 gem5 的输出中看到的那样...... int 变量的值是随机分配的。 这里的真正问题是什么?是因为 scanf 声明吗?还是我做错了什么?! 如何与 Gem5 一起使用远程 gdb?

enter image description here

主机和模拟机都是x86(不需要跨gdb)

不管scanf我有一个非常简单的程序,其中包含三个打印指令。我在第三条打印指令处设置了一个断点,host 和 Gem5 上的程序都在此时停止。当我在主机上 cont 程序时,它会继续正常工作,但在 gem5 上,程序卡住了,无法继续。

跨gdb

以上工作是使用 x86 作为主机和 x86-Gem5 进行的。现在我想测试跨gdb。在我的主机上,我安装了 Gem5 中使用 ARM 模拟机所需的所有交叉工具(gcc、g++ 和 gdb)。 我从主机启动 gdb 并输入以下命令:

gdb-multiarch
file arm_test // a sample code compiled using arm-gcc cross compiler
set architecture arm
set b main
target remote localhost:7000
c

当我在输入 c (cont) 后按 Enter 键时,Gem5 上的程序不会在 main 处停止(因为我在那里设置了断点)并且它完成了工作,打印了 hello world 并退出。 在 Gem5 上,我看到一条警告消息说:warn: Invalid breakpoint length

更新

我使用以下 GDB 标志来计算和检查从 Gem5 传输到(主机 gdb)的数据,反之亦然。

--debug-flag=GDBSend,GDBRecv,GDBMisc

如下图所示

enter image description here

当我在位于地址偏移量 (breakpoint) 的代码中的特定位置(比如函数调用)设置 1031e 时......一堆信息被发送到 Gem5,因为它是从图片中清除:

0: system.remote_gdb: recv:  m1031e,2 // receive
0: system.remote_gdb: send:  fff7    // send what ???
0: system.remote_gdb: recv:  Z0,1031e,3 // receive

我希望有人帮助我并解释“Z0,3”的真正含义是什么?我知道 gem5 已从(主机 gdb)接收到数据,该数据告诉它在位于偏移量 1031e 的指令处设置断点。但是这里的数字三是什么意思?

因为我认为这是问题的主要原因;当我在 (host gdb) 上点击 cont 时,gem5 端的程序永远不会停止并使用提到的警告消息完成它的工作:warn: Invalid breakpoint length

有效长度是多少?以及如何调整?

如果我在另一个位置设置了 bp(比如在 printf 指令的位置),我也会出错。

0: system.remote_gdb: set software breakpoint,addr=0x1030a,len=2
warn: Invalid breakpoint length

请提供任何帮助或建议!

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)