gdb:类型转换取决于编译的语言

时间:2019-04-01 14:18:54

标签: gdb

我正在调试使用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是否需要将指令编译为目标机上运行的二进制语言的正确语言?

1 个答案:

答案 0 :(得分:2)

是的,这取决于语言,并且语言是从加载的源文件的文件名推导出来的。


引用the manual

  

print和许多其他GDB命令接受一个表达式并计算其值。 您使用的编程语言定义的任何常量,变量或运算符在GDB表达式中均有效。这包括条件表达式,函数调用,强制转换和字符串常量。

And

  

如果您不希望看到分配的值,请使用set命令而不是print命令。 setprint实际上相同,除了不打印表达式的值并且不将其放在值历史记录中(请参阅“值历史记录”)。仅对表达式的效果进行评估。

And

  

GDB内置了某些语言的特定于语言的信息,使您可以用程序的本机语言表达上述操作,并允许GDB以与程序的本机语法一致的方式输出值。 用于构建表达式的语言称为工作语言。

And

  

有两种方法可以控制工作语言-要么让GDB自动设置它,要么自己手动选择它。您可以将set language命令用于任一目的。启动时,GDB默认设置为自动设置语言。

     

[..] 大多数时候,GDB会从文件名中推断出语言。