Hexagon GDB Debugger介绍(9)

240 篇文章 11 订阅

2.8.9 调试 RTOS 应用程序

当实时操作系统 (RTOS) 用作程序执行环境的一部分时,调试器可以显示与 RTOS 相关的信息。

info hexagon-rtos
显示 RTOS 线程信息。 对于每个内存保护域,列出以下信息:
a.地址空间标识符(asid)
b.软件线程数
c.线程信息

i.线程名称
ii. 软件线程数
iii.线程优先级值
iv. 正在运行的线程的线程号(TNUM)(可选)
v.线程状态(RUNNING、READY、WAITING、STOPPED、HAALTED)
vi. 线程被阻塞的 RTOS 资源(例如,互斥锁或消息通道)(如果状态为 WAITING )
vii.L4 等待代码(在括号中显示为线程状态值的后缀)

infohexadecimal-rtos 显示的信息示例:

asid: 1 Thread Counts: 0x5
Name: roottask, Thread no: 0x104001, Priority: 0xfb, Status:
WAITING(0xffffffff),
Name: qmutex_server, Thread no: 0x114001, Priority: 0xff,
Status: WAITING(0xffffffff),
Name: qmsgq_server, Thread no: 0x118001, Priority: 0xfd,
Status: WAITING(0xffffffff),
Name: qtimer_server, Thread no: 0x11c001, Priority: 0xfc,
Status: WAITING(0xffffffff),
Name: qtimer_int, Thread no: 0x120001, Priority: 0xfe,
Status: WAITING(0xffffffff),
asid: 2 Thread Counts: 0x1
Name: thread_test.reloc, Thread no: 0x10c001, Priority:
0x64, TNUM: 0, Status: RUNNING(0x2),
注意:
线程状态 STOPPED 表示该线程已被删除。 HALTED 表示发生了页面错误。
L4 等待代码主要用于调试 RTOS 内核。

info msg-channels

显示 RTOS 消息通道信息。 对于每个消息通道,列出以下信息:
❒ 频道 ID
❒ 连接到通道的消息队列
❒ 在通道上等待的接收线程

info msg-queue msgq_name

显示有关指定 RTOS 消息队列的信息。 对于指定的消息队列,列出以下信息:

❒ 消息队列优先级
❒ 队列中的最大消息大小
❒ 已连接消息通道的通道 ID
❒ 队列中的消息数
❒ 特定于消息的信息(类型、大小、缓冲区指针)

要获取消息队列的名称,请使用 info msg-channels 命令列出所有消息队列的名称。

info mutex mutex_ID

显示有关指定 RTOS 互斥锁的信息。 对于指定的互斥锁列表,以下信息:
❒ 互斥类型
❒ 持有互斥体的线程
❒ 互斥锁计数
❒ 等待互斥锁的线程

要获取互斥锁的 ID,请使用 info threads 命令列出线程被阻塞的互斥锁。 或者,打印传递给 RTOS 函数 qmutex_lock 或 qmutex_unlock 的互斥对象。

info timers

显示 RTOS 定时器信息。 对于每个计时器列出以下信息:
❒ 定时器类型(一次性或定期)
❒ 定时器到期前的剩余时间
❒ 有关定时器消息队列的信息

2.9 停止和继续

使用调试器的主要目的是让您可以在程序终止之前停止它; 或者,如果您的程序遇到问题,您可以调查并找出原因。

在调试器内部,您的程序可能会因多种原因而停止,例如断点或在调试器命令(例如 step )之后到达新行。 然后,您可以检查和更改变量、设置新断点或删除旧断点,然后继续执行。 通常,调试器显示的消息提供了对程序状态的充分解释; 您也可以随时明确请求此信息。

info program

显示有关程序状态的信息:程序是否正在运行,以及它为什么停止。

2.9.1 断点、观察点和捕捉点

只要到达程序中的某个点,断点就会使您的程序停止。 对于每个断点,您可以添加条件以更详细地控制程序是否停止。 您可以使用 break 命令及其变体(参见第 2.9.1.1 节)设置断点,以通过行号指定程序应该停止的位置、函数名称或程序中的确切地址。

您可以安排让程序中的值在调试器在断点处停止时自动显示。 见第 2.12.6 节。

您还可以安排在调试器在断点处停止时调用 Tcl 脚本函数。 见第 2.9.1.7 节。

在某些开发平台中,您可以在运行可执行文件之前在共享库中设置断点。 HP-UX 系统有一个小限制:您必须等到可执行文件运行才能在程序未直接调用的共享库例程(即作为 pthread_create 调用中的参数的例程)中设置断点。

观察点是一个特殊的断点,它在表达式的值发生变化时停止您的程序。 您必须使用不同的命令来设置观察点(请参阅第 2.9.1.2 节)。 除此之外,您可以像管理任何其他断点一样管理观察点:使用相同的命令启用、禁用和删除断点和观察点。

捕获点是另一个特殊的断点,它在发生某种事件时停止您的程序,例如抛出 C++ 异常或加载库。与观察点一样,您可以使用不同的命令来设置捕获点(请参阅第 2.9.1.3 节)。与观察点一样,您可以像管理任何其他断点一样管理捕获点。

创建时,调试器会为每个断点、观察点或捕获点分配一个编号;这些数字是从 1 开始的连续整数。在许多用于控制断点各种功能的命令中,您使用断点编号来说明要更改哪个断点。每个断点都可以启用或禁用;如果禁用,它对您的程序没有影响,直到您再次启用它。

一些命令接受一系列要操作的断点。断点范围可以是单个断点编号,例如 5 ,也可以是两个这样的编号,按升序排列,由连字符分隔,例如 5-7 。当一个断点范围被赋予一个命令时,该范围内的所有断点都会被操作。

  • 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、付费专栏及课程。

余额充值