Golang-语言源码级调试器 Delve

前言
Go 目前的调试器有如下几种:
GDB最早期的调试工具,现在用的很少。LLDBmacOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。Delve专门为 Go 语言打造的调试工具,使用最为广泛。
本篇简单说明如何使用 Delve 工具来调试 Go 程序,使用的 delve 版本为 1.20.1。
delve 的汉语意思是:钻研、探索;用这个来命名一个debug工具还是非常的形象。
安装
已知以下说明适用于 Linux、macOS、Windows 和 FreeBSD。
克隆 git 存储库并构建:
$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv
或者,在 Go 版本 1.16 或更高版本上:
Install the latest release:
$ go install github.com/go-delve/delve/cmd/dlv@latest
Install at tree head:
$ go install github.com/go-delve/delve/cmd/dlv@master
安装在一个特定的版本或:
$ go install github.com/go-delve/delve/cmd/dlv@v1.7.3
$ go install github.com/go-delve/delve/cmd/dlv@v1.7.4-0.20211208103735-2f13672765fe
命令
Usage:dlv [command]Available Commands:attach 附加到正在运行的进程并开始调试.connect 使用终端客户端连接到无头调试服务器.core 检查核心转储.dap 启动一个通过调试适配器协议(DAP)通信的无头TCP服务器.debug 编译并开始调试当前目录中的主包或指定的包.exec 执行预编译的二进制文件,并开始调试会话.help Help about any commandrun 弃用的命令。使用'debug'代替.test 编译测试二进制文件并开始调试程序.trace 编译并开始跟踪程序.version Prints version.
[操作] 示例代码
下面是检查操作的代码
.test/
├── go.mod
├── main.go
└── main_test.go
module debug_samplego 1.18
main.go 执行以下处理:
package mainimport ("fmt"
)var abc stringfunc init() {abc = "wakuwaku bank"
}func add(a, b int) int {fmt.Printf("func add %v\n", abc)return a + b
}func sub(a, b int) int {fmt.Printf("func sub %v\n", abc)return a - b
}func calculate(a, b int) (addValue, subValue int) {addValue = add(a, b)subValue = sub(a, b)return addValue, subValue
}func sampleFunc1() {for i := 0; i < 10; i++ {a := i + 10b := iaddValue, subValue := calculate(a, b)fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)}
}func main() {sampleFunc1()
}
main_test.go 执行以下处理:
package mainimport "testing"func Test_add(t *testing.T) {type args struct {a intb int}tests := []struct {name stringargs argswant int}{{name: "Both positive values", args: args{10, 3}, want: 13}}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {if got := add(tt.args.a, tt.args.b); got != tt.want {t.Errorf("add() = %v, want %v", got, tt.want)}})}
}func Test_sub(t *testing.T) {type args struct {a intb int}tests := []struct {name stringargs argswant int}{{name: "Both positive values", args: args{10, 3}, want: 7}}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {if got := sub(tt.args.a, tt.args.b); got != tt.want {t.Errorf("sub() = %v, want %v", got, tt.want)}})}
}
[调试] dlv 调试
开始调试
$ dlv debug main.go
Type 'help' for list of commands.
(dlv)
检查功能/代码( funcs list )
funcs main\..* 查看 main 文件 所有定义的方法
(dlv) funcs main\..*
main.add
main.calculate
main.init.0
main.main
main.sampleFunc1
main.sub
runtime.main.func1
runtime.main.func2
list 您可以在以下位置查看某个方法源代码
(dlv) list main.main
Showing /debug_sample/main.go:38 (PC: 0x1029dda10)33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37: 38: func main() {39: sampleFunc1()40: }
(dlv) list main.sampleFunc1:3
Showing /debug_sample/main.go:32 (PC: 0x1029dd8c0)27: }28: 29: func sampleFunc1() {30: for i := 0; i < 10; i++ {31: a := i + 1032: b := i33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37:
设置/删除断点 ( break clear )
break 您可以使用以下命令设置断点
(dlv) break main.main
Breakpoint 1 set at 0x1029dda10 for main.main() ./main.go:38
(dlv) break main.sampleFunc1:3
Breakpoint 2 set at 0x1029dd8c0 for main.sampleFunc1() ./main.go:32
breakpoints 您可以检查中设置的断点。
(dlv) breakpoints
Breakpoint runtime-fatal-throw (enabled) at 0x10296c880 for runtime.throw() /Users/w/.gvm/gos/go1.18/src/runtime/panic.go:982 (0)
Breakpoint unrecovered-panic (enabled) at 0x10296cb90 for runtime.fatalpanic() /Users/w/.gvm/gos/go1.18/src/runtime/panic.go:1065 (0)print runtime.curg._panic.arg
Breakpoint 1 (enabled) at 0x1029dda10 for main.main() ./main.go:38 (0)
Breakpoint 2 (enabled) at 0x1029dd8c0 for main.sampleFunc1() ./main.go:32 (0)
clear 您可以使用 删除指定的断点。
(dlv) clear 1
Breakpoint 1 cleared at 0x1029dda10 for main.main() ./main.go:38
(dlv) breakpoints
Breakpoint runtime-fatal-throw (enabled) at 0x10296c880 for runtime.throw() /Users/w/.gvm/gos/go1.18/src/runtime/panic.go:982 (0)
Breakpoint unrecovered-panic (enabled) at 0x10296cb90 for runtime.fatalpanic() /Users/w/.gvm/gos/go1.18/src/runtime/panic.go:1065 (0)print runtime.curg._panic.arg
Breakpoint 2 (enabled) at 0x1029dd8c0 for main.sampleFunc1() ./main.go:32 (0)
clearall 删除所有断点。
(dlv) clearall
Breakpoint 1 cleared at 0x4986e6 for main.main() ./main.go:38
Breakpoint 5 cleared at 0x49858c for main.sampleFunc1() ./main.go:32
提前处理到断点( continue )
continue 让我们继续执行中设置的断点。
(dlv) continue
> main.sampleFunc1() ./main.go:32 (hits goroutine(1):1 total:1) (PC: 0x1029dd8c0)27: }28: 29: func sampleFunc1() {30: for i := 0; i < 10; i++ {31: a := i + 10
=> 32: b := i33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37:
continue 或者,您可以继续执行以下命令。
next
向前迈出一行(跨过)。
step
前进一行。
stepout
退出当前功能。
检查并覆盖变量 ( locals set )
[root@cdh2 test]# dlv debug main.go // 调试
Type 'help' for list of commands.(dlv) break main.sampleFunc1:3 // 设置断点
Breakpoint 1 set at 0x49858c for main.sampleFunc1() ./main.go:32(dlv) c // 跳到断点
> main.sampleFunc1() ./main.go:32 (hits goroutine(1):1 total:1) (PC: 0x49858c)27: }28:29: func sampleFunc1() {30: for i := 0; i < 10; i++ {31: a := i + 10
=> 32: b := i33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37:(dlv) locals // 打印局部变量
i = 0
a = 10(dlv) vars main.abc
main.abc = "wakuwaku bank"(dlv) print i
0
(dlv) print a
10(dlv) set i = 2 // 重新给变量赋值
(dlv) print i
2
堆栈跟踪显示( stack frame )
首先,要检查操作,请继续添加功能。
(dlv) break main.add
Breakpoint 3 set at 0x1029dd610 for main.add() ./main.go:13
(dlv) c
> main.add() ./main.go:13 (hits goroutine(1):1 total:1) (PC: 0x1029dd610)8: 9: func init() {10: abc = "wakuwaku bank"11: }12:
=> 13: func add(a, b int) int {14: fmt.Printf("func add %v\n", abc)15: return a + b16: }17: 18: func sub(a, b int) int {
显示堆栈跟踪
(dlv) stack
0 0x00000000004982aa in main.addat ./main.go:13
1 0x00000000004984df in main.calculateat ./main.go:24
2 0x00000000004985a5 in main.sampleFunc1at ./main.go:33
3 0x00000000004986f7 in main.mainat ./main.go:39
4 0x00000000004372d8 in runtime.mainat /root/.go/src/runtime/proc.go:250
5 0x0000000000461661 in runtime.goexitat /root/.go/src/runtime/asm_amd64.s:1571
frame 您可以通过指定堆栈跟踪编号来检查代码和变量
(dlv) frame 2 ls
Goroutine 1 frame 2 at /debug_sample/main.go:33 (PC: 0x1029dd8d0)28: 29: func sampleFunc1() {30: for i := 0; i < 10; i++ {31: a := i + 1032: b := i
=> 33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37: 38: func main() {
(dlv) frame 2 locals
i = 2
a = 10
b = 2
指定条件 ( condition )
首先,进行for语句的处理
$ dlv debug main.go
Type 'help' for list of commands.
(dlv) b main.sampleFunc1:3
Breakpoint 1 set at 0x1050958c0 for main.sampleFunc1() ./main.go:32
(dlv) c
> main.sampleFunc1() ./main.go:32 (hits goroutine(1):1 total:1) (PC: 0x1050958c0)27: }28: 29: func sampleFunc1() {30: for i := 0; i < 10; i++ {31: a := i + 10
=> 32: b := i33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37:
(dlv) locals
i = 0
a = 10
condition 您可以使用 设置断点条件。
i==5 让我们将其设置为停止时
(dlv) condition 1 i==5(dlv) c
func add wakuwaku bank
func sub wakuwaku bank
addValue: 10 subValue: 10
func add wakuwaku bank
func sub wakuwaku bank
addValue: 12 subValue: 10
func add wakuwaku bank
func sub wakuwaku bank
addValue: 14 subValue: 10
func add wakuwaku bank
func sub wakuwaku bank
addValue: 16 subValue: 10
func add wakuwaku bank
func sub wakuwaku bank
addValue: 18 subValue: 10
> main.sampleFunc1() ./main.go:32 (hits goroutine(1):2 total:2) (PC: 0x1050958c0)27: }28: 29: func sampleFunc1() {30: for i := 0; i < 10; i++ {31: a := i + 10
=> 32: b := i33: addValue, subValue := calculate(a, b)34: fmt.Printf("addValue: %v subValue: %v\n", addValue, subValue)35: }36: }37: (dlv) locals
i = 5
a = 15
调试结束( exit )
exit 您可以使用 完成调试。
(dlv) exit
[debug] dlv测试(调试测试)
dlv test 您可以使用以下命令调试您的测试代码
$ dlv test
Type 'help' for list of commands.
(dlv) funcs test.Test* // test.Test* test 包含 Xxx_test.go 文件夹
debug_sample.Test_add
debug_sample.Test_add.func1
debug_sample.Test_sub
debug_sample.Test_sub.func1(dlv) b test.Test_add
Breakpoint 1 set at 0x104891e90 for debug_sample.Test_add() ./main_test.go:5(dlv) c
> debug_sample.Test_add() ./main_test.go:5 (hits goroutine(4):1 total:1) (PC: 0x104891e90)1: package main2: 3: import "testing"4:
=> 5: func Test_add(t *testing.T) {6: type args struct {7: a int8: b int9: }10: tests := []struct {
[debug] dlv Attach(调试运行进程)
更正操作检查代码
对其进行修改以保持作为 Web 服务器运行,如下所示。
package mainimport ("fmt""net/http"
)var abc stringfunc init() {abc = "wakuwaku bank"
}func add(a, b int) int {fmt.Printf("func add %v\n", abc)return a + b
}func sub(a, b int) int {fmt.Printf("func sub %v\n", abc)return a - b
}func calculate(a, b int) (addValue, subValue int) {addValue = add(a, b)subValue = sub(a, b)return addValue, subValue
}func sampleFunc1(w http.ResponseWriter, r *http.Request) {for i := 0; i < 10; i++ {a := i * 2b := iaddValue, subValue := calculate(a, b)fmt.Fprintf(w, "addValue: %v subValue: %v\n", addValue, subValue)}
}func main() {http.HandleFunc("/sample_func_1", sampleFunc1)http.ListenAndServe(":80", nil)
}
启动。
$ go build
$ ./test
调试运行进程
检查进程 ID。
$ ps -ef | grep "test"
root 254882 56889 0 15:24 pts/2 00:00:00 ./test
root 257090 18100 0 15:25 pts/0 00:00:00 grep --color=auto test
调试
# dlv attach 254882
Type 'help' for list of commands.
(dlv)
设置断点并等待进程被调用。
(dlv) b main.sampleFunc1
Breakpoint 1 set at 0x1010e8470 for main.sampleFunc1() ./main.go:30(dlv) c
尝试在另一个控制台中向端点发出请求。
$ curl http://localhost/sample_func_1
处理在设置的断点处停止,如下所示。
(dlv) c
> main.sampleFunc1() ./main.go:30 (hits goroutine(21):1 total:1) (PC: 0x1010e8470)
Warning: debugging optimized function25: addValue = add(a, b)26: subValue = sub(a, b)27: return addValue, subValue28: }29:
=> 30: func sampleFunc1(w http.ResponseWriter, r *http.Request) {31: for i := 0; i < 10; i++ {32: a := i * 233: b := i34: addValue, subValue := calculate(a, b)35: fmt.Fprintf(w, "addValue: %v subValue: %v\n", addValue, subValue)
命令说明
以下是一些最常用的命令。
断点相关
| 命令 | 别名 | 解释 |
|---|---|---|
| break | b | 设置断点 |
| breakpoints | bp | 显示活动断点 |
| clear | 删除断点 | |
| clearall | 删除所有断点 | |
| condition | cond | 设置断点条件 |
继续
| 命令 | 别名 | 解释 |
|---|---|---|
| continue | c | 继续到“下一个断点”或“程序结束”或“指定点”。(例如 c main.add:1 ) |
| next | n | 向前迈出一行(跨过)。 |
| step | s | 前进一行。 |
| stepout | so | 退出当前功能。 |
| restart | 恢复该过程。 | |
| exit | q | 退出调试器。 |
其他的
| 命令 | 别名 | 解释 |
|---|---|---|
| funcs | 检查功能列表。(例如 funcs main…* ) | |
| list | l | 显示代码。(例如 l 10 l main.main:3 ) |
| locals | 检查局部变量。 | |
| vars | 检查包变量。 | |
| p | 评估一个表达式。 | |
| set | 覆盖变量。 | |
| stack | bt | 显示堆栈跟踪。 |
您还可以通过在调试过程中执行来查看如何使用其他命令 help
(dlv) help
The following commands are available:Running the program:call ------------------------ Resumes process, injecting a function call (EXPERIMENTAL!!!)continue (alias: c) --------- Run until breakpoint or program termination.next (alias: n) ------------- Step over to next source line.rebuild --------------------- Rebuild the target executable and restarts it. It does not work if the executable was not built by delve.restart (alias: r) ---------- Restart process.step (alias: s) ------------- Single step through program.step-instruction (alias: si) Single step a single cpu instruction.stepout (alias: so) --------- Step out of the current function.Manipulating breakpoints:break (alias: b) ------- Sets a breakpoint.breakpoints (alias: bp) Print out info for active breakpoints.clear ------------------ Deletes breakpoint.clearall --------------- Deletes multiple breakpoints.condition (alias: cond) Set breakpoint condition.on --------------------- Executes a command when a breakpoint is hit.toggle ----------------- Toggles on or off a breakpoint.trace (alias: t) ------- Set tracepoint.watch ------------------ Set watchpoint.Viewing program variables and memory:args ----------------- Print function arguments.display -------------- Print value of an expression every time the program stops.examinemem (alias: x) Examine raw memory at the given address.locals --------------- Print local variables.print (alias: p) ----- Evaluate an expression.regs ----------------- Print contents of CPU registers.set ------------------ Changes the value of a variable.vars ----------------- Print package variables.whatis --------------- Prints type of an expression.Listing and switching between threads and goroutines:goroutine (alias: gr) -- Shows or changes current goroutinegoroutines (alias: grs) List program goroutines.thread (alias: tr) ----- Switch to the specified thread.threads ---------------- Print out info for every traced thread.Viewing the call stack and selecting frames:deferred --------- Executes command in the context of a deferred call.down ------------- Move the current frame down.frame ------------ Set the current frame, or execute command on a different frame.stack (alias: bt) Print stack trace.up --------------- Move the current frame up.Other commands:config --------------------- Changes configuration parameters.disassemble (alias: disass) Disassembler.dump ----------------------- Creates a core dump from the current process stateedit (alias: ed) ----------- Open where you are in $DELVE_EDITOR or $EDITORexit (alias: quit | q) ----- Exit the debugger.funcs ---------------------- Print list of functions.help (alias: h) ------------ Prints the help message.libraries ------------------ List loaded dynamic librarieslist (alias: ls | l) ------- Show source code.source --------------------- Executes a file containing a list of delve commandssources -------------------- Print list of source files.transcript ----------------- Appends command output to a file.types ---------------------- Print list of typesType help followed by a command for full documentation.
参考
go-delve/delve:Delve 是 Go 编程语言的调试器
相关文章:
Golang-语言源码级调试器 Delve
前言 Go 目前的调试器有如下几种: GDB 最早期的调试工具,现在用的很少。LLDB macOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。Delve 专门为 Go 语言打造的调试工具,使用最为广泛。 本篇简单说明如何使用 Del…...
构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)
目录 案例概述 Cadvisor InfluxDBGrafana 1.1、 Cadvisor 1.2、InfluxDB 1.3、Grafana 1.4、监控组件架构 1.5、开始部署 安装docker-ce 阿里云镜像加速器 创建自定义网络 创建influxdb容器 案例概述 Docker作为目前十分出色的容器管理技术,得到大量企业…...
【Vue3】keep-alive 缓存组件
当在 Vue.js 中使用 <keep-alive> 组件时,它将会缓存动态组件,而不是每次渲染都销毁和重新创建它们。这对于需要在组件间快速切换并且保持组件状态的情况非常有用。 <keep-alive> 只能包含(或者说只能渲染)一个子组件…...
24成都信息工程大学809软件工程考研
1.渐增式与非渐增式各有何优、缺点?为什么通常采用渐增式? 非渐增式是将所有的模块一次连接起来,简单、易行、节省机时,但测试过程难于排错,发现错误也很难定位,测试效率低;渐增式是将模块一个…...
Filament for Android 编译搭建(基于Ubuntu20.04系统)
一、Filament 源代码下载 github下载地址: 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 ,sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …...
【MySQL--->数据库操作】
文章目录 [TOC](文章目录) 一、操作语句1.增2.删3.改4.查5.备份 二、字符集与校验规则 一、操作语句 1.增 语句格式:create database [if no exists]数据库名[create_specification [,create_specification] …]; 中括号内是可选项,if no exists是指如果数据库不存在就创建,存…...
PhotoShop2023 Beta AI版安装教程
从 Photoshop 开始,惊艳随之而来 从社交媒体贴子到修饰相片,设计横幅到精美网站,日常影像编辑到重新创造 – 无论什么创作,Photoshop 都可以让它变得更好。 Photoshop2023 Beta版本安装教程和软件下载 地址:点击…...
并发冲突导致流量放大的线上问题解决
事故现象 生产环境,转账相关请求失败量暴增。 直接原因 现网多个重试请求同时到达 svr,导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突,自动进行业务重试,服务内部也存在重试,导致流量放大。 转账 首先…...
Spring Cloud Gateway过滤器GlobalFilter详解
一、过滤器的场景 在springCloud架构中,网关是必不可少的组件,它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节,客户端只需要和网关进行交互。所以网关顾名思义,就是网络的一个关卡。它就是一座城的城门守卫。所以这个守…...
【LeetCode】1281.整数的各位积和之差
题目 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1: 输入:n 234 输出:15 解释: 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 9 结果 24 - 9 15示例 2&…...
22、springboot的Profile(通过yml配置文件配置 profile,快速切换项目的开发环境)
springboot的Profile ★ 何谓Profile 应用所在的运行环境发生切换时,配置文件常常就需要随之修改。Profile:——就是一组配置文件及组件的集合。可以整个应用在不同的profile之间切换(设置活动profile),整个应用都将使…...
2023-08-12力扣每日一题-暴力hard
链接: 23. 合并 K 个升序链表 题意: 如题 解: 时间668ms击败 5.00%使用 C 的用户/内存12.37mb击败 87.96%使用 C 的用户 循环选择插入新链表的节点,纯正的暴力,不过空间用得少 最坏应该是1E4*1E4,没…...
Mac安装nvm教程及使用
nvm 是 node 版本管理器,也就是说一个 nvm 可以管理多个 node 版本(包含 npm 与 npx),可以方便快捷的安装、切换 不同版本的 node。 1、直接通过brew安装 执行命令:brew install nvm PS: 如果没有安装br…...
左值引用和右值引用
目录 辨析引用和指针 代码段 定义引用变量的技巧 同一内存 指针和引用的简单运用 辨析两类指针 数组、指针、引用 辨析左值引用和右值引用 代码段 左值引用和右值引用 辨析引用和指针 1、引用是一种更安全的指针 说明:引用必须初始化,而指针可…...
JavaWeb 中对 HTTP 协议的学习
HTTP1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 Web核心 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.…...
06-hadoop集群搭建(root用户)
搭建Hadoop集群流程 环境准备 1、基础环境的搭建(内网封火墙关闭、主机名、规划好静态ip、hosts映射、时间同步ntp、jdk、ssh免密等) 2、Hadoop源码编译(为了适应不同操作系统间适配本地库、本地环境等) 3、Hadoop配置文件的修…...
MySQL 窗口函数是什么,有这么好用
先看这段像天书一样的 SQL ,看着就头疼。 SELECTs1.name,s1.subject,s1.score,sub.avg_score AS average_score_per_subject,(SELECT COUNT(DISTINCT s2.score) 1 FROM scores s2 WHERE s2.score > s1.score) AS score_rank FROM scores s1 JOIN (SELECT subject, AVG(sco…...
用户数据报协议UDP
UDP的格式 载荷存放的是:应用层完整的UDP数据报 报头结构: 源端口号:发出的信息的来源端口目的端口号:信息要到达的目的端口UDP长度:2个字节(16位),即UDP总长度为:2^16bit 2^10bit * 2^6bit 1KB * 64 64KB.所以一个UDP的最大长度为64KBUDP校验和:网络的传输并非稳定传输,…...
STM32F429IGT6使用CubeMX配置外部中断按键
1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…...
时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)
时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
