Hexagon GDB Debugger介绍(8)

简介 同时被 2 个专栏收录
132 篇文章 0 订阅
145 篇文章 1 订阅

2.8.5 程序工作目录

每次使用 run 启动程序时,它都会从调试器的当前工作目录继承其工作目录。 调试器工作目录最初是从其父进程(通常是 shell)继承的任何目录,但您可以在调试器中使用 cd 命令指定一个新的工作目录。

调试器工作目录还用作指定调试器将在其上运行的文件的命令的默认目录。 见第 2.18.1 节。

调试器工作目录还用作指定调试器将在其上运行的文件的命令的默认目录。 见第 2.18.1 节。

cd directory
将调试器工作目录设置为目录。

pwd
显示调试器工作目录。

2.8.6 程序输入输出

默认情况下,您在调试器下运行的程序对调试器使用的同一终端执行 I/O。 调试器将终端模式切换到自己的模式与您进行交互; 但是,它会记录您的程序使用的模式,并在您继续运行程序时切换回这些模式。

info terminal
显示有关您的程序正在使用的终端模式的信息。

您可以使用带有 run 命令的 shell 重定向来重定向程序的输入和/或输出。 例如:

run > outfil

这将启动您的程序,将其输出转移到文件 outfile。

tty file
重定向输入和输出。

另一种指定程序应该在哪里进行输入和输出的方法是使用 tty 命令。 该命令接受一个文件名作为参数,并使这个文件成为未来运行命令的默认文件。 例如:

tty /dev/ttyb

… 指示使用后续运行命令启动的进程默认在终端 /dev/ttyb 上进行输入和输出,并将其作为其控制终端。

run 中的显式重定向会覆盖 tty 命令对输入/输出设备的影响,但不会覆盖其对控制终端的影响。

当您在 run 命令中使用 tty 命令或重定向输入时,只会影响您程序的输入。 调试器的输入仍然来自您的终端。

2.8.7 终止程序进程

kill
终止程序在调试器下运行的进程。

如果要调试核心转储而不是正在运行的进程,kill 很有用。 当您的程序运行时,调试器会忽略任何核心转储文件。

如果您想重新编译和重新链接程序,它也很有用,因为在进程中运行时不可能更新可执行文件。 在这种情况下,当您下次键入 run 时,调试器会注意到文件已更改并重新读取符号表(同时尝试保留当前断点设置)。

2.8.8 多线程调试程序

单个程序在 Hexagon 处理器上可以有多个执行线程。

单个程序的线程类似于多个进程:除了它们共享一个地址空间(即它们都可以检查和修改相同的变量)。 另一方面,每个线程都有自己的寄存器和执行堆栈,可能还有私有内存。

调试器提供了以下用于调试多线程程序的功能和命令:

  • 新线程的自动通知
  • thread threadno - 在线程之间切换
  • infothreads——显示当前线程的摘要
  • info thread-details - 列出线程的属性
  • thread apply [threadno] [all] args —将命令应用于线程
  • 线程特定的断点

线程调试工具允许您在程序运行时观察所有线程; 然而,每当调试器取得控制权时,一个特定的线程总是调试的焦点。 该线程称为当前线程。 调试命令从当前线程的角度显示程序信息。

每当调试器在您的程序中检测到一个新线程时,它就会显示该线程的目标系统标识,并带有以下形式的消息:

[New Thread thread_no]

thread_no 是新软件线程的线程号。

注意:
硬件线程在调试器中不可见。

出于调试目的,调试器将其自己的线程编号(由增量计数器生成)与程序中的每个线程相关联。

thread threadno

使线程号 threadno 成为当前线程。 命令参数 threadno 是内部调试器线程号,如信息线程显示的第一个字段所示。 调试器通过显示您选择的线程的系统标识符及其当前堆栈帧摘要来响应:

(hexagon-gdb) thread 2
[Switching to thread 23]

与 [New …] 消息一样,切换到消息显示软件线程的线程编号。

info threads
显示程序中当前所有线程的摘要。 为每个线程显示以下信息:
a. 调试器分配的线程号
b. 软件线程数
c. 线程名称
d. 地址空间标识符(asid)
e. 软件线程号(十六进制格式)
f. 线程优先级值
g. 正在运行的线程的线程号 (TNUM)(可选)
h. 线程状态(运行、就绪、等待、停止、暂停)
i. 线程被阻塞的 RTOS 资源(例如,互斥或消息通道)(如果状态为等待)
j. L4 等待代码(在括号中显示为线程状态值的后缀)
k. 线程当前正在执行的源代码

信息线程显示的信息示例:

4 Thread 1277953 (Name: thread_5, asid: 2, Thread no:
0x138001, Priority: 0x6a, TNUM: 0x1, Status: RUNNING(0x2), )
0x00709be8 in fwrite ()
3 Thread 1261569 (Name: thread_4, asid: 2, Thread no:
0x134001, Priority: 0x69, Status: WAITING(0xffffffff),
blocked on MsgChannel ID=0x810608) 0x0070366c in L4_Ipc ()
at libs/l4/arch/hexagon/src/hexagon-syscalls.c:132
2 Thread 1245185 (Name: thread_3, asid: 2, Thread no:
0x130001, Priority: 0x68, Status: WAITING(0xffffffff),
blocked on MsgChannel ID=0x810608) 0x0070366c in L4_Ipc ()
at libs/l4/arch/hexagon/src/hexagon-syscalls.c:132
*1 Thread 1097729 (Name: qmsgq_t11.reloc, asid: 2, Thread
no: 0x10c001, Priority: 0x64, TNUM: 0, Status: RUNNING(0x2),
) main ()at
/prj/dsp/workspace/posix_port/test/regress/rtos/qmsgq_t11/qm
sgq_t11/
src/main.c:240

调试器线程号左侧的星号 (*) 表示当前线程。

注意:
线程状态 STOPPED 表示该线程已被删除。 HALTED 表示发生了页面错误。
非活动线程显示它们在进行内核调用之前在用户内存中执行的最后一个 PC 地址。
L4 等待代码主要用于调试 RTOS 内核。

info thread-details threadno
显示线程属性。 命令参数 threadno 是内部调试器线程号,如信息线程显示的第一个字段所示。 调试器通过显示您选择的线程的属性来响应。

thread apply [threadno] [all] args
thread apply 命令允许您将命令应用于一个或多个线程。 使用 threadno 命令参数指定要影响的线程数。 threadno 是内部调试器线程号,如信息线程显示的第一个字段所示。 要将命令应用于所有线程,请使用 thread apply all args。

每当调试器由于断点而停止您的程序时,它会自动选择发生该断点的线程。 它通过 [Switching to threadno ] 形式的消息提醒您上下文切换,以标识线程。

有关当您停止和启动多线程程序时调试器的行为方式的信息,请参阅第 2.9.4 节。

有关多线程程序中观察点的信息,请参阅第 2.9.1.2 节。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

weixin_38498942

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值