Hexagon GDB Debugger介绍(9)
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 。当一个断点范围被赋予一个命令时,该范围内的所有断点都会被操作。