当前位置: 首页 > news >正文

【调试】GDB使用总结

启动

在shell下敲gdb命令即可启动gdb,启动后会显示下述信息,出现gdb提示符。

➜  example gdb                                
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb)

测试代码

#include <stdio.h>
int minus(int a,int b){printf("In minus():\n"); int c = a-b;return c;
}
int sum(int a, int b) {printf("In sum():\n");int c = a+b;return c;
}
void print(int xx, int *xxptr) {printf("In print():\n");printf("   xx is %d and is stored at %p.\n", xx, &xx);printf("   ptr points to %p which holds %d.\n", xxptr, *xxptr);int c = sum(2,3);int d = minus(3,2);
}int main(void) {int x = 10;int *ptr = &x;printf("In main():\n");printf("   x is %d and is stored at %p.\n", x, &x);printf("   ptr points to %p which holds %d.\n", ptr, *ptr);print(x, ptr);return 0;
}

设置断点

可以在函数名和行号等上设置断点。程序运行后,到达断点就会自动暂停运行。此时可以查看该时刻的变量值、显示栈帧、重新设置断点或重新运行等。断点命令(break)可以简写为b。

格式

break 断点

举例

(gdb) b main
Breakpoint 1 at 0x758: file gdb_example.c, line 9.

格式

break 函数名
break 行号
break 文件名:行号
break 文件名:函数名
break  + 偏移量
break  - 偏移量
break  * 地址

举例

(gdb) b print
Breakpoint 2 at 0x709: file gdb_example.c, line 4.
(gdb) b gdb_example.c:5
Breakpoint 3 at 0x715: file gdb_example.c, line 5.
(gdb) b +3
Note: breakpoint 2 also set at pc 0x709.
Breakpoint 4 at 0x709: file gdb_example.c, line 4.
(gdb) b *0x709
Note: breakpoints 2 and 4 also set at pc 0x709.
Breakpoint 5 at 0x709: file gdb_example.c, line 4.
(gdb)

上面的例子分别对print函数,gdb_example.c第5行,现在暂停位置往后第3行,地址0x709设置断点。

设置好的断点可以通过info break 确认

(gdb) info break
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000000758 in main at gdb_example.c:9
2       breakpoint     keep y   0x0000000000000709 in print at gdb_example.c:4
3       breakpoint     keep y   0x0000000000000715 in print at gdb_example.c:5
4       breakpoint     keep y   0x0000000000000709 in print at gdb_example.c:4
5       breakpoint     keep y   0x0000000000000709 in print at gdb_example.c:4

显示栈帧

backtrace命令可以在遇到断点而暂停执行时显示栈帧。该命令简写为bt。此外, backtrace的别名还有where和info stack(简写为info s)。

backtrace
bt

显示所有栈帧

backtrace N
bt N

只显示开头N个栈帧

backtrace -N
bt -N

只显示最后N个栈帧

backtrace full
bt full
backtrace full N
bt full N
backtrace full -N
bt full -N

举例

(gdb) b 4
Breakpoint 1 at 0x714: file gdb_example.c, line 4.
(gdb) r
Starting program: /home/zhongyi/code/example/gdb_example 
In main():x is 10 and is stored at 0x7fffffffe2fc.ptr points to 0x7fffffffe2fc which holds 10.
In print():xx is 10 and is stored at 0x7fffffffe2cc.ptr points to 0x7fffffffe2fc which holds 10.
In sum():
In minus():Breakpoint 1, minus (a=3, b=2) at gdb_example.c:4
4          int c = a-b;
# 显示栈帧
(gdb) bt
#0  minus (a=3, b=2) at gdb_example.c:4
#1  0x00005555555547c0 in print (xx=10, xxptr=0x7fffffffe2fc) at gdb_example.c:17
#2  0x0000555555554841 in main () at gdb_example.c:28
#只显示前2个栈帧
(gdb) bt 2
#0  minus (a=3, b=2) at gdb_example.c:4
#1  0x00005555555547c0 in print (xx=10, xxptr=0x7fffffffe2fc) at gdb_example.c:17
(More stack frames follow...)
# 从外向内显示2个栈帧,及其局部变量
(gdb) bt full -2
#1  0x00005555555547c0 in print (xx=10, xxptr=0x7fffffffe2fc) at gdb_example.c:17c = 5d = 21845
#2  0x0000555555554841 in main () at gdb_example.c:28x = 10ptr = 0x7fffffffe2fc
(gdb) 

