对比一下,嵌入式开发调试终端哪家强?

李肖遥 2023-09-11 22:08
    关注、星标公众号,直达精彩内容

来源 | 知乎 韦易笑

排版:strongerHuang

嵌入式开发都离不开调试工具,而市面上调试的工具有很多,但从兼容性和通用性来说,GDB绝对占据领先优势。

今天就来说说这个强大的 GDB 工具。

裸奔状态:原始的 GDB 命令行

穿上各种衣服前,至少得先学会裸奔,找份简单的 GDB cheat sheet 对照一下:

生产环境中出现崩溃时,因线上服务器一般没有开发环境,也无配套源代码,所以程序崩溃后,如果你懒得把 core 文件拖回到开发机检查,可以先在线上服务器先简单gdb看一下。

GDB命令密密麻麻,常用的也就表格上那几条,比如进去以后第一步先用 bt 查看一下调用栈,info local查看一下本地变量,再配合 up/down 在整个调用栈的不同层次之间上下移动一下,检查各处局部变量的值,print 一下某个表达式,即便没代码,看下符号和反汇编,一般也能调试个七七八八。

碰到复杂点的 BUG,必须配合源代码了,那你得把 core 文件拉到开发环境中,再用 gdb 对照源代码调试,配合 list [行号] 指令查看当前运行的源代码,再配合其他方法进行调试。

那么这时候,如果调试复杂度继续上升,你需要不断的断点,每次 next / step 单步完后你都需要 list 一下前后源代码,或者用 disassemble [函数名/地址] 查看一下指令的话,不少人会感觉到抓狂,这时我们需要给裸奔的 GDB 穿条内裤了。

穿上内裤:TUI

这是 gdb 自带的文本界面,使用 gdb -tui 命令启动,比如:

gdb -tui hello

即可打开我们的文本界面:

上方是源代码窗口,下面是 gdb 终端,窗口管理快捷键模仿 emacs,使用 c-x o 进行窗口切换,如果你还想查看指令窗口,可以输入:layout split

然后你单步的时候上面的源代码窗口会跟着滚动,比之前不停的 list 方便不少吧,要看前后源代码可以继续 c-x o 切换窗口后上下滚动。

有时候你 up/down 切换了栈帧后,上面的代码也许来不及更新,那么你用 update 指令,让上面的代码窗口定位到你最新的执行位置,有时也需要 CTRL-L 重绘下整个界面。

在 gdb 自带的 tui 模式中,你不但可以随时查看代码/指令,还可以查看寄存器。好吧,其实 gdb再简陋,本身还是配套了一条内裤的,只是很多人忘记拿出来穿了。

穿上内衣:gdbinit

如果上述文本 TUI的信息不够丰富的话,也许你会对 .gdbinit 感兴趣,~/.gdbinit 是一个 gdb配置脚本,可以设定一些由 python 编写的插件,比如 peda:

在 ~/.gdbinit 上面配置了 peda 后,可以看到命令提示符就从 (gdb) 变成了 gdb-peda$ 。每敲一个单步命令,peda 都会显示出无比丰富的信息,你还可以配置添加更多,配合高亮,你可以得到一个加强版的命令行。

不过这个我用的并不多,因为它会影响 TUI 模式的界面,我不喜欢在我的 gdb 里搞太多乱七八糟的东西。同时,当我们的调试需求继续变得更加复杂,你要不停的断点,频繁的单步,这些传统命令行里不停的输入各种指令显然已经让我们疲惫不堪了,能否直接在界面上查看源代码并且直接在代码上快捷键断点,快捷键单步呢?

可以啊,试试 cgdb。

穿上外套的:cgdb

CGDB 类似 gdb tui 分为终端窗口和代码窗口:

上面的代码窗口称为 cgdb mode, 下面的 gdb 窗口称为 gdb mode,调试就是不停的在两种模式间切换,按键模仿 vim,按 ESC 切换回 cgdb 模式,按 i 切换到 gdb 模式。

这看起来和 TUI gdb 差不多啊?除了语法高亮外它比 gdb tui 高效在哪里呢?答案是:大部分操作皆可在 cgdb mode 下(即源代码窗口)用快捷键操作。

方向键 或者 hjkl 移动光标,page-down/up 或 c-f / c-b 前后翻页,按 o键会列出当前可执行文件的源代码列表,可以切换查看其他相关代码文件,按 / 或者  可以进行文档搜索。

上面这些快捷键基本和 vim 对应,能让你方便的浏览源代码,同时在代码窗口可以用空格键来切换断点,还有其他一些快捷键:

  • F5 - Send a run command to GDB.
  • F6 - Send a continue command to GDB.
  • F7 - Send a finish command to GDB.
  • F8 - Send a next command to GDB.
  • F10 - Send a step command to GDB.

更多快捷键见【这里】,这下单步和断点比原来轻松多啦,你基本可以呆在源代码窗口里不出来,大部分时候不用再到 gdb 命令行里一条条 next/step 的输入了。

编辑一下 ~/.cgdb/cgdbrc ,简单调教下使用更方便:

