gdbserver使用教程

1 篇文章 0 订阅

介绍与使用

gdbserver 是一个程序,它允许您在与运行被调试程序的机器不同的机器上运行 GDB

即gdb和被调试程序分别在两个机器上运行。

 

·用法(服务器(目标)端)

首先,您需要将要调试的程序的拷贝放到目标系统上。 如果需要,可以剥离程序以节省空间,因为 gdbserver 不关心符号。 所有符号处理都由运行在主机系统上的 GDB 负责

要使用服务器,您登录到目标系统,然后运行 gdbserver 程序。 您必须告诉它 (a) 如何与 GDB 通信,(b) 程序的名称,以及 (c) 它的参数。 一般语法是:

target> gdbserver <comm> <program> [<args> ...]

例如,使用串行端口,您可能会说:

target> gdbserver /dev/com1 emacs foo.txt

这告诉 gdbserver 使用 foo.txt 的参数调试 emacs,并通过 /dev/com1 与 GDB 通信。 gdbserver 现在耐心等待主机 GDB 与其通信。

要使用 TCP 连接,您可以:

target> gdbserver host:2345 emacs foo.txt

这与上一个示例几乎相同,除了我们将通过 TCP 与“主机”GDB 通信。 “host:2345”参数意味着我们希望看到从“host”到本地 TCP 端口 2345 的 TCP 连接。(目前,“host”部分被忽略。)您可以为端口号选择任何数字 只要它不与目标系统上的任何现有 TCP 端口冲突。 在主机 GDB 的“target remote”命令中必须使用相同的端口号,稍后将对此进行描述。 请注意,如果您选择的端口号与其他服务冲突,gdbserver 将打印错误消息并退出。

gdbserver 还可以attach到正在运行的程序。 这是通过 --attach 参数完成的。 语法是:

target> gdbserver --attach <comm> <pid>

pid 是当前正在运行的进程的进程 ID。 没有必要将 gdbserver 指向正在运行的进程的二进制文件

在不提供要运行的初始命令或要附加的进程 ID 的情况下启动“gdbserver”,请使用 --multi 命令行选项。 在这种情况下,您应该使用“target extended-remote”连接来启动您要调试的程序。

target> gdbserver --multi <comm>

·用法(主机端):

您需要主机系统上目标程序的未剥离副本,因为 GDB 需要检查它的符号表等。 像往常一样启动 GDB,将目标程序作为第一个参数。 (如果串行线路以除 9600 baud以外的任何速度运行,您可能需要使用 --baud 选项。)即“gdb TARGET-PROG”或“gdb --baud BAUD TARGET-PROG”。 之后,您需要了解的唯一新命令是“target remote”(或“target extended-remote”)。 它的参数要么是设备名称(通常是串行设备,如 /dev/ttyb),要么是“HOST:PORT”描述符

例如:

(gdb) target remote /dev/ttyb

通过串行线 /dev/ttyb 与服务器通信

(gdb) target remote the-target:2345