显示栈帧后,就可以确认程序在何处停止,及程序的调用路径。

显示变量

格式

print 变量

举例

(gdb) p x
$1 = 10
(gdb) p ptr
$2 = (int *) 0x7fffffffe2fc
(gdb) 

显示寄存器

举例
(gdb) info reg
rax            0xc      12
rbx            0x0      0
rcx            0x7ffff7af2104   140737348837636
rdx            0x7ffff7dcf8c0   140737351841984
rsi            0x555555756260   93824994337376
rdi            0x1      1
rbp            0x7fffffffe310   0x7fffffffe310
rsp            0x7fffffffe2f0   0x7fffffffe2f0
r8             0x7ffff7fe14c0   140737354011840
r9             0x0      0
r10            0x0      0
r11            0x246    582
r12            0x5555555545f0   93824992232944
r13            0x7fffffffe3f0   140737488348144
r14            0x0      0
r15            0x0      0
rip            0x555555554841   0x555555554841 <main+123>
eflags         0x202    [ IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0

寄存器前加$,可以显示寄存器的内容。

(gdb) p $rdi
$7 = 1
(gdb) p $rax
$8 = 12
(gdb) 

显示寄存器可以用以下格式

p/格式 变量

格式说明
x显示为16进制数
d显示为十进制数
u显示为无符号十进制数
o显示为八进制数
t显示为二进制数
a地址
c显示为ascii
f浮点小数
s显示为字符串
i显示为机器语言(仅在显示内存的x命令中可用)

显示内存

x命令可以显示内存的内容

格式
x/格式 地址
举例
(gdb) x $r120x5555555545f0 <_start>:     xor    %ebp,%ebp
(gdb) x $r80x7ffff7fe14c0:      rclb   $0xf7,(%rsi,%rdi,8)
(gdb) 

x/i 可以显示汇编指令。一般用x命令时,格式为x/NFU ADDR。此处ADDR为希望显示的地址,N为重复次数。F为前面讲过的格式,u代表的单位如下。

单位说明
b字节
h半字(2字节)
w字(4字节)
g双字(8字节)

下面显示从rsp开始的10条指令。

(gdb) x/10i $rsp0x7fffffffe2f0:      (bad)  0x7fffffffe2f1:      rex.W push %rbp0x7fffffffe2f3:      push   %rbp0x7fffffffe2f4:      push   %rbp0x7fffffffe2f5:      push   %rbp0x7fffffffe2f6:      add    %al,(%rax)0x7fffffffe2f8:      lock rex.RB push %r130x7fffffffe2fb:      push   %rbp0x7fffffffe2fc:      or     (%rax),%al0x7fffffffe2fe:      add    %al,(%rax)

显示反汇编

格式
disassemble
disassemble 程序计数器
disassemble 开始地址 结束地址

格式1为反汇编当前整个函数,2为反汇编程序计数器所在函数的整个函数。3为反汇编从开始地址到结束地址的部分。

(gdb) disassemble 
Dump of assembler code for function sum:0x0000555555554722 <+0>:     push   %rbp0x0000555555554723 <+1>:     mov    %rsp,%rbp0x0000555555554726 <+4>:     sub    $0x20,%rsp0x000055555555472a <+8>:     mov    %edi,-0x14(%rbp)0x000055555555472d <+11>:    mov    %esi,-0x18(%rbp)0x0000555555554730 <+14>:    lea    0x1bd(%rip),%rdi        # 0x5555555548f40x0000555555554737 <+21>:    callq  0x5555555545b0 <puts@plt>
=> 0x000055555555473c <+26>:    mov    -0x14(%rbp),%edx0x000055555555473f <+29>:    mov    -0x18(%rbp),%eax0x0000555555554742 <+32>:    add    %edx,%eax0x0000555555554744 <+34>:    mov    %eax,-0x4(%rbp)0x0000555555554747 <+37>:    mov    -0x4(%rbp),%eax0x000055555555474a <+40>:    leaveq 0x000055555555474b <+41>:    retq   
End of assembler dump.

单步执行

执行源代码中的一行:next
进入函数内部执行:step
逐条执行汇编指令:nexti,stepi

继续运行

格式

continue
continue 次数

指定次数可以忽略断点,例如,continue 5 则5次遇到断点不会停止,第6次遇到断点才会停止。

监视点

格式

watch <表达式>

<表达式>发生变化时暂停运行,<表达式>意思是常量或变量

awatch <表达式>

<表达式>被访问,改变时暂停运行

rwatch <表达式>

<表达式>被访问时暂停运行

举例

(gdb) watch c
Hardware watchpoint 2: c
(gdb) c
Continuing.Hardware watchpoint 2: cOld value = 21845
New value = 5
sum (a=2, b=3) at gdb_example.c:10
10          return c;
(gdb) 

格式

删除断点和监视点

delete <编号>

<编号>指的是断点或监视点

举例

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000055555555473c in sum at gdb_example.c:9breakpoint already hit 1 time
2       hw watchpoint  keep y                      cbreakpoint already hit 1 time
(gdb) delete  2
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000055555555473c in sum at gdb_example.c:9breakpoint already hit 1 time
(gdb) 

改变变量的值

格式

set variable <变量>=<表达式>

举例

(gdb) p c
$1 = 5
(gdb) set variable c=0
(gdb) p c
$2 = 0
(gdb) 

生成内核转储文件

(gdb) generate-core-file 
warning: Memory read failed for corefile section, 4096 bytes at 0xffffffffff600000.
Saved corefile core.2380

有了内核转储文件,即使退出了GDB也能查看生成转储文件时的运行历史。

gcore 'pidof gdb_example'

该命令无需停止正在运行的程序,可以直接从命令行直接生成转储文件。当需要在其他机器上单独分析问题原因时,或者是分析客户现场问题时十分有用。

条件断点

break 断点 if 条件

如果条件为真,则暂停运行

condition 断点编号
condition 断点编号 条件

第一条指令删除指定断点编号的触发条件,第二条指令给断点添加触发条件

反复执行

ignore 断点编号 次数

在编号指定的断点,监视点忽略指定的次数

continue与ignore一样,也可以指定次数,达到指定次数前,执行到断点时不暂停。

continue次数
step 次数
stepi 次数
next 次数
nexti 次数
finish
until
until 地址

finish 执行完当前函数后暂停,until命令执行完当前函数等代码块后暂停,常用于跳出循环。、

删除断点或禁用断点

clear 
clear 函数名
clear 行号
clear 文件名:行号
clear 文件名:函数名
delete [breakpoints] 断点编号

clear 用于删除已定义的断点

disable [breakpoints] 
disable [breakpoints] 断点编号
disable display 显示编号
disable mem 内存区域

disable 临时禁用断点。第3种格式禁用display命令定义的自动显示,第4种格式禁用mem命令定义的内存区域。

enable
enable [breakpoints] 断点编号
enable [breakpoints] once 断点编号
enable [breakpoints] delete 断点编号
enable disable display 显示编号
enable  mem 内存区域

once 使指定的断点只启用一次。delete表示在运行暂停后删除断点。

断点命令

格式

commands 断点编号命令...end

程序在指定的断点处暂停,就会自动执行命令。

举例

(gdb) b 17
Breakpoint 3 at 0x5555555547b1: file gdb_example.c, line 17.
(gdb) command 3
Type commands for breakpoint(s) 3, one per line.
End with a line saying just "end".
>p c
>end
(gdb) r
Starting program: /home/zhongyi/code/example/gdb_example -e 'p 1'
In main():x is 10 and is stored at 0x7fffffffe2ec.ptr points to 0x7fffffffe2ec which holds 10.
In print():xx is 10 and is stored at 0x7fffffffe2bc.ptr points to 0x7fffffffe2ec which holds 10.
In sum():Breakpoint 3, print (xx=10, xxptr=0x7fffffffe2ec) at gdb_example.c:17
17        int d = minus(3,2);
$1 = 5

上例表示在17行暂停后打印c的值。

与前面的条件断点组合使用,可以在断点暂停时执行复杂的动作。

举例

break 17 if c==5commandssilentprintf “x is %d\n”,xcontend

常用命令及其缩略形式

命令简写形式说明
backtracebt/where显示backtrace
break设备断点
continuec/cont继续运行
deleted删除断点
finish运行到函数结束
info breakpoints显示断点信息
nextn执行下一行
printp显示表达式
runr运行程序
steps一次执行一行,包括函数内部
x显示内存内容
untilu执行到指定行
directorydir插入目录
disabledis禁用断点
downdo在当前栈帧中选择要显示的栈帧
edite编辑文件或函数
framef选择要显示的栈帧
forward-searchfo向前搜索
generate-core-filegcore生成内核转储
helph显示帮助文档
infoi显示信息
listl显示函数行
nextini执行下一行(以汇编代码为单位)
print-objectpo显示目标信息
sharedlibraryshare加载共享库的符号
stepisi执行下一行

值的历史

通过print命令显示过的值会记录在内部的值历史中,这些值可以在其他表达式中使用。

举例

(gdb) b 16
Breakpoint 1 at 0x79f: file gdb_example.c, line 16.
(gdb) b 17
Breakpoint 2 at 0x7b1: file gdb_example.c, line 17.
(gdb) b 29
Breakpoint 3 at 0x841: file gdb_example.c, line 29.
(gdb) r
Starting program: /home/zhongyi/code/example/gdb_example 
In main():x is 10 and is stored at 0x7fffffffe2fc.ptr points to 0x7fffffffe2fc which holds 10.
In print():xx is 10 and is stored at 0x7fffffffe2cc.ptr points to 0x7fffffffe2fc which holds 10.Breakpoint 1, print (xx=10, xxptr=0x7fffffffe2fc) at gdb_example.c:16
16        int c = sum(2,3);
(gdb) p c
$1 = 1431651824
(gdb) c
Continuing.
In sum():Breakpoint 2, print (xx=10, xxptr=0x7fffffffe2fc) at gdb_example.c:17
17        int d = minus(3,2);
(gdb) p c
$2 = 5
(gdb) c
Continuing.
In minus():Breakpoint 3, main () at gdb_example.c:29
29        return 0;

最后的值可以使用$ 访问。

通过show values 可以显示历史中的最后10个值

举例

(gdb) show values 
$1 = 1431651824
$2 = 5
$3 = 10
$4 = 10
(gdb) 

值的历史的访问变量和说明

变量说明
$值历史中的最后一个值
$n值历史的第n个值
$$值历史的倒数第二个值
$$n值历史的倒数第n个值
$_x命令显示过的最后的地址
$__x命令显示过的最后的地址的值
$_exitcode调试中的程序的返回代码
$bpnum最后设置的断点的编号

可以随意定义变量。变量以$开头,有英文和数字组成。

举例

(gdb) set $i=0
(gdb) p $i
$5 = 0
(gdb) 

命令历史

可以把命令保存在文件中,保存命令历史后,就可以在其他调试会话中使用。默认命令历史文件位于./.gdb_history

set history expansion
show history expansion

可以使用csh风格的!字符

set history filename 文件名
show history filename

可将命令历史保存到文件中,可以通过环境变量GDBHISTFILE改变默认文件。

set history save
show history save

启用命令历史保存到文件和恢复的功能。

set history size 数字
show history size

设置保存到命令历史中的命令数量,默认为256。

初始化文件(.gdbinit)

Linux下gdb初始化文件为.gdbinit。如果存在.gdbinit文件,GDB在启动之前将其作为命令文件运行。

顺序如下:

  1. $HOME/.gdbinit
  2. 运行命令行选项
  3. ./.gdbinit
  4. 加载通过-x选项给出的命令文件

命令定义

用define可以自定义命令,用document可以给自定义的命令加说明,利用help 命令名可以查看定义的命令。

define格式:

define 命令名命令…………end

document格式:

document 命令名说明end

help格式:

help 命令名

以下示例定义了名为li的命令。

举例

(gdb) define li
Type commands for definition of "li".
End with a line saying just "end".
>x/10i $rbp
>end
(gdb) document li
Type documentation for "li".
End with a line saying just "end".
>list machine instruction
>end
(gdb) li0x7fffffffe310:      (bad)  0x7fffffffe311:      rex.W push %rbp0x7fffffffe313:      push   %rbp0x7fffffffe314:      push   %rbp0x7fffffffe315:      push   %rbp0x7fffffffe316:      add    %al,(%rax)0x7fffffffe318:      xchg   %edi,(%rax,%riz,4)0x7fffffffe31b:      idiv   %edi0x7fffffffe31d:      jg     0x7fffffffe31f0x7fffffffe31f:      add    %al,(%rcx)
(gdb) help li
list machine instruction

还可以把各种设置写在文件中,运行调试器时读取这些文件。

source 文件名

总结

本文只是对gdb命令脚本做了一个粗浅的介绍,旨在起到抛砖引玉的效果。如果大家想更深入地了解这部分知识,可以参考gdb手册的相关章节:Extending GDB (https://sourceware.org/gdb/onlinedocs/gdb/Extending-GDB.html)。

最后向大家推荐一个github上的.gdbinit文件:https://github.com/gdbinit/Gdbinit,把这个弄懂,相信gdb脚本文件就不在话下了。

文章推荐:https://blog.csdn.net/lyshark_lyshark/article/details/125846778

相关文章:

【调试】GDB使用总结

启动 在shell下敲gdb命令即可启动gdb&#xff0c;启动后会显示下述信息&#xff0c;出现gdb提示符。 ➜ example gdb GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3: GNU GPL v…...

基于Spring、Spring MVC、MyBatis的招聘管理系统

文章目录项目介绍主要功能截图&#xff1a;首页账户管理招聘建议部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 …...

软件测试基础

文章目录前言一、软件测试入门1.什么是软件测试&#xff1f;2.测试和开发的区别3.调试和测试的区别4.一些常问面试题5.测试人员需要具备的素质二、软件测试基础1.需求2.测试用例3.Bug4.软件的生命周期5.开发模型三、Bug1.如何创建bug2.Bug的级别3.Bug的生命周期4.跟开发产生争执…...

【算法基础】链表

一、单链表例题&#xff1a;实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a;向链表头插入一个数&#xff1b;删除第 k个插入的数后面的数&#xff1b;在第 k&#xfffd; 个插入的数后插入一个数。现在要对该链表进行 M次操作&#xff0c;进行完所…...

[AUTOSAR][Fls模块] Flash Driver Module

Flash Driver Module--jianqiang.xue一、 简介二、 措施方式一&#xff1a;将FLASH操作程序作为Bootloader组件的一部分固化在存储器中方式二&#xff1a;通过通讯口将该部分代码从上位机下载到指定的RAM方式三&#xff1a;将Flash功能函数作为数据运行(推荐&#xff01;&#…...

如何正确选择好用的投票平台微信公众平台投票链接链接投票平台

“年度人物楷模”网络评选投票_免费链接投票_作品投票通道_扫码投票怎样进行现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发…...

gocd部署应用

产品需要在多个环境部署测试&#xff0c;为了提高部署测试效率&#xff0c;故计划使用CD工具&#xff0c;jenkins确实足够强大&#xff0c;但是使用部署功能是需要安装插件的&#xff0c;再说自己本身只用部署功能&#xff0c;故决定找一个小巧的CD工具&#xff0c;经过一番查找…...

P2P视频聊天技术分析

整个P2P视频过程需要知道双方的媒体类型、流和候选者&#xff0c;所以这里就会用到一下技术&#xff1a; ​ 信令服务器socket.io ​ 状态机 ​ ICE服务器 ​ WebRTC框架 ​ 媒体协商 信令服务器Socket.io 信令服务器说白了作用就是发消息的中转站&#xff0c;A把msg发到…...

MyBatis 的一级、二级缓存机制

目录标题缓存什么是缓存为什么使用缓存什么样的数据能使用缓存&#xff0c;什么样的数据不能使用适用于缓存不适用于缓存MyBatis 一级缓存、二级缓存关系1. 一级缓存1.1 什么是一级缓存mybatis1.2 一级缓存配置1.3 什么情况下会命中一级缓存mybatis清除一级缓存的几种方法1.4 内…...

剑指 Offer 65. 不用加减乘除做加法

摘要 剑指 Offer 65. 不用加减乘除做加法 一、位运算 有符号整数通常用补码来表示和存储&#xff0c;补码具有如下特征&#xff1a; 正整数的补码与原码相同&#xff1b;负整数的补码为其原码除符号位外的所有位取反后加 11。可以将减法运算转化为补码的加法运算来实现。符…...

5年软件测试年薪30w+,我的坎坷之路谁又知道

在深圳做了五年软件测试工作&#xff0c;从之前的一脸懵的点点点&#xff0c;到现在会自动化测试&#xff0c;说一点点非计算机专业人员从事软件测试的心得体会&#xff0c;仅供参考交流。 大部分测试在公司没啥地位&#xff0c;当然如果你懂技术就还行&#xff0c;单纯点点点…...

【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

【Opencv–adaptiveThreshold】自适应阈值图像二值化 文章目录【Opencv--adaptiveThreshold】自适应阈值图像二值化1. 介绍2. adaptiveThreshold函数2.1 函数调用2.2 补充说明3. 代码示例4. 效果4.1 原图&#xff08;ori.img&#xff09;4.2 处理后5. 参考1. 介绍 在这里 cv2.…...

洛谷P8601[蓝桥杯][2013年第四届真题]剪格子

题目描述如图 11 所示&#xff0c;33 的格子中填写了一些整数。我们沿着图中的红色线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是 60。本题的要求就是请你编程判定&#xff1a;对给定的 mn 的格子中的整数&#xff0c;是否可以分割为两个部分&#xff0c;使…...

配置alias实现快速生成.gitignore文件

git工具&#xff1a;版本控制开发工具。 cscope工具&#xff1a;用于浏览C源码的工具&#xff0c;类似于ctags。在代码根目录下执行cscope -Rbq&#xff0c;然后产生三个索引文件&#xff08;cscope.out、cscope.in.out和cscope.po.out三个文件&#xff09;。 在Linux下使用vi…...

MySQL数据库调优————GROUP BY及DISTINCT优化

GROUP BY 三种处理GROUP BY的方式 松散索引扫描&#xff08;Loose Index Scan&#xff09;紧凑索引扫描&#xff08;Tight Index Scan&#xff09;临时表&#xff08;Temporary table&#xff09; 三种方式的性能一次递减 松散索引扫描 无需扫描满足条件的所有索引键即可返…...

LRU缓存算法

双向链表哈希表&#xff08;非线程安全&#xff09; https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/ /*** LRU算法: 哈希表双向链表实现* 1. 双向链表按照被使用的顺序来存储, 靠近头部的节点是最近使用的, 靠近尾部的节…...

@Configuration注解

Configuration注解介绍 Configuration注解&#xff0c;用于标注一个类是一个spring的配置类&#xff08;同时&#xff0c;也是一个bean&#xff09;&#xff0c;配置类中可以使用ComponentScan、Import、ImportResource 和 Bean等注解的方式定义beanDefinition。 Target(Elem…...

基于springboot+vue的食疗系统

基于springbootvue的食疗系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&…...

sklearn学习-朴素贝叶斯

文章目录一、概述1、真正的概率分类器2、sklearn中的朴素贝叶斯二、不同分布下的贝叶斯1、高斯朴素贝叶斯GaussianNB2、探索贝叶斯&#xff1a;高斯朴素贝叶斯擅长的数据集3、探索贝叶斯&#xff1a;高斯朴素贝叶斯的拟合效果与运算速度总结一、概述 1、真正的概率分类器 算法…...

分享112个HTML艺术时尚模板,总有一款适合您

分享112个HTML艺术时尚模板&#xff0c;总有一款适合您 112个HTML艺术时尚模板下载链接&#xff1a;https://pan.baidu.com/s/1D3-mfPOud-f3vy9yLl-bmw?pwdfph2 提取码&#xff1a;fph2 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 时尚平面模特网站模板 潮…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...