set ignorecase
set ts=4
set wso=vertical
set eld=shortarrow
set hls
map  :until

这里大概设置了搜索大小写不敏感,tab 大小,分屏方式(默认改为左右分屏),搜索高亮,以及加了一个 F9 的快捷键,用于跳出循环(默认没有这个快捷键):

现在大家都是宽屏显示器了,默认改成左右分屏(要 cgdb 7.0才支持)舒服不少。

cgdb 还有更多功能,比如没有源文件时可以查看汇编,或者交叉查看源代码和汇编,设置 mark 等等,具体见它的官方文档吧。

这个小工具能将你从大量 gdb 命令行中解脱出来,配置文件还可以让你按喜好绑定各种命令到快捷键上。

穿戴整齐:Emacs GDB

CGDB 虽然大部分操作可以用快捷键进行,但是仍然有不少时候需要切换回右边的 gdb mode 中去敲命令,比如当你需要每单步一次就用 info local 查看一下局部变量或者 print 一下某个全局变量的值的时候,频繁的左右切换会让你疲于奔命。

所有在调试一些相对复杂的问题时,上面这些工具 hold 不住了,作用平时 Vim 写代码的人,我也从不拒绝用 emacs 的 gdb mode 来调试一些复杂问题,毫无疑问 emacs 是目前终端下最强的 GDB 前端。

从来没用过 emacs 都没关系,只要安装一个 emacs 记得下面几条命令就可以调试了:

  • 切换文件:c-x c-f (先按 ctrl_x 再按 ctrl_f),输入文件名时可以用 tab 补全
  • 移动光标:方向键,或者 c-f, c-b, c-p, c-n;翻页 pgup/down 或者 c-v / m-v
  • 切换缓存:c-x b 切换当前窗口里的缓存,c-x c-b 打开新窗口切换缓存。
  • 窗口操作:c-x o 窗口切换,c-x 2 / c-x 3 上下/左右分屏,c-x 0 / c-x 1 关闭 / 独占
  • 输入命令:m-x (按 ALT_x)输入命令可以用 tab 补全,c-g 退出命令输入。

当然,别忘记退出命令是 c-x c-c,这就够了,首先我们启动 emacs:

按下 m-x (alt+x),提示输入命令(如果终端软件 alt 键不灵,那可以设置一下终端软件,或者一秒内先按 ESC,再按 x键,在 xterm 终端下是等价的),键入 “gdb”敲回车:

下面会问你怎么运行gdb,输入gdb的 shell 启动命令行回车后开始 gdb 模式:

看到这里也许你会问,这和直接命令行 gdb 有区别么?别急,继续 m-x 输入命令:

gdb-many-windows

马上满足你:

这些 gud- 开头的命令都是 emacs gdb-mode 下通用调试器的操作命令,他们和 gdb 命令一一对应,可以用 m-x 输入这些命令,还可以直接用快捷键操作。

如果你想把某个窗口替换成反汇编或者寄存器的监控,那么可以用 m-x 输入:

gdb-display-disassembly-buffer

那么其中一个窗口就会被切换成反汇编窗口:

左上角的 gdb 终端被切换成反汇编窗口了,看完后记得 c-x b 切换回 gdb 控制台,如果你要避免某个窗口被切换走可以搜索 emacs 的 dedicated window。再者,我们可以自己用窗口管理快捷键按照我们的喜好拆分布局:

比如重新拆分了一下,把 gdb 终端挪到右边,输出窗口下面,把原来显示 gdb 终端的地方显示为反汇编。基本上你在 IDE 上见得到的调试手段,在 emacs 中都可以操作,并且 emacs 还可以在 Windows 下用 gdb 调试 mingw 的程序。

那么也许你会抱怨 emacs 下操作是在太麻烦了,没关系,稍微调教一下即可。

调教 emacs gdb-mode

打开 ~/.emacs (windows下是 ~/_emacs)文件,输入如下内容:

