Hexagon GDB Debugger介绍(30)
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
列出所有文件扩展名和相关语言。