Node.js技术原理分析系列——Node.js调试能力分析
本文由体验技术团队屈金雄原创。
Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序、网络应用、命令行工具等。
本系列将分为9篇文章为大家介绍 Node.js 技术原理:从调试能力分析到内置模块新增,从性能分析工具 perf_hooks 的用法到 Chrome DevTools 的性能问题剖析,再到 ABI 稳定的理解、基于 V8 封装 JavaScript 运行时、模块加载方式探究、内置模块外置以及 Node.js addon 的全面解读等主题,每一篇都干货满满。
本文内容为本系列第1篇,以下为正文内容。
inspector 是什么
直接取官方文档中,对 inspector 的定义:
The node:inspector module provides an API for interacting with the V8 inspector.
翻译过来就是,inspector 模块提供了一组用于和 V8 inspector 交互的 API 。
解读:
- node inspector 是 Node.js 内置模块
- node inspector 仅提供与 V8 inspector 交互的能力,其本身并没有调试能力
- Node.js 调试能力来自 V8 inspector
Node.js 调试原理
调试的目的是通过观察运行时数据来定位问题。Node.js 的运行时数据由 V8 引擎管理,为了实现调试功能,V8封装了一套 api 供外部查看运行时数据,这套 api 名字就是 V8 inspector(运行时是一个 websocket 服务)。V8 inspector 由于调试协议不同,不能直接与 Chrome DevTools 交互,于是 Node.js 提供了 inspector 模块,运行时也会启动一个 websocket 服务,用于适配。
如图所示,进入 Node.js 调试模式前,主线程需要创建一个 debugger server( websocket 服务,即时通讯服务,也即 node inspector ),用来实现 debugger client(例如 vscode 调试器或 Chrome DevTools ) 与 V8 inspector 通信,V8 inspector 再获取 Node.js 服务的数据,最终实现单步调试等功能。
经过封装与简化后,launch 模式启动调试时我们甚至感知不到 debugger server 了,但是它一定是存在的。
深入分析 – inspect 参数
分析过程中,我对相关源码做了粗读,除了源码本身,还参考了这篇文章:https://theanarkh.github.io/understand-nodejs/chapter24-Inspector/#11
本文使用的 Node.js 源码是 18.20.2
如上图所示,表示的是 Node.js 调试模式启动过程,大部分节点都是中文表述+函数名。
当我们用 node --inspect test.js 启动一个 js 脚本时,程序会启动 debugger server(一个 websocket 服务)。如上图所示,相关逻辑都在初始化 inspector 部分(蓝色节点),接下来细看一下这部分代码。
下图的起始节点 server.Start() 函数就是上图的末端节点 server.Start()。
图中每一个节点都对应一个函数。无需理解所有节点,我们重点关注着色的几个节点。
1.第一个蓝色节点
当我们运行 node --inspect test.js 命令,可以看到如下打印,打印的内容 Node.js 开发者一定都很熟悉。
Debugger listening on ws://127.0.0.1:9229/43b86c7c-e538-4d5c-98ba-3f5196d8e986
For help, see: https://nodejs.org/en/docs/inspector// 这一行是Node开发者写的业务代码的打印
Server running at http://127.0.0.1:3000/
这个蓝色节点已经是启动代码执行的最后一步了,第一个橙色节点之后的部分在处理连接请求,也就是说,当代码走到第一个蓝色节点时,已经成功启动了一个 websocket 服务。
通过前面的代码还能看出,这个 websocket 服务在新起的子线程上运行,正因如此,调试程序才可以在主线程出现异常而崩溃的情况下,记录发送异常信息数据。
2.第一个橙色节点
注意这个节点代表一个回调函数,这个函数在服务启动时并没有执行。
它的执行是由 debugger client(例如 vscode 调试器或 Chrome DevTools )发起的 http 请求触发的,这次是client发起的第一次请求。
这次请求,对 vscode 调试器来说,就是它的 attach 模式( launch模式是把启动和连接操作合并了);对Chrome DevTools 来说,感觉上应该是通过轮询连接的,这个点暂时就不再深入研究了。
3.第二个橙色节点
client 紧接着会发第二次请求(未确认),请求头会携带 upgrade websocket 信息。这时会触发第二个橙色节点处的回调函数,当识别到是升级请求时,debugger server 才真正升级为 websocket 服务。
4.第二个蓝色节点
升级完成后,控制台会打印“Debugger attached.”,这也是我们调试时常见的控制台打印信息。
接下来,debugger server 就可以正常处理业务请求了。
5.特别关注一下红色节点
这里的代码就可以看出,debugger client 与 debugger server 建立连接的过程中,debugger server 与 V8 inspector 建立了连接。
其实整个初始化 inspector(启动 debugger server )的过程,是一套完整 websocket 实现,可以作为一个整体来看待。早期 Socket.io 模块是内置在 Node.js 中的。
– inspect-brk 参数
–inspect-brk 命令,可以在用户代码启动前中断,相当于在用户代码的第一行打了个断点。
如下图所示,我们用 node --inspect-brk test.js 命令启动服务。可以看到,只有 debugger server 启动成功的提示,没有 node 服务启动成功的提示。这是因为在执行用户代码前停住了。
这个命令在我们想要研究或调试 node 代码启动,又不知道研究对象启动入口位置时,比较有用
启动 debugger server 后,我们用连接上,这时可以看到执行停在了业务代码的第一行,而这一行我们并没有设置断点,如下图所示。
– inspect-wait 参数
这是 node 20 版本新增的启动参数,用于等待调试器连接后再执行代码。这样就可以从执行一开始就开始调试。
Node.js 三种常见的调试方式
本节的介绍,没有像其他网络教程那样手把手,step by step 地写清楚操作步骤,是因为有讲调试原理。
初学者理解本节的前提是先看懂调试原理。
一、vscode 调试
vscode 调试是 Node.js 开发者最推荐的调试方式,因为可以一键启动调试模式,可以不用像 Chrome DevTools 调试那样起额外的窗口。
vscode 调试 Node.js 分为 launch 和 attach 两种模式,这里先介绍一下 launch 模式。
launch 模式调试 Node.js
1.创建一个 Node.js 服务,就是 test.js 文件,内容如下:
const { createServer } = require('node:http');const hostname = '127.0.0.1';
const port = 3000;const server = createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');res.end('Hello World');
});server.listen(port, hostname, async () => {console.log(`Server running at http://${hostname}:${port}/`);
});
2.在 Node.js 服务入口文件所在的目录,点击 create a launch.json file 按钮,然后选择 Node.js 选项(这是选择调试器),vscode 会自动创建一个 launch.json 文件。
launch.json 文件内容如下,本场景就直接用自动生成的不需要作任何改动。
configurations 下的 request 字段表示的就是我们前面提到的调试模式,默认使用 launch 模式;name 表示这一套配置的名称,默认名称是 Launch Program,下一步会用到该名称;program 表示项目启动的入口文件。更多调试配置参考 vscode官网
{// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [{"type": "node","request": "launch","name": "Launch Program","skipFiles": [// "<node_internals>/**"],"program": "${workspaceFolder}\test.js"}]
}
如果用如上文件,屏蔽12行,设置了不跳过内部代码,还可以调试到Node.js的JS源码。
- 如下图所示,打断点,并选择 Launch Program,然后点击绿色三角,启动调试。
attach 模式调试 Node.js
顾名思义,这个模式不会触发 Node.js 和 debugger server 的启动,只会作为 debugger client 附加到已经启动的 Node.js 服务和debugger server 上。如果能理解前面讲的调试原理,这里就很好理解了。
1.首先我们要运行 node --inspect test.js,这是在启动 debugger server。
同时启动的还有 node 服务,也就是图中的 http://127.0.0.1:3000。
2.在 launch.json 文件中添加 attach 模式配置
port 字段表示要连接到的 debugger server 的端口号,也就是我们上一步的 9229。
address 字段表示 debugger server 的地址,也就是上一步的 ws://127.0.0.1;debugger server 在本地的话,可以省略该配置。
{// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [{"type": "node","request": "launch","name": "Launch Program","skipFiles": ["<node_internals>/**"],"program": "${workspaceFolder}\test.js"},{"type": "node","request": "attach","name": "Attach Program","port": 9229,// "address": "localhost",},]
}
3.上一步添加完 Attach Program 配置后,多了一个启动选项,如下图所示。选择 Attach Program,然后点击绿色三角按钮,启动调试,即可连接上第一步启动的 debugger server。
远程调试
attach模式本地调试不常用,通常用于远程调试。目前vscode官方提供了两种远程调试方案:
- 使用远程开发扩展包(官方推荐)
这个方案不仅能远程调试,还能用于远程开发,比如我们有时可能需要在本地Windows机器上编辑远程的Linux服务器上的项目。但是要安装一系列插件,有些复杂
- attach模式连接远程 debugger server
在前文的attach模式配置中,加一个address字段,填上远程debugger server的IP地址即可。
二、Chrome DevTools 调试
当我们理解了 Node.js 调试原理,Chrome DevTools 调试就变得手到擒来。
1.首先我们还是要运行 node --inspect test.js,这是在启动 debugger server。
同时启动的还有 node 服务,也就是图中的 http://127.0.0.1:3000
2.接下来再打开 chrome 控制台,就能看见 Node.js 的图标。注意没有启动 debugger server 的时候,图标是不会出现的。点击它,就可以打开 Chrome DevTools。
3.首次打开 DevTools 时,需要在 Connection tab 页配置准备连接的 debugger server。
可以看到 DevTools 自带了两个地址,如果是 debugger server 是在本地启动,并且使用的是默认的 9229 端口,就不需要添加连接地址了。
4.DevTools 连接 debugger server
之前有过介绍,vscode 连接 debugger server 需要用 attach 模式启动调试。
DevTools 这边在完成配置后,不需要任何操作就能自动连上 debugger server。(大概)是因为 DevTools 会轮询所配置的地址。
连接成功后,会触发node服务打印“Debugger attached.”提示语。
5.开始调试
我们切到 Sources tab 页,发现已经有了要调试的代码。在需要的位置打断点,再触发断点,即可调试。
例如下图中,断点位置的代码是请求处理代码,我们只需要访问一下 http://127.0.0.1:3000 这个地址,即可触发断点。
三、命令行调试
命令行调试是没有客户端之前的方式,现在一般不用,但是如果需要在不方便使用前面介绍的两种方式的情况下,例如需要在服务器本地调试,可以用命令行调试。
我们把命令的双横杠去掉,也就是运行 node inspect test.js 命令,结果如下图所示:
我们进入到了Node.js的命令行调试模式,具体的用法参考官方文档的 Debug部分。
接下来贴一些常用命令用法:
步进#
- cont, c:继续执行
- next, n:下一步
- step,s: 进入方法内部
- out, o:退出当前方法
- pause:暂停正在运行的代码(类似开发者工具中的暂停按钮)
断点#
- setBreakpoint(), sb():在当前行设置断点
- setBreakpoint(line), sb(line):在特定行设置断点
- setBreakpoint(‘fn()’), sb(…):在函数主体的第一个语句上设置断点
- setBreakpoint(‘script.js’, 1), sb(…):在第一行设置断点 script.js
- setBreakpoint(‘script.js’, 1, ‘num < 4’), sb(…):在第一行设置条件断点script.js,仅当num < 4 计算结果为true
- clearBreakpoint(‘script.js’, 1), cb(…):清除script.js 第一行的断点
信息#
-
backtrace, bt:打印当前调用栈
-
list(5):列出脚本源代码以及 5 行上下文(前后 5 行)
-
watch(expr):将表达式添加到观察列表,注意表达式需用引号括起来,如watch(“test2”)
-
unwatch(expr):从观察列表中删除表达式
-
unwatch(index):从观察列表中删除特定索引处的表达式
-
watchers:列出所有观察者及其值(每个断点上自动列出)
-
repl:打开调试器的 repl,在调试脚本的上下文中查看数据或表达式
-
exec expr, p expr:在调试脚本的上下文中执行表达式并打印其值
-
profile:启动 CPU profiling session
-
profileEnd:停止当前 CPU profiling session
-
profiles:列出所有已完成的 CPU profiling session
-
profiles[n].save(filepath = ‘node.cpuprofile’):将 CPU profiling session以 JSON 格式保存到磁盘
-
takeHeapSnapshot(filepath = ‘node.heapsnapshot’):获取堆快照并以 JSON 格式保存到磁盘
注意一下,repl命令可以进入断点所在上下文,方便地查看数据或表达式:
inspector 模块的 API
Node.js 的 inspector 模块提供了一组 API,用于在运行时与 V8 引擎进行交互,调试和分析 Node.js 应用程序。
这些 API 使开发者可以通过编程方式启动调试会话、设置断点、执行调试命令、收集性能数据等。
这里仅详细介绍两个方法:
1.inspector.Session 类的 post 方法可以向 v8 inspector 发送消息(指令),获取各种信息。v8 inspector 能识别的指令可以在 Chrome DevTools Protocol 中查看
贴一份官网的示例,对该类的能力可见一斑。
import { Session } from'node:inspector/promises';
import fs from'node:fs';
const session = newSession();
session.connect();await session.post('Profiler.enable');
await session.post('Profiler.start');
// Invoke business logic under measurement here...// some time later...
const { profile } = await session.post('Profiler.stop');// Write profile to disk, upload, etc.
fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile));
2.inspector.open方法可以在节点启动后,以编程方式启动debugger server。
vscode有个通过进程id,attach到没有用–inspect模式启动的node服务的能力,大概就是通过该接口实现的,暂未确认。
下一节,我们将讲解如何在Node.js中新增一个内置模块,请大家持续关注本系列内容~学习完本系列,你将获得:
- 提升调试与性能优化能力
- 深入理解模块化与扩展机制
- 探索底层技术与定制化能力
关于OpenTiny
欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
OpenTiny 官网:https://opentiny.design/
OpenTiny 代码仓库:https://github.com/opentiny/
TinyVue 源码:https://github.com/opentiny/tiny-vue
TinyEngine 源码: https://github.com/opentiny/tiny-engine
欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI~ 如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~
相关文章:
Node.js技术原理分析系列——Node.js调试能力分析
本文由体验技术团队屈金雄原创。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应…...
网络基础 【UDP、TCP】
1.UDP 首先我们学习UDP和TCP协议 要从这三个问题入手 1.报头和有效载荷如何分离、有效载荷如何交付给上一层的协议?2.认识报头3.学习该协议周边的问题 UDP报头 UDP我们先从示意图来讲解,认识报头。 UDP协议首部有16位源端口号,16位目的端…...
python旅游推荐系统+爬虫+可视化(协同过滤算法)
✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术,以实现从网站抓取旅游数据、个性化推荐和直观展…...
数据结构 树的存储和遍历
一、树的定义 树的定义 树型结构是⼀类重要的⾮线性数据结构。 • 有⼀个特殊的结点,称为根结点,根结点没有前驱结点。 • 除根结点外,其余结点被分成M个互不相交的集合T1 、T2 、...、Tm T,其中每⼀个集合⼜是⼀棵树,…...
《解锁自然语言处理:让公众正确拥抱AI语言魔法》
在当今数字化浪潮中,自然语言处理(NLP)技术作为人工智能领域的璀璨明珠,正以惊人的速度融入我们的生活。从智能语音助手到智能客服,从机器翻译到内容创作辅助,NLP技术无处不在。然而,如同任何强…...
qt实习总结
创建一个滑动条 QSlider *slider new QSlider(Qt::Vertical); //创建一个垂直方向的 进度条 带有上下箭头的输入框 QSpinBox 提供了一个带有上下箭头的输入框 垂直 水平怎么说 horizontal vetical 布局知识 BtnLayout->addWidget(AmendBtn); BtnLayout->addWidg…...
HTTP的“对话”逻辑:请求与响应如何构建数据桥梁?
一、前言 作为现代互联网通信的基石,HTTP协议定义了客户端与服务器之间的“对话规则”。每一次网页加载、API调用或文件传输的背后,都离不开精心构造的HTTP请求与响应。请求中封装了用户的意图——从请求方法、资源路径到提交的数据;响应则承…...
Docker 镜像标签使用
写在前面 当使用命令 docker pull mysql 拉取镜像时,其实等价于如下命令 docker pull mysql:latest latest 是默认的标签,字面上理解为最新版本的镜像,实质上 latest 只是镜像的标签名称,跟具体某个版本号地位一样,…...
C#异步/多线程编程中Task对象强大的功能介绍。
在 C# 的异步编程中,Task 是一个非常重要的类,它表示一个异步操作。Task 类提供了许多方法,用于管理、控制和组合异步操作。以下是 Task 类中一些常用方法的详细讲解及其功能。 1. Task.Run 功能:将指定的代码块调度到线程池中异步…...
DDD聚合在 ASP.NET Core中的实现
在ASP.NET Core中实现DDD(领域驱动设计,Domain-Driven Design)聚合通常涉及到几个关键步骤,包括定义领域模型、实现领域服务、使用仓储模式等。以下是如何在ASP.NET Core应用中实现DDD聚合的一些步骤和示例。 1. 定义领域模型 首…...
docker push镜像到阿里云
阿里云账号 阿里云-计算,为了无法计算的价值 开通个人镜像容器 进入控制台,试用容器 实例列表界面 点击上图中的个人,个人版特性 创建个人版: 个人版实例界面: 设置密码 个人版实例: 创建镜像仓库 如上…...
移动通信发展史
概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通:成立于 2000 年…...
Transformer笔记
Transformer笔记 文章目录 Transformer笔记模型架构核心技术多头注意力机制概念数学概念单头注意力机制代码 基于位置的前馈网络残差连接和层规范化 编码器解码器 特点:Transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络。之前Transforme…...
【学习资源】时间序列数据分析方法(1)
时间序列数据分析是一个有趣的话题,让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法:信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…...
PHP 文件与目录操作
PHP 学习资料 PHP 学习资料 PHP 学习资料 在 PHP 编程中,文件与目录操作是一项基础且重要的技能。无论是处理用户上传文件、生成日志,还是管理项目中的各类资源,都离不开对文件和目录的操作。PHP 提供了丰富的内置函数,方便开发…...
PostgreSQL认证指南
PostgreSQL 作为一款强大的开源关系型数据库,深受开发者和企业的青睐。获得 PostgreSQL 专家认证,不仅能提升个人在数据库领域的专业能力,还能为职业发展增添有力筹码。下面为大家详细介绍 PostgreSQL 专家认证的学习路径。 一、深入理解基础…...
hive全量迁移脚本
#!/bin/bash #场景:数据在同一库下,并且hive是内部表(前缀的hdfs地址是相同的)#1.读取一个文件,获取表名#echo "时间$dt_jian_2-------------------------" >> /home/hadoop/qianyi_zengliang/rs.txt#…...
Qt5开发入门指南:从零开始掌握跨平台开发
目录 Qt框架概述 开发环境搭建 基础语法与核心机制 第一个Qt窗口程序 常见问题解答 一、Qt框架概述 1.1 什么是Qt? Qt是一个1995年由挪威Trolltech公司开发的跨平台C图形用户界面应用程序框架。最新Qt5版本主要包含: GUI模块:支持Wind…...
WPF的Prism框架的使用
安装Prism.DryIoc库: Prism的区域和模块化: 一个区域可以显示一个用户控件 一个模块就是一个项目,也就是一个类库 动态切换用户控件的案例: <Grid><Grid.RowDefinitions><RowDefinition Height"auto"…...
【机器学习】线性回归 线性回归模型的损失函数 MSE RMSE MAE R方
【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 线性回归模型的损失函数 V1.0损失函数的计算方法损失函数的分类MSE (Mean Squared Error)RMSE (Root Mea…...
服务器部署DeepSeek,通过Ollama+open-webui部署
1. 安装ollama 1.1. linux 安装 Ollama是目前常用的AI模式部署的第三方工具,能一键部署deepSeek Ollama官方网址https://ollama.com/ 选择Download下载对应的服务版本 服务器选择Linux,下面是下载代码 curl -fsSL https://ollama.com/install.…...
Java 大视界 -- 开源社区对 Java 大数据发展的推动与贡献(91)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
【Vue3源码解析】应用实例创建及页面渲染
下载源码 git clone https://github.com/vuejs/core.git写该文章时的Vue版本为: "version": "3.5.13",这里要注意 pnpm 的版本不能太低,我此时的版本为 9.15.4。更新 pnpm 版本: npm install -g pnpm然后安装依赖&…...
云原生AI Agent应用安全防护方案最佳实践(上)
当下,AI Agent代理是一种全新的构建动态和复杂业务场景工作流的方式,利用大语言模型(LLM)作为推理引擎。这些Agent代理应用能够将复杂的自然语言查询任务分解为多个可执行步骤,并结合迭代反馈循环和自省机制࿰…...
人工智能 - 主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉
AV-ALOHA 系统使用用于 AV 的 VR 耳机实现直观的数据收集,并且 用于作的 VR 控制器或引线臂。这有助于捕捉全身和头部 远程作我们的真实和模拟系统的运动,记录来自 6 个的视频 不同的摄像头,并为我们的 AV 仿制学习策略提供训练数据。 加州大…...
Ubuntu 下 systemd 介绍
系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 QEMU 通过网络实现…...
两个实用且热门的 Python 爬虫案例,结合动态/静态网页抓取和反爬策略,附带详细代码和实现说明
在这个瞬息万变的世界里,保持一颗探索的心,永远怀揣梦想前行。即使有时会迷失方向,也不要忘记内心深处那盏指引你前进的明灯。它代表着你的希望、你的信念以及对未来的无限憧憬。每一个不曾起舞的日子,都是对生命的辜负࿱…...
Softing线上研讨会 | 自研还是购买——用于自动化产品的工业以太网
| 线上研讨会时间:2025年1月27日 16:00~16:30 / 23:00~23:30 基于以太网的通信在工业自动化网络中的重要性日益增加。设备制造商正面临着一大挑战——如何快速、有效且经济地将工业以太网协议集成到其产品中。其中的关键问题包括:是否只需集成单一的工…...
Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常
1.问题描述 硬件: AGX Orin 在Jetpack 5.0.1和Jetpack 5.0.2上测试验证 图像分辨率在1920x720和1024x1920下图像采集正常 但是当采集图像分辨率为1924x720视频时,图像输出异常 像素格式:yuv_uyvy16 gstreamer命令如下 gst-launch-1.0 v4l2src device=/dev/video0 ! …...
从2025年起:数字化建站PHP 8.1应成为建站开发的基准线
在数字化浪潮席卷全球的今天,PHP语言仍然保持着Web开发领域的核心地位。根据W3Techs最新统计,PHP驱动着全球78.9%的已知服务端网站。当时间指向2025年,这个拥有28年历史的编程语言将迎来新的发展里程碑——PHP 8.1版本应成为网站开发的最低基准要求,这不仅是技术迭代的必然…...
电动汽车电池监测平台系统设计(论文+源码+图纸)
1总体设计 本次基于单片机的电池监测平台系统设计,其整个系统架构如图2.1所示,其采用STC89C52单片机作为控制器,结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统,在功能上可以实现电压、电流、…...
20240914 天翼物联 笔试
文章目录 1、行测知识1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.152、专业知识2.12.22.32.42.52.62.72.82.92.102.112.122.132.142.153、编程题3.13.2岗位:嵌入式开发工程师(上海) 题型:15 道行测知识,15 道专业知识,2 道编程题 注意:本文章暂无解析,谨慎分…...
前端高级面试题
以下是一些前端高级面试可能涉及到的内容: 一、前端工程化 如何构建一个适合大型团队的前端代码规范和构建流程? 答案: 代码规范方面: 使用ESLint结合Prettier来统一JavaScript和CSS(包括预处理器如Sass或Less)的语法风格。例如,规定变量命名采用驼峰命名法,函数名要有…...
【nvidia】NCCL禁用P2P后果权衡
通信bound还是计算bound? 计算bound场景: 模型参数量较小(如参数量未超出单卡显存容量,使用纯数据并行)或计算密度极高(如大batch size下的矩阵运算)时,A100的计算能力(…...
哈希表(C语言版)
文章目录 哈希表原理实现(无自动扩容功能)代码运行结果 分析应用 哈希表 如何统计一段文本中,小写字母出现的次数? 显然,我们可以用数组 int table[26] 来存储每个小写字母出现的次数,而且这样处理,效率奇高。假如我们想知道字…...
unity学习46:反向动力学IK
目录 1 正向动力学和反向动力学 1.1 正向动力学 1.2 反向动力学 1.3 实现目标 2 实现反向动力 2.1 先定义一个目标 2.2 动画层layer,需要加 IK pass 2.3 增加头部朝向代码 2.3.1 专门的IK方法 OnAnimatorIK(int layerIndex){} 2.3.2 增加朝向代码 2.4 …...
夜莺监控发布 v8.beta5 版本,优化 UI,新增接口认证方式便于鉴权
以防读者不了解夜莺,开头先做个介绍: 夜莺监控,英文名字 Nightingale,是一款侧重告警的监控类开源项目。类似 Grafana 的数据源集成方式,夜莺也是对接多种既有的数据源,不过 Grafana 侧重在可视化ÿ…...
asio的使用
1、下载 性能测试:https://github.com/huyuguang/asio_benchmark 2、基本使用 2.1 TCP 1、客户端: 2、服务端: 2.2 UDP单揪 boost的asio接收单路大数据量udp包的方法 1、发送: 2、接收: #include "Circled…...
PHP语法完全入门指南:从零开始掌握动态网页
本文专为零基础新手设计,通过5000字详细讲解带你系统学习PHP语法。包含环境搭建、基础语法、实战案例,并附20+代码示例。阅读后你将能独立开发简单动态网页! 一、PHP开发环境搭建(新手必看) 1.1 为什么需要搭建环境? PHP是服务器端脚本语言,需要运行在服务器环境中。推…...
WPF快速创建DeepSeek本地自己的客户端-基础思路版本
开发工具:VS 2015 开发环境:.Net 4.0 使用技术:WPF 本篇文章内容: 本地部署DeepSeek以后一般使用网页工具(如Chatbox)或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…...
Win7本地化部署deepseek-r1等大模型详解
参考链接 在Windows 7操作系统,基于llama.cpp本地化部署 deepseek-r1模型的方法 2025-02-08 2G内存Windows7运行deepseek-r1:1.5b 这两个链接写的可能不够详细,有同学私信问实现过程,这里进一步解释一下。 一、准备 需要准备的大模型、工具…...
分享一个解梦 Chrome 扩展 —— 周公 AI 解梦
一、插件简介 周公 AI 解梦是一款基于 Chrome 扩展的智能解梦工具,由灵机 AI 提供技术支持。它能运用先进的 AI 技术解析梦境含义,为用户提供便捷、智能的解梦服务。无论你是对梦境充满好奇,还是想从梦境中获取一些启示,这款插件都…...
国产Linux OS:网络性能调优关键内核参数
国产Linux OS:网络性能调优关键内核参数 参数列表 这些参数是Linux系统中用于网络性能调优的关键内核参数,它们控制了网络接口和TCP协议栈的行为。合理调整这些参数可以根据具体的应用场景和网络条件优化系统的网络性能。 sysctl net.core.rmem_max sy…...
DeepSeek接口联调(postman版)
第一步:获取API key 获取APIkeys链接https://platform.deepseek.com/api_keys 点击创建 API key 即可免费生成一个key值,别忘记保存。 第二步:找到deepseek官方接口文档 文档地址:https://api-docs.deepseek.com/zh-cn/ 第三步…...
算法19(力扣244)反转字符串
1、问题 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 2、示例 (1) 示例 1&a…...
Svelte 最新中文文档翻译(10)—— use: 与 Actions
前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte 以其独特的编…...
iptables网络安全服务详细使用
iptables防火墙概念说明 开源的基于数据包过滤的网络安全策略控制工具。 centos6.9 --- 默认防火墙工具软件iptables centos7 --- 默认防火墙工具软件firewalld(zone) iptables主要工作在OSI七层的二、三、四层,如果重新编译内核&…...
node.js + html调用ChatGPTApi实现Ai网站demo(带源码)
文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主,学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯,前面我写了多人实时对话demo、和视频转换demo,今天…...
Vue 3最新组件解析与实践指南:提升开发效率的利器
目录 引言 一、Vue 3核心组件特性解析 1. Composition API与组件逻辑复用 2. 内置组件与生命周期优化 3. 新一代UI组件库推荐 二、高级组件开发技巧 1. 插件化架构设计 2. 跨层级组件通信 三、性能优化实战 1. 惰性计算与缓存策略 2. 虚拟滚动与列表优化 3. Tree S…...
DeepSeek 助力 Vue 开发:打造丝滑的日期选择器(Date Picker),未使用第三方插件
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...