(global-set-key [M-left] 'windmove-left)
(global-set-key [M-right] '
windmove-right)
(global-set-key [M-up] 'windmove-up)
(global-set-key [M-down] '
windmove-down)

(global-set-key [f5] 'gud-run)
(global-set-key [S-f5] '
gud-cont)
(global-set-key [f6] 'gud-jump)
(global-set-key [S-f6] '
gud-print)
(global-set-key [f7] 'gud-step)
(global-set-key [f8] '
gud-next)
(global-set-key [S-f7] 'gud-stepi)
(global-set-key [S-f8] '
gud-nexti)
(global-set-key [f9] 'gud-break)
(global-set-key [S-f9] '
gud-remove)
(global-set-key [f10] 'gud-until)
(global-set-key [S-f10] '
gud-finish)

(global-set-key [f4] 'gud-up)
(global-set-key [S-f4] '
gud-down)

(setq gdb-many-windows t)

解释一下,最上面设定了 ALT + 方向键就可以在窗口中跳转,如果你终端 alt+方向不灵的话可以改成 C-left, C-right 等用 ctrl + 方向键移动窗口,后面设定了一些常用命令的快捷。

最后设置了默认打开 gdb-many-windows,最好增加下面一段,允许鼠标操作:

(require 'xt-mouse)
(xterm-mouse-mode)
(require '
mouse)
(xterm-mouse-mode t)
(defun track-mouse (e))

(setq mouse-wheel-follow-mouse 't)

(defvar alternating-scroll-down-next t)
(defvar alternating-scroll-up-next t)

(defun alternating-scroll-down-line ()
  (interactive "@")
    (when alternating-scroll-down-next
      (scroll-down-line))
    (setq alternating-scroll-down-next (not alternating-scroll-down-next)))

(defun alternating-scroll-up-line ()
  (interactive "@")
    (when alternating-scroll-up-next
      (scroll-up-line))
    (setq alternating-scroll-up-next (not alternating-scroll-up-next)))

(global-set-key (kbd "") '
alternating-scroll-down-line)
(global-set-key (kbd ""'alternating-scroll-up-line)

这下 xterm 下你可以自用的用鼠标点击切换窗口,点击按钮,用滚轮上下查看源代码了:

这下自由多了,ALT+方向或者鼠标点击,直接窗口跳转,并且用下面的命令操作:

  • F5 - 运行,Shift + F5 - 继续
  • F7/F8 代码级单步, 以及 Shift-F7/F8 指令级单步
  • F9 - 设置断点,Shift-F9 删除断点
  • F10 - 跳出循环,Shift-F10 跳出函数
  • F4 - 移动到上一个调用栈帧,Shift-F4移动到下一个

右上角的本地变量窗口上面有两个按钮,可以鼠标点击切换显示本地变量还是寄存器。右下角的也有两个按钮切换显示断点还是线程。最上面绿色部分的按钮也可以直接鼠标点击。

终于比我们最初的版本好用多了,如果你喜欢折腾的话,你还可以定制 gdb-many-windows 的初始格局,比如更复杂的:

彻底满足你各种复杂的调试需求,这里不展开了。

最后每次调试时打开 emacs, m-x输入 gdb 再键入文件名很麻烦?我们调教一下 .bashrc:

gdbtool () { emacs --eval "(gdb \"gdb --annotate=3 -i=mi $*\")";}

好了,终端下我们对要调试的程序只需要输入:

$ gdbtool hello

就能自动打开 emacs 并且切换到 gdb-mode 下面,展开我们的多窗口,开始调试了,是不是很愉快?

我平时调试没环境会先使用 gdb-tui 先看看,有环境或者问题复杂了我会打开 emacs 来调试。后来

给我介绍了 cgdb 以后,gdb-tui 就退役了,无环境先用 cgdb 看个大概,碰到复杂问题打开 emacs,经过一番调教,十分顺手。

让 GDB 变得更性感一些

其实到 emacs 已经差不多了,但如果你实在记不住这有限的几个快捷键或者 gdb 命令,那么还可以尝试一下 gdbgui:

python 开发的基于浏览器的 GDB 前端,pip 安装一下即可,使用时:

gdbgui --host 0.0.0.0 hello

就会监听本地 5000 端口,这时我们可以用浏览器打开服务器上的地址完全用鼠标进行调试。

中间是程序代码,下面是 GDB终端,上面可以切换源代码,可以控制运行/继续/单步等。右边可以实时查看:本地变量,调用栈帧,内存地址,断点,线程 等等。

比如上面的调用栈和线程查看,以及下面的自定义结构体查询:

还能可视化查询数据结构:

鼠标点击代码左边就可以设置/删除断点,点击上面的按钮就能切换显示汇编代码。基本上把 GDB的主要功能都用可视化的方式,现代的网页界面展示在你的面前,不需要记住任何快捷键,鼠标点点点就可以了。

同时,这个 gdbgui 还支持 Windows 下的 gdb 调试。目前 gdbgui 还在活跃的开发中,作为最漂亮的 gdb 前端,相信它会越来越强大。

总结

好了我们经历了从最开始 gdb 的命令行裸奔状态到终端下最完善的调试环境 emacs gdb-mode,再到性感的 gdbgui。GDB 的好处就在于对内可以引入各种插件,对外可以提供各种接口,自己做好调试的事情,前端界面可以完全交给其他程序来主导,不管是本地还是远程,所以才会有了各种各样丰富的 GDB Front End,还有各种远程 GDB 工具。

它不会限制你说你只能这样调试,或者你只有唯一的一种 UI可以操作,所以 GDB 的组合方式千千万万,用不着一谈 GDB 就觉得只有原始的敲命令一种用法,对吧?上面么多用法,随便选两样,花不了半小时,即可让你终端下的调试工作加快不少。

来源地址:https://zhuanlan.zhihu.com/p/32843449
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

李肖遥 公众号“技术让梦想更伟大”,作者:李肖遥,专注嵌入式,只推荐适合你的博文,干货,技术心得,与君共勉。
评论
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 54浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 36浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 168浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 68浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 53浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 86浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 115浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 63浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 55浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 57浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 45浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 172浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 184浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 121浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