Hexagon GDB Debugger介绍(33)

240 篇文章 11 订阅
本文详细介绍了Hexagon GDB Debugger如何处理C和C++的常量,包括整数、浮点、枚举、字符和字符串,以及C++表达式的特性,如函数调用、重载解析和C++特有功能。同时涵盖了默认值设置、类型和范围检查等内容。
摘要由CSDN通过智能技术生成

2.15.4.3 C 和 C++ 常量

调试器允许您通过以下方式表达 C 和 C++ 的常量:

■整数常数是一串数字。 八进制常量由前导 0(即零)指定,十六进制常量由前导 0x 或 0X 指定。 常量也可以以字母 l 结尾,指定常量应被视为长值。

■ 浮点常量是一个数字序列,后跟一个小数点,后跟一个数字序列,还可以选择后跟一个指数。 指数的形式为:e[[+]|-] nnn,其中 nnn 是另一个数字序列。 + 对于正指数是可选的。 浮点常量也可以以字母 f 或 F 结尾,指定常量应被视为 float (与默认的 double 相对)类型; 或带有字母 l 或 L ,它指定一个 long double 常量。

■ 枚举常量由枚举标识符或其整数等效项组成。

■ 字符常量是由单引号 ( ’ ) 或数字包围的单个字符:相应字符的序数值(通常是其 ASCII 值)。 在引号内,单个字符可以用字母或转义序列表示,格式为 \nnn,其中 nnn 是字符序数值的八进制表示; 或形式 \x ,其中 x 是预定义的特殊字符,例如, \n 表示换行符。

