Hexagon GDB Debugger介绍(30)

240 篇文章 11 订阅

2.15 使用不同语言的调试器

尽管编程语言通常具有共同的方面,但它们很少以相同的方式表达。 例如,在 ANSI C 中,取消引用指针 p 是由 *p 完成的,但在 Modula-2 中,它是由 p^ 完成的。 值也可以以不同的方式表示(和显示)。 C 中的十六进制数显示为 0x1ae ,而在 Modula-2 中它们显示为 1AEH 。

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

2.15.1 源语言之间的切换

有两种方法可以控制工作语言;要么让调试器自动设置它,要么自己手动选择它。您可以将 set language 命令用于任一目的。启动时,调试器默认自动设置语言。工作语言用于确定如何解释您键入的表达式、如何打印值等。

除了工作语言之外,调试器知道的每个源文件都有自己的工作语言。对于某些目标文件格式,编译器可能会指示特定源文件所使用的语言。但是,大多数情况下,调试器会根据文件名推断语言。源文件的语言控制 C++ 名称是否被破坏;通过这种方式,回溯可以根据自己的语言适当地显示每个帧。无法从调试器中设置源文件的语言,但您可以设置与文件扩展名关联的语言。见第 2.15.2 节。

当您使用生成 C 但用另一种语言编写的程序(例如 cfront 或 f2c )时,这是最常见的问题。在这种情况下,让程序在其 C 输出中使用 #line 指令;这样,调试器将知道原始程序源代码的正确语言,并显示该源代码,而不是生成的 C 代码。

2.15.1.1 文件扩展名和语言列表

如果源文件名以以下扩展名之一结尾,则调试器会推断其语言是所指示的语言。
在这里插入图片描述
此外,您可以设置与文件扩展名关联的语言。 见第 2.15.2 节。

2.15.1.2 设置工作语言

如果您允许调试器自动设置语言,则表达式在调试会话和程序中的解释方式相同。

如果需要,您可以手动设置语言。 为此,请发出命令 set language lang,其中 lang 是语言的名称,例如 c 或 modula-2 。 要获得支持的语言列表,请键入 set language 。

手动设置语言可防止调试器自动更新工作语言。 如果您在工作语言与源语言不同的情况下尝试调试程序,这可能会导致混淆; 当一个表达对两种语言都可以接受但意味着不同的东西时。 例如,如果当前源文件是用 C 编写的,并且调试器正在解析 Modula-2,则命令如下:

print a = b + c

可能没有你想要的效果。 在 C 中,这意味着将 b 和 c 相加并将结果放入 a 中。 打印的结果将是 a 的值。 在 Modula-2 中,这意味着将 a 与 b+c 的结果进行比较,从而产生一个布尔值。

2.15.1.3 让调试器推断源语言

要让调试器自动设置工作语言,请使用 set language local 或 set language auto 。 然后调试器推断工作语言。 也就是说,当您的程序在某个帧中停止时(通常是遇到断点),调试器会将工作语言设置为该帧中为该函数记录的语言。 如果框架的语言未知(即,如果在没有可识别扩展名的源文件中定义了与该框架对应的函数或块),则不会更改当前工作语言,并且调试器会发出警告 .

对于完全用一种源语言编写的大多数程序来说,这似乎没有必要。 但是,以一种源语言编写的程序模块和库可以由以不同源语言编写的主程序使用。 在这种情况下使用 set language auto 使您不必手动设置工作语言。

2.15.2 显示语言

以下命令可帮助您找出工作语言是哪种语言以及源文件是用什么语言编写的。

show language
显示当前的工作语言。 这是您可以与命令(如打印)一起使用的语言,以构建和计算可能涉及程序中变量的表达式。

info frame
显示此框架的源语言。 如果您使用此框架中的标识符,则此语言将成为工作语言。 请参阅第 2.10.4 节以识别此处列出的其他信息。

info source
显示此源文件的源语言。 请参阅第 2.16 节以识别此处列出的其他信息。

在不寻常的情况下,您可能拥有扩展名不在标准列表中的源文件。 然后,您可以明确设置与语言关联的扩展名:

set extension-language .ext language
将扩展名为 .ext 的源文件设置为使用源语言。

info extensions
列出所有文件扩展名和相关语言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解关于接口的应用,以及如何使用接口来实现一个Shape类的Hexagon子类,是吗?我可以为您解答这个问题。 首先,接口是一种定义了一组方法的抽象类型,它们没有任何实现,只是规定了一些方法的签名。在Java中,我们可以使用interface关键字来定义一个接口。接口的作用是让不同的类可以实现相同的方法,从而实现不同的功能。 现在,我们来看一下如何使用接口来实现一个Shape类的Hexagon子类。首先,我们定义一个Shape接口,其中包含一个计算面积的方法和一个计算周长的方法: ``` public interface Shape { double getArea(); double getPerimeter(); } ``` 接下来,我们定义一个Hexagon类,它实现了Shape接口,并且重写了getArea()和getPerimeter()方法。Hexagon类的实现如下: ``` public class Hexagon implements Shape { private double side; public Hexagon(double side) { this.side = side; } public double getArea() { return 3 * Math.sqrt(3) * Math.pow(side, 2) / 2; } public double getPerimeter() { return 6 * side; } } ``` 在Hexagon类中,我们使用了一个私有变量来表示正六边形的边长,然后重写了Shape接口中的getArea()和getPerimeter()方法,计算出正六边形的面积和周长。 现在,我们可以使用Hexagon类来创建一个正六边形对象,并调用它的getArea()和getPerimeter()方法来获取它的面积和周长。例如: ``` Hexagon h = new Hexagon(5); double area = h.getArea(); double perimeter = h.getPerimeter(); System.out.println("Area: " + area); System.out.println("Perimeter: " + perimeter); ``` 这段代码将创建一个边长为5的正六边形对象,并打印出它的面积和周长。 希望我的解答对您有所帮助。如果您还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值