通过 TCP 连接与主机 `the-target' 上的端口 2345 进行通信,您之前使用相同的端口号启动了 gdbserver。 请注意,对于 TCP 连接,您必须在使用“target remote”命令之前启动 gdbserver,否则您可能会收到类似于“Connection refused”的错误。

gdbserver 也可以一次调试多个inferiors,如 GDB 手册中节点“Inferiors and Programs”--shell 命令“info -f gdb -n 'Inferiors and Programs'”中所述(?)。 在这种情况下,使用“扩展远程”GDB 命令变体:

(gdb) target extended-remote the-target:2345

在这种情况下,可能会或可能不会使用 gdbserver 选项 --multi。

如下例,gdbserver --multi 0.0.0.0:6666启动gdbserver,可以连接好多次。

 客户端如果使用target remote命令会报错,必须要用target extended-remote命令。

使用target extended-remote 192.168.150.171:7777就成功连上了。

但是又遇到一个问题,gdbserver上也要指定被调试的程序,不会自动把host上的可执行文件传输到gdbserver上。

gdb这边指定被调试程序有两种方法,在命令行启动gdb时使用gdb program来指定,或者直接gdb进入,然后使用命令file program来指定。

gdbserver指定被调试程序,在普通模式下是在命令行里指定的,如 gdbserver host:2345 prog

但是gdbserver --multi <comm>模式下,要通过gdb这边执行命令来指定,如下

使用set remote exec-file filename来指定gdbserver执行路径下的某个文件将被执行调试。

可以看到服务器这边成功执行调试了。

选项介绍

调用 gdbserver 有三种不同的模式:

·调试由其程序名称指定的特定程序:

gdbserver <comm> <prog> [<args>...]

comm 参数指定服务器应该如何与 GDB 通信; 它可以是设备名称(使用串行线路)、TCP 端口号(“:1234”)或“-”或“stdio”以使用“gdbserver”的标准输入/标准输出。 在 prog 中指定要调试的程序的名称 任何剩余的参数都将逐字传递给程序。 当程序退出时,GDB 将关闭连接,“gdbserver”将退出

 

·通过指定正在运行的程序的进程 ID 来调试特定程序:

gdbserver --attach <comm> <pid>

comm 参数如上所述。 在 pid 中提供正在运行的程序的进程 ID; GDB 会做其他所有事情。 与之前的模式一样,当进程 pid 退出时,GDB 将关闭连接,“gdbserver”将退出

·多进程模式——调试多个程序/进程:

 gdbserver --multi <comm>

在这种模式下,GDB 可以指示 gdbserver 运行哪些命令。 与其他 2 种模式不同,GDB 在被调试进程退出时不会关闭连接,因此您可以在同一个会话中调试多个进程

各种模式里会用到如下这些选项:

--attach

gdbserver 将附加到正在运行的程序。 语法是:

target> gdbserver --attach <comm> <pid>

pid 是当前正在运行的进程的进程 ID。 没有必要将 gdbserver 指向正在运行的进程的二进制文件。

--multi

要在不提供要运行的初始命令或要附加的进程 ID 的情况下启动“gdbserver”,请使用此命令行选项。 然后您可以使用“target extended-remote”连接并启动您要调试的程序。 语法是:

target> gdbserver --multi <comm>

--debug

指示“gdbserver”显示有关调试过程的额外状态信息。 此选项用于“gdbserver”开发和向开发人员报告错误。

--remote-debug

指示“gdbserver”显示远程协议调试输出。 此选项用于“gdbserver”开发和向开发人员报告错误。

--debug-format=option1[,option2,...]

指示“gdbserver”在调试输出的每一行中包含额外信息。

--wrapper

指定一个包装器wrapper来启动程序进行调试。 该选项后面应该是包装器的名称,然后是要传递给包装器的任何命令行参数,然后是“--”表示包装器参数的结尾。

--once

默认情况下,gdbserver 保持侦听 TCP 端口打开,以便可以进行其他连接。 但是,如果您使用 --once 选项启动“gdbserver”,它将在连接到第一个 GDB 会话后停止侦听任何进一步的连接尝试

使用multi参数下,gdbserver不会自动关闭,gdb客户端断开连接了它也不会终止,只有使用once参数时,它才会在第一个gdb客户端端口连接后自动关闭。

 

  • 14
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用Python绘制混淆矩阵,可以使用sklearn.metrics包中的confusion_matrix函数。首先,需要将预测结果和真实标签以类似的格式赋值给y_pred和y_true变量。然后,可以使用confusion_matrix函数生成混淆矩阵C,可以通过labels参数指定类别的标签。接下来,可以使用matplotlib.pyplot中的函数绘制矩阵图,使用plt.matshow(C, cmap=plt.cm.Reds)来展示混淆矩阵的颜色。可以使用plt.annotate函数在矩阵图中显示每个元素的值。最后,可以使用plt.xlabel和plt.ylabel函数设置x轴和y轴的标签。最后,使用plt.show函数显示绘制好的混淆矩阵图。 [1 [2] 示例代码如下: ```python from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt y_pred = [] # 预测结果 y_true = [] # 真实标签 C = confusion_matrix(y_true, y_pred, labels=['0','1','2','3','4']) plt.matshow(C, cmap=plt.cm.Reds) for i in range(len(C)): for j in range(len(C)): plt.annotate(C[j, i], xy=(i, j), horizontalalignment='center', verticalalignment='center') plt.ylabel('True label') plt.xlabel('Predicted label') plt.show() ``` 这段代码会根据给定的预测结果和真实标签生成混淆矩阵,并使用矩阵图展示混淆矩阵的颜色。每个元素表示预测为某个类别的样本数量。通过调整代码中的参数和标签,可以根据不同的需求进行自定义。 [1 [2 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [详解使用python绘制混淆矩阵(confusion_matrix)](https://download.csdn.net/download/weixin_38580959/12861679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [利用python绘制混淆矩阵](https://blog.csdn.net/weixin_43818631/article/details/121309660)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值