■ 字符串常量是由双引号 ( " ) 包围的字符常量序列。任何有效的字符常量(如上所述)都可以出现。字符串中的双引号必须以反斜杠开头,例如 “a"b’ c” 是一个包含五个字符的字符串。

■ 指针常量是一个整数值。 您还可以使用 C 运算符 & 编写指向常量的指针。

■ 数组常量是用大括号 { 和 } 包围的逗号分隔列表; 例如,{1,2,3} 是一个三元素的整数数组,{{1,2}, {3,4}, {5,6}} 是一个三乘二的数组,而 {& “hi”, &“there”, &“fred”} 是一个三元素的指针数组。

2.15.4.4 C++ 表达式

调试器表达式处理可以解释大多数 C++ 表达式。
1.允许成员函数调用; 你可以使用像这样的表达

count = aml->GetOriginal(x, y)

2.当成员函数处于活动状态时(在选定的堆栈帧中),您的表达式与成员函数具有相同的可用命名空间; 也就是说,调试器允许隐式引用类实例指针 this 遵循与 C++ 相同的规则。

3.您可以调用重载函数; 调试器将函数调用解析为正确的定义,但有一些限制。 调试器不执行涉及用户定义类型转换、构造函数调用或程序中不存在的模板实例化的重载解析。 它也不能处理省略号参数列表或默认参数。

它确实执行整数转换和提升、浮点提升、算术转换、指针转换、类对象到基类的转换以及标准转换,例如函数或数组到指针的转换; 它需要与函数参数的数量完全匹配。
始终执行重载解析,除非您已指定 set重载解析 off 。 见第 2.15.4.8 节。

为了使用显式函数签名调用重载函数,您必须指定设置重载解析关闭,如

p 'foo(char,int)'('x', 13)

调试器命令完成工具可以简化这一点; 见第 2.5.3 节。

4.调试器理解声明为 C++ 引用的变量; 您可以像在 C++ 源代码中一样在表达式中使用它们; 它们会自动取消引用。 在调试器显示框架时显示的参数列表中,不显示引用变量的值(与其他变量不同); 这避免了混乱,因为引用通常用于大型结构。 引用变量的地址始终显示,除非您已指定 set print address off 。

5.调试器支持 C++ 名称解析运算符 ( :: ),您的表达式可以像程序中的表达式一样使用它。 由于一个作用域可以在另一个作用域中定义,如果需要,您可以重复使用 ::,例如在像 scope1 :: scope2 :: name 这样的表达式中。 在 C 和 C++ 调试中,调试器还允许通过引用源文件来解析名称范围(参见第 2.12.2 节)。

此外,与 HP 的 C++ 编译器一起使用时,调试器支持正确调用虚函数、打印出对象的虚基、调用基子对象中的函数、转换对象以及调用用户定义的运算符。

2.15.4.5 C 和 C++ 默认值

如果您允许调试器自动设置类型和范围检查,则只要工作语言更改为 C 或 C++,它们都会默认关闭。 无论您还是调试器选择工作语言,都会发生这种情况。

如果您允许调试器自动设置语言,它会识别名称以 .c 、 .C 或 .cc 等结尾的源文件,并且当调试器输入从这些文件之一编译的代码时,它会设置工作语言 到 C 或 C++。 有关更多详细信息,请参阅第 2.15.1.3 节。

2.15.4.6 C 和 C++ 类型和范围检查

默认情况下,当调试器解析 C 或 C++ 表达式时,不使用类型检查。 但是,如果打开类型检查,调试器会认为两个变量类型等效,如果:
■ 这两个变量是结构化的并且具有相同的结构、联合或枚举标记。
■ 两个变量具有相同的类型名称,或已通过 typedef 声明为等效的类型。

范围检查(如果打开)是在数学运算上完成的。 不检查数组索引,因为它们通常用于索引本身不是数组的指针。

2.15.4.7 调试器和 C

set print union 和 show print union 命令适用于联合类型。 设置为 on 时,还会打印结构或类内的任何联合。 否则,它显示为 {…} 。

@ 操作符有助于调试由指针和内存分配函数组成的动态数组。 见第 2.12.1 节。

2.15.4.8 C++ 的调试器功能

某些调试器功能和命令对于 C++ 特别有用,而有些是专门为与 C++ 一起使用而设计的。 这是一个总结

断点菜单(第 2.9.1.9 节)
当您希望在名称被重载的函数中设置断点时,调试器断点菜单可帮助您指定所需的函数定义。

rbreak regex
使用正则表达式设置断点有助于在不属于任何特殊类的重载函数上设置断点。 见第 2.9.1.1 节。

catch throw
catch catch
使用这些命令调试 C++ 异常处理。 见第 2.9.1.3 节。

ptype typename
显示类型 typename 的继承关系以及其他信息。参见第 2.16 节。

set print demangle
show print demangle
set print asm-demangle
show print asm-demangle

控制 C++ 符号是否以其源代码形式显示,无论是在将代码显示为 C++ 源代码时还是在显示反汇编时。 见第 2.12.7 节。

set print object
show print object

选择是否打印派生(实际)或声明类型的对象。 见第 2.12.7 节。

set print vtbl
show print vtbl

控制打印虚函数表的格式。 见第 2.12.7 节。 (vtbl 命令不适用于使用 HP ANSI C++ 编译器 (aCC) 编译的程序。)

set overload-resolution on
为 C++ 表达式计算启用重载解析。 默认为开启。 对于重载函数,调试器使用标准 C++ 转换规则(有关详细信息,请参阅第 2.15.4.4 节)评估参数并搜索签名与参数类型匹配的函数。 如果找不到匹配项,则会发出一条消息。

set overload-resolution off
禁用 C++ 表达式计算的重载解析。 对于不是类成员函数的重载函数,调试器选择它在符号表中找到的具有指定名称的第一个函数,无论其参数类型是否正确。 对于作为类成员函数的重载函数,调试器会搜索签名与参数类型完全匹配的函数。

重载的符号名称(第 2.5.3 节)

您可以使用在 C++ 中用于声明此类符号的相同符号来指定重载符号的特定定义:类型符号 ( types ) 而不仅仅是符号。 您还可以使用命令行完成工具列出可用选项或为您完成输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值