我正在调试使用GDB(arm-none-eabi-gdb)在Rust中编译的程序。有一次,我想写一个如下的内存地址:
private class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String button = e.getActionCommand();
if (button.equals("Takeoff")) {
RobotModel.takeoff();
}
else if (button.equals("Land")) {
RobotModel.land();
}
else if(button.equals("Left")) {
RobotModel.left();
}
}
}
在多次尝试之后,我发现我正在转换C样式,并且不得不将其转换为Rust样式,如下所示:
(gdb) set *((int *) 0x24040000) = 0x0000CAFE
syntax error in expression, near `) 0x24040000) = 0x0000CAFE'.
我的问题是GDB如何解释不同的命令以及为什么会出现此错误。是因为不能识别符号(int),但是在这种情况下,gdb如何加载符号? gdb是否需要将指令编译为目标机上运行的二进制语言的正确语言?
答案 0 :(得分:2)
是的,这取决于语言,并且语言是从加载的源文件的文件名推导出来的。
引用the manual:
And:
如果您不希望看到分配的值,请使用
set
命令而不是set
与
And:
GDB内置了某些语言的特定于语言的信息,使您可以用程序的本机语言表达上述操作,并允许GDB以与程序的本机语法一致的方式输出值。 用于构建表达式的语言称为工作语言。
And:
有两种方法可以控制工作语言-要么让GDB自动设置它,要么自己手动选择它。您可以将set language命令用于任一目的。启动时,GDB默认设置为自动设置语言。
[..] 大多数时候,GDB会从文件名中推断出语言。