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

Linux应用 / 驱动程序崩溃调试

文章目录

  • 前言
  • 一、GDB 使用
    • 1. GDB 介绍
    • 2. Debug版本与Release版本
    • 3. 指令演示
      • 3.1 显示行号
      • 3.2 断点设置
      • 3.3 查看断点信息
      • 3.4 删除断点
      • 3.5 开启 / 禁用断点
      • 3.6 运行
      • 3.7 打印 / 追踪变量
    • 4. 最常用指令
  • 二、Linux 应用程序调试
    • 1. codedump 介绍
    • 2. 在 Linux 系统中使用 coredump
      • 2.1 开启 codedump
      • 2.2 配置生成路径
      • 2.3 调试示例
    • 3. 在开发板上调试
      • 3.1 开启 coredump
      • 3.2 调试示例
  • 三、Linux 驱动程序调试
    • 1. ARM开发中特殊的三个寄存器
      • 1.1 堆栈指针R13(SP)
      • 1.2 连接寄存器R14(LR)
      • 1.3 程序计数器R15(PC)
    • 2. 栈回溯
    • 3. 利用工具调试

前言

我们在使用 Linux 操作系统做项目的时候,当项目比较复杂,工程比较多的时候,编译运行程序很多时候会出现 bug。

这个 bug 可能在运行时立马出现,导致段错误,也可能运行时直接导致程序崩溃,也可能在运行一段时间后程序崩溃,有时候遇到这种莫名其妙的错误会导致我们无从下手。

那么我们就需要使用调试工具或者方法来快速定位问题,通过调试,开发者可以快速定位和修复问题,减少开发和测试的时间,提高开发效率。

一、GDB 使用

1. GDB 介绍

GDB 是由 GUN 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统的标准开发环境。

2. Debug版本与Release版本

我们在编写代码后运行一般是使用【DeBug】环境进行运行。因为在企业里写软件项目,将代码写完后程序员自己要做简单的测试,保证代码没有问题。

当程序员自己测试完没有问题之后,就会将这个可执行程序给到测试人员进行测试,而且会给出自己的单元测试报告。对于测试人员来说所处的模式是【Release】,也就是将来客户要使用的这款软件的发布版本。

当测试在测的过程中,一定会发现一些问题。此时测试人员就会把报告再打回研发部。研发部做修改重新生成Release版本的可行性程序给到测试人员继续测试。

最后只有当测试通过了,再将生成的【单元测试报告】与产品经理进行核对之后没有问题,那这个软件才可以真正地面向市场。

因此:Release 版本的内存会比 Debug 版本的内存小,因为添加调试信息意味着软件的体积就会变大,占的内存更多。

3. 指令演示

测试程序:test.c

#include <stdio.h>int AddToTop(int top)
{printf("Enter AddToTop\n");int count = 0;for(int i = 1;i <= top; ++i){count += i;}printf("Quit AddToTop\n");                                                                         return count;
}int main(void)
{int top = 10;int ret = AddToTop(top);printf("ret = %d\n", ret);return 0;
}

查看可执行文件内存大小:

ls -l

image.png

进行 gdb 调试:

gdb debug

3.1 显示行号

直接执行 l ,随机显示 10 行,执行 l 0 或 l 1,表示从第一行开始显示十行,继续显示按 enter 键即可:

l 
l 0
l 1

image.png

3.2 断点设置

  • b + 行号 —— 在那一行打断点
  • b 源文件:函数名 —— 在该函数的第一行打上断点
  • b 源文件:行号 —— 在该源文件中的这行加上一个断点
b 10
b test.c:AddToTop
b test.c:20

image.png

3.3 查看断点信息

执行 info 显示所有调试信息,执行 info b 显示断点信息:

info
info b

image.png

image.png
其中:

  • Num —— 编号
  • Type —— 类型
  • Disp —— 状态
  • Enb —— 是否可用
  • Address —— 地址
  • What —— 在此文件的哪个函数的第几行
  • breakpoint already hit time,表示断点执行次数

3.4 删除断点

  • d + 当前要删除断点的编号(Num)
  • d + breakpoints

image.png

3.5 开启 / 禁用断点

  • disable b(breakpoints) —— 使所有断点无效
  • enable b(breakpoints) —— 使所有断点有效
  • disable b(breakpoint) + 编号 —— 使一个断点无效
  • enable b(breakpoint) + 编号 —— 使一个断点有效

image.png

image.png

3.6 运行

执行 r:

  • 无断点直接运行到程序结束
  • 再加上断点去运行的话就会在打的断点处停下来

image.png

image.png

执行 n 和 s:

  • n(next) —— 逐过程【相当于F10,为了查找是哪个函数出错了】
  • s(step) —— 逐语句【相当于F11,一次走一条代码,可进入函数,同样的库函数也会进入】

image.png

image.png

3.7 打印 / 追踪变量

  • p(print) 变量名 —— 打印变量值
  • display —— 跟踪查看一个变量,每次停下来都显示它的值【变量/结构体…】
  • undisplay + 变量名编号,取消跟踪
  • 我们也可以去追踪一下这两个变量的地址,不过可以看到对于地址来说是不会发生改变的

image.png

image.png

4. 最常用指令

  • until + 行号
  • finish —— 在一个函数内部,执行到当前函数返回,然后停下来等待命令
  • c(continue) —— 从一个断点处,直接运行至下一个断点处
  • bt —— 查看底层函数调用的过程【函数压栈】

二、Linux 应用程序调试

1. codedump 介绍

codedump 文件是指在程序崩溃或异常结束时,操作系统将程序的内存信息、寄存器状态、堆栈信息等保存到文件中以便进行调试和分析的文件。codedump 文件通常包含了程序崩溃时的全部状态信息,可以帮助程序员快速定位程序崩溃的原因并进行修复。

codedump 文件主要包含了用户空间的内存信息,包括用户空间栈、代码段、数据段和堆等。当一个进程因为某种原因(例如,非法内存访问、非法指令等)异常终止时,操作系统可以将进程的内存信息保存到一 codedump 文件中。这个文件可以用于后续调试,以便找出问题的根源。

codedump 文件通常不包含内核空间栈的信息,因为出于安全和隔离的原因,操作系统不会将内核空间的信息暴露给用户态程序。因此,codedump 文件主要用于分析用户空间的程序问题,而不是内核问题。

2. 在 Linux 系统中使用 coredump

当应用程序崩溃时,内核可以生产 coredump 文件:

image.png

我们可以使用 coredump 文件来调试应用程序。

2.1 开启 codedump

使用 ulimit -a 命令检查系统 codedump 配置(默认情况下,codedump是被关闭的)

ulimit -a

若输出结果中的"core file size"为"0",则表示Coredump被关闭。

执行以下命令开启:

ulimit -c unlimited

image.png

2.2 配置生成路径

开启生成 coredump 的 shell 脚本,配置保存路径:
shell.sh

#!/bin/bashDUMP_PATH=`pwd`# 检查当前用户是否具有sudo权限
if [ "$(id -u)" != "0" ]; thenecho "请使用sudo运行此脚本"exit 1
fi# 配置coredump
echo 2 > /proc/sys/fs/suid_dumpable
echo "$DUMP_PATH/coredump" > /proc/sys/kernel/core_pattern# 创建coredump保存目录
mkdir -p $DUMP_PATH
chmod 777 $DUMP_PATH# coredump功能已开启 配置信息
cat /proc/sys/fs/suid_dumpable
cat /proc/sys/kernel/core_pattern

在模板中,可以使用以下占位符:coredump / %e.%p.%t.coredump

  • %e:可执行文件名
  • %p:进程ID
  • %u:当前用户ID
  • %g:当前用户组ID
  • %s:生成Coredump文件时的信号
  • %t:生成Coredump文件时的时间戳
  • %h:主机名

在目录下运行脚本:

vi shell.sh
chmod +x shell.sh
sudo ./shell.sh

image.png

2.3 调试示例

示例空指针 bug 代码:app_bug.c

#include <stdio.h>volatile int g_val = 0x12345678;int CreatBug(int b, int n)
{int ret;volatile int *p = NULL;printf("in CreatBug\n");*p = 1;ret = b / n;printf("leave CreateBug\n");return ret;
}void D(int n, int m)
{printf("in D\n");CreatBug(n, m);printf("leave D\n");
}void C(int n, int m)
{printf("in C\n");D(n, m);printf("leave C\n");
}
void B(int n, int m)
{printf("in B\n");C(n, m);printf("leave B\n");
}void A(int n, int m)
{printf("in A\n");B(g_val * n, m);printf("leave A\n");
}int main()
{printf("to Creat Bug ... \n");A(100, 0);printf("done\n");return 0;
}

编译运行程序,程序出现了段错误,并生成了 coredump 文件(路径为脚本配置的路径):

image.png

根据生成的 coredump 文件进行调试:

image.png

3. 在开发板上调试

开发板运行我们的可执行程序时,前提是内核不崩溃(驱动程序不崩溃),才会产生core文件。

3.1 开启 coredump

在开发板上执行:

ulimit -c unlimited

3.2 调试示例

在开发上运行测试程序:
image.png

崩溃后直接在板子上调试:

image.png

或者将 core 文件移 ubuntu ,在 ubuntu 上进行调试,原理跟上面一样,这样可能 core 文件会出现权限问题:

image.png

手动添加权限:

sudo chmod 644 core

解释:

  • drwxrwxrwx
  • -rw-------
  • -rwxrwxr-x
  • -:表示这是一个普通文件(非目录)。
  • rwx:文件所有者(book)对该文件有读(r)、写(w)和执行(x)权限。
  • rwx:文件所属组(book)的用户也有读、写和执行权限。
  • r-x:其他用户(不属于 book 组的用户)对该文件有读和执行权限,但没有写权限。

然后就可以进行调试:

image.png

三、Linux 驱动程序调试

1. ARM开发中特殊的三个寄存器

在ARM体系中,一般分为四种寄存器:通用目的寄存器、堆栈指针(SP)、连接寄存器(LR) 以及程序计数器(PC), 其中需要着重理解后面三种寄存器。

1.1 堆栈指针R13(SP)

  • 每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。
  • 当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。

1.2 连接寄存器R14(LR)

  • 保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;
  • 子程序通过把r14复制到PC来实现返回,通常用下列指令:MOV PC, LR;BX LR;
  • 当异常发生时,异常模式的R14用来保存异常返回地址,将R14如栈可以处理嵌套中断。

1.3 程序计数器R15(PC)

  • PC是有读写限制的;
  • 没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00;
  • 在CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4;
  • 向PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器),CM3中的指令至少是半字对齐的,所以PC的LSB总是读回0;
  • 在分支时,无论是直接写 PC 的值还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),用以表明这是在Thumb 状态下执行;
  • 倘若写了 0,则视为企图转入 ARM 模式,CM3 将产生一个 fault 异常。

2. 栈回溯

当驱动崩溃时,内核空间会打印寄存器信息、栈内容:

image.png

根据上述信息,我们只能进行纯手工的栈回溯。

先执行以下命令得到反汇编文件:

arm-buildroot-linux-gnueabihf-objdump -D hello_drv.ko > hello_drv.dis	

image.png

通过内核崩溃打印信息和反汇编文件分析得到出错位置:

image.png

或者得到模块的代码段基地址:

cat /sys/module/hello_drv/sections/.text

image.png

image.png

通过崩溃时 PC 地址 - 代码段基地址 = 1A8,得到具体出错位置:

image.png
分析出错时候栈的地方:

image.png
在栈里面它保存有返回地址,我们只需要去对应函数的栈找到 LR 的值即可知道函数的调用关系:
image.png
通过上图可知LR对应值和调用关系:

  • 1f8:C调用D
  • 23c:B调用C
  • 2c0:A调用B
  • 37c:hello_write调用A

image.png

image.png

image.png

image.png

3. 利用工具调试

驱动崩溃时打印的串口信息,能否转换为core文件,然后使用gdb进行调试?

答案是可以的,在这里要借助百问网工具进行转换:

image.png

添加调试信息:在 Makefile中加以下选项:

KBUILD_CFLAGS   += -g

参考内核源码目录 Makefile 文件:

image.png

修改 Makefile:

KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88
KBUILD_CFLAGS   += -gall:make -C $(KERN_DIR) M=`pwd` modules $(CROSS_COMPILE)gcc -o hello_test hello_test.c clean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.orderrm -f hello_testobj-m	+= hello_drv.o

重新make:

image.png

传入支持文件:

image.png

执行 make 生成 mcu_coredump

image.png

第1步:把串口信息转换为core文件

./mcu_coredump 1.log 1.core

image.png

第2步:使用gdb调试内核

arm-buildroot-linux-gnueabihf-gdb ~/100ask_imx6ull-sdk/Linux-4.9.88/vmlinux 1.core

第3步:导入驱动文件

(gdb) add-symbol-file /home/book/nfs_rootfs/code/gdb/driver/01_hello_drv/hello_drv.ko 0x7f154000

0x7f154000为代码段

image.png

第4步:使用gdb命令查看驱动运行情况

image.png

image.png

可以清楚的看到各个函数的调用关系,快速定位代码出错地方。

相关文章:

Linux应用 / 驱动程序崩溃调试

文章目录 前言一、GDB 使用1. GDB 介绍2. Debug版本与Release版本3. 指令演示3.1 显示行号3.2 断点设置3.3 查看断点信息3.4 删除断点3.5 开启 / 禁用断点3.6 运行3.7 打印 / 追踪变量 4. 最常用指令 二、Linux 应用程序调试1. codedump 介绍2. 在 Linux 系统中使用 coredump2.…...

k8s集群-kubeadm init

为了使用阿里云的镜像源加速 kubeadm init 初始化 Kubernetes 集群的过程&#xff0c;你需要修改 kubeadm 的配置文件以指向阿里云提供的镜像仓库。以下是具体步骤&#xff1a; 1. 创建或编辑 kubeadm 配置文件 首先&#xff0c;创建一个 kubeadm 的配置文件&#xff08;如果还…...

Python 视频爬取教程

文章目录 前言基本原理环境准备Python安装选择Python开发环境安装必要库 示例 1&#xff1a;爬取简单直链视频示例 2&#xff1a;爬取基于 HTML5 的视频&#xff08;以某简单视频网站为例&#xff09; 前言 以下是一个较为完整的 Python 视频爬取教程&#xff0c;包含基本原理…...

Linux应用软件编程(多任务:进程间通信)

一.进程间通信 同一主机下&#xff1a; &#xff08;1&#xff09;无名管道&#xff1a;pipe &#xff08;2&#xff09;有名管道&#xff1a;fifo &#xff08;3&#xff09;信号&#xff1a;异步通知机制 &#xff08;4&#xff09;共享内存&a…...

工厂方法模式和抽象工厂模式详解

由于工厂方法模式和抽象工厂模式有点类似&#xff0c;可以放着一块说下。 一、工厂方法模式 (Factory Method Pattern) 场景描述 假设需要实现一个跨平台日志系统&#xff0c;支持文件日志和数据库日志&#xff0c;且未来可能扩展其他日志方式。通过工厂方法模式&#xff0c;…...

js给后端发送请求的方式有哪些

在 JavaScript 中&#xff0c;有多种方式可以向后端发送请求&#xff0c;以下为你详细介绍&#xff1a; 1. XMLHttpRequest XMLHttpRequest 是最早用于在浏览器和服务器间进行异步通信的 API。虽然它使用起来相对复杂&#xff0c;但兼容性很好&#xff0c;能兼容较旧的浏览器…...

无人机吊舱模块更换技术难点分析!

一、模块更换的可行性 模块化设计的支持 部分吊舱采用模块化设计&#xff0c;允许根据任务需求更换传感器模块。例如&#xff0c;某些吊舱系统支持定制化组合&#xff0c;如“红外激光测距”或“可见光激光测距”等。这表明在硬件结构上&#xff0c;若吊舱预留了标准化的接…...

高数1.4 无穷小与无穷大

1.无穷小 1.1.定义 1.2 常规性质 2.无穷大 2.1 定义 2.无穷小与无穷大的关系...

深入理解MySQL数据库索引

深入理解MySQL数据库索引 个人主页&#xff1a;顾漂亮 1. 索引简介 1.1 索引是什么&#xff1f; MySQL的索引是一种数据结构&#xff0c;它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录&#xff0c;使得对表的查询可以通过对索引的搜…...

Spring 中 BeanPostProcessor 的作用和示例

一、BeanPostProcessor 的核心作用 1、作用 BeanPostProcessor 是 Spring Bean 实例级别的扩展接口&#xff0c;在 Bean 初始化前后对实例进行加工或替换。其核心功能包括&#xff1a; 修改 Bean 属性&#xff08;如动态注入值、调整配置&#xff09;。生成代理对象&#xf…...

图 最 短 路

Diikstra朴素 非负边权单源最短路顶点数最好小于1000少量数据结构知识和一点点的算法基础 算法描述 这个算法我们采用邻接矩阵来存储&#xff0c;有时候输入数据&#xff0c;并不是我们期待的那样&#xff0c;所以需要对数据做一些处理&#xff0c;也就是把图创建起来的过程…...

NA611系列WiFi串口服务器常见问题以及解决办法

NA611系列WiFi串口服务器是一款高性能、高可靠的工业级双频RS485 ⇌ WiFi数据双向透明传输的串口服务器。实现RS485串口数据通过WiFi实现设备联网数据交互&#xff0c;支持 IEEE 802.11 a/b/g/n 标准。WiFi串口服务器在连接、配置和使用过程中可能会遇到多种问题。以下是一些常…...

工程化与框架系列(36)--前端监控告警实践

前端监控告警实践 &#x1f514; 引言 前端监控是保障应用质量和用户体验的重要手段。本文将深入探讨前端监控的实现方案&#xff0c;包括性能监控、错误监控、用户行为监控等方面&#xff0c;以及相应的告警机制。 监控系统概述 前端监控系统主要包括以下方面&#xff1a;…...

【深度学习|目标检测】YOLO系列anchor-based原理详解

YOLO之anchor-based 一、关于anchors的设置二、网络如何利用anchor来训练关于register_buffer训练阶段的anchor使用推理阶段的anchor使用 三、训练时的正负样本匹配anchor匹配grid匹配 总结起来其实就是&#xff1a;基于anchor-based的yolo就是基于三个检测头的分支上的grids和…...

vue3+Ts+elementPlus二次封装Table分页表格,表格内展示图片、switch开关、支持

目录 一.项目文件结构 二.实现代码 1.子组件&#xff08;表格组件&#xff09; 2.父组件&#xff08;使用表格&#xff09; 一.项目文件结构 1.表格组件&#xff08;子组件&#xff09;位置 2.使用表格组件的页面文件&#xff08;父组件&#xff09;位置 3.演示图片位置 ele…...

【C/C++】文件句柄

什么是文件句柄&#xff1f; 文件句柄&#xff08;File Handle&#xff09;是操作系统中的一种抽象概念&#xff0c;它用来表示一个打开的文件或输入/输出设备。 文件句柄是程序与文件之间的桥梁&#xff0c;程序通过文件句柄来访问和操作文件的内容。 1. 文件句柄——作用 文…...

Matlab 基于专家pid控制的时滞系统

1、内容简介 Matlab 185-基于专家pid控制的时滞系统 可以交流、咨询、答疑 2、内容说明 略 在处理时滞系统&#xff08;Time Delay Systems&#xff09;时&#xff0c;使用传统的PID控制可能会面临挑战&#xff0c;因为时滞会导致系统的不稳定或性能下降。专家PID控制通过结…...

【高项】信息系统项目管理师(六)项目进度管理【3分】

项目进度管理是为了保证项目按时完成。对项目所需的各个过程进行管理,包括规划进度、定义活动、排列活动顺序、估算活动持续时间、制订项目进度计划和控制进度。小型项目中,定义活动、排列活动顺序、估算活动持续时间以及制订进度模型形成进度计划等过程的联系非常紧密,可以…...

通过MATLAB和Carsim进行联合仿真,利用强化学习实现自动驾驶人机控制权策略的详细步骤和示例代码

以下是一个通过MATLAB和Carsim进行联合仿真,利用强化学习实现自动驾驶人机控制权策略的详细步骤和示例代码: 步骤概述 Carsim配置:对Carsim进行必要的设置,包括车辆模型、道路场景等,并生成S - function接口。MATLAB环境搭建:在MATLAB中配置Carsim的S - function,并创建…...

iOS 模块化架构设计:主流方案与实现详解

随着 iOS 工程规模的扩大&#xff0c;模块化设计成为提升代码可维护性、团队协作效率和开发灵活性的关键。本文将探讨为什么需要模块化&#xff0c;介绍四种主流的模块化架构方案&#xff08;协议抽象、依赖注入、路由机制和事件总线&#xff09;&#xff0c;并通过代码示例和对…...

PostreSQL指南-内幕探索-学习笔记-01-数据库集簇的逻辑与物理结构

目录 一、环境信息 二、参考内容 三、逻辑结构概念 四、物理结构概念 五、逻辑映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 五、物理映射关系 1、数据库与oid映射关系 2、堆表对象与oid映射关系 六、数据库文件布局 1、表格 2、postmaster.pid文件解…...

java使用(Preference、Properties、XML、JSON)实现处理(读写)配置信息或者用户首选项的方式的代码示例和表格对比

在Java应用程序中&#xff0c;处理应用首选项&#xff08;preferences&#xff09;有多种方法&#xff0c;包括使用java.util.prefs.Preferences类、属性文件&#xff08;如.properties文件&#xff09;、XML文件和JSON文件。下面是每种方法的详细说明和代码示例&#xff0c;最…...

spring动态代理是在生命周期的哪个阶段实现的

Spring AOP&#xff08;面向切面编程&#xff09;的动态代理是在 Bean 生命周期的 初始化后阶段 实现的&#xff0c;具体来说是在 BeanPostProcessor 的 postProcessAfterInitialization() 方法中完成的。下面我们来详细分析 Spring AOP 动态代理的实现位置及其工作原理。 1. S…...

Oracle静默安装方法

Web服务器上面的Linux一般是不会有图形界面的&#xff0c;所有通过图形界面来安装Linux的方式在没有图形界面的Linux上面是行不通的&#xff0c;我们要使用的安装方式叫做Linux的静默安装。即在没有图形界面的Linux上面安装。 1. 下载地址 http://www.oracle.com/technetwork…...

本地部署deepseek-r1建立向量知识库和知识库检索实践【代码】

目录 一、本地部署DS 二、建立本地知识库 1.安装python和必要的库 2.设置主目录工作区 3.编写文档解析脚本 4.构建向量数据库 三、基于DS,使用本地知识库检索 本地部署DS,其实非常简单,我写了一篇操作记录,我终于本地部署了DeepSeek-R1(图文全过程)-CSDN博客 安装…...

单词翻转(信息学奥赛一本通-1144)

【题目描述】 输入一个句子(一行)&#xff0c;将句子中的每一个单词翻转后输出。 【输入】 只有一行&#xff0c;为一个字符串&#xff0c;不超过500个字符。单词之间以空格隔开。 【输出】 翻转每一个单词后的字符串&#xff0c;单词之间的空格需与原文一致。 【输入样例】 he…...

Python基础入门掌握(十三)

从基础到进阶&#xff0c;轻松掌握文件读写 目录 文件操作的基本概念 文件的打开与关闭 读取文件内容 写入文件内容 文件操作的高级技巧 总结与建议‍ 文件操作的基本概念 在Python中&#xff0c;文件操作主要涉及以下几个步骤&#xff1a; 打开文件&#xff08;open…...

【再读】R1-Onevision通过跨模态形式化为复杂多模态推理任务提供了系统性解决方案

R1-Onevision:跨模态形式化驱动的多模态推理技术突破,R1-Onevision通过跨模态形式化、双阶段训练和教育级基准测试,为多模态推理树立了新标杆。其技术创新不仅提升了模型在复杂任务中的表现,更重要的是为行业提供了一种可解释、可迁移的多模态处理范式。随着形式化方法的不断…...

【AWS入门】2025 AWS亚马逊云科技账户注册指南

【AWS入门】2025 AWS亚马逊云科技账户注册指南 A Guide To Register a New account on AWS By JacksonML 0. AWS亚马逊云科技简介 Amazon Web Service(AWS) 即亚马逊云科技&#xff0c;其在全球Cloud Computing(云计算)市场占有最为重要的地位。 AWS连续13年被Gartner评为…...

重生之我在学Vue--第18天 Vue 3 项目功能扩展

重生之我在学Vue–第18天 Vue 3 项目功能扩展 文章目录 重生之我在学Vue--第18天 Vue 3 项目功能扩展前言一、权限管理系统1.1 用户角色体系设计1.2 路由权限控制1.3 组件级权限控制 二、分页与搜索系统2.1 分页类型对比2.2 分页组件实现2.3 搜索功能实现 三、文件上传系统3.1 …...

基于SpringBoot的房地产销售管理系统【附源码】

基于SpringBoot的房地产销售管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1用户登录功能的详细实现 4.2管理员权限的功能实现 4.2.1客户信息管理功能的详细实现 4.2.2房产管理功能的详细实现 4.2.3预约看房功能的详细实现 4.2.4论…...

数组题型-二分查找-JS

二分查找伪代码 1.定义 target 是在⼀个在左闭右闭的区间⾥&#xff0c;也就是[left, right] let left0;let rightnums.length-1;// 定义target在左闭右闭的区间⾥&#xff0c;[left, right]while(left<right){// 当leftright&#xff0c;区间[left, right]依然有效&#x…...

STL——vector

目录 1 vector介绍 2 vector使用 2.1 vector的定义 2.1.1 无参构造 2.1.2 构造并初始化N个Val 2.1.3 拷贝构造 2.1.4 使用迭代器初始化构造 2.1.5 使用大括号初始化构造 2.2 vector的迭代器 2.2.1 const 迭代器 2.3 vector的空间增长 2.4 vector的增删改查 2.5 ve…...

国内首款载重1吨级无人运输机TP1000首飞成功 2026年投入应急救援

大湾区经济网珠海快讯&#xff0c;据央视新闻报道&#xff0c;3月15日上午&#xff0c;国内首款载重1吨级大型无人运输机TP1000在山东成功首飞。该机由中国民航适航标准完全自主研发&#xff0c;起飞重量3.3吨&#xff0c;满载航程达1000公里&#xff0c;具备智能空投功能&…...

python-leetcode 54.全排列

题目&#xff1a; 给定不含重复数字的数组nums,返回其所有可能的全排列&#xff0c;可以按任意顺序返回答案 回溯法 一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解&#xff08;或者至少不是最后一个解&#xff09;&#xff0c;回溯算法会通…...

人工智能实现电脑任务自动化的开源软件

人工智能实现电脑任务自动化的开源软件 hallo大家好&#xff0c;我是星哥&#xff0c;今天给大家介绍一个开源软件&#xff0c;融合了人工智能与机器人流程自动化&#xff08;AIRPA&#xff09;的开源软件autoMate! autoMate是什么 autoMate 是一款由开源开发的本地自动化工…...

串口烧录出现频繁回复乱码 频繁回复一个数字且烧录失败 字节混乱

这是因为你的芯片没有处于系统存储区启动一直未进入bootloader 解决办法是检查boot引脚接正确没&#xff0c;要在系统存储器启动...

ens33没有分配到IPV4问题

方法一&#xff1a;手动为 ens33 接口分配 IP 地址 你能够借助 ip 命令手动给 ens33 接口分配 IP 地址。不过这种方式在系统重启之后就会失效。 步骤 查看网络信息 先查看一下当前网络的子网信息&#xff0c;例如网关地址和子网掩码等&#xff0c;你可以通过路由器管理界面或…...

搭建主从服务器

任务需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#xff0c;并且都开启防…...

【实测闭坑】LazyGraphRAG利用本地ollama提供Embedding model服务和火山引擎的deepseek API构建本地知识库

LazyGraphRAG 2024年4月&#xff0c;为解决传统RAG在全局性的查询总结任务上表现不佳&#xff0c;微软多部门联合提出Project GraphRAG&#xff08;大模型驱动的KG&#xff09;&#xff1b;2024年7月&#xff0c;微软正式开源GraphRAG项目&#xff0c;引起极大关注&#xff0c…...

[Lc14_priority_queue] 最后一块石头重量 | 数据流中的第 K 大元素 | 前K个高频单词 | 数据流的中位数

目录 1.最后一块石头的重量 题解 2.数据流中的第 K 大元素 题解 3.前K个高频单词 题解 代码 ⭕4.数据流的中位数 题解 在C中&#xff0c;使用标准库中的priority_queue&#xff0c;默认情况下它是一个最大堆&#xff08;即大堆排序&#xff09;&#xff0c;这意味着最…...

Electron使用WebAssembly实现CRC-16 MAXIM校验

Electron使用WebAssembly实现CRC-16 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-16 MAXIM格式校验的方式。 CRC-16 MAXIM校验函数WebAssembly源文件 C语言实…...

案例5_1:单位数码管显示0

文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图&#xff0c;在此基础上修改 注意&#xff1a;栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…...

OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节&#xff0c;通过结合空间域和频率域的处理&#xff0c;提升图像中特定细节…...

linux按照nginx

第一步先按照依赖gcc 一键安装上面四个依赖 Nginx的编译安装需要一些依赖库&#xff0c;如gcc、make、zlib、openssl等。可以使用yum命令安装这些依赖&#xff1a; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 创建目录 mkdir /usr/nginx 切换…...

SpringMVC(八)Knife4j 接口文档

目录 一 基础使用 1 配置pom.xml相关依赖 2 项目配置 3 输入指定路径&#xff08;http://localhost:8080/doc.html&#xff09; 二 一些使用方法 1 Tag 2 Operation 3 Schema 4 Parameter 5 可以根据需求来设置 补充&#xff1a;日期的格式化 Knife4j 是基于 Swag…...

Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统

Java集成MQTT和Kafka实现高可用方案 1. 概述 在物联网(IoT)和分布式系统中,消息传递的可靠性和高可用性至关重要。本文将详细介绍如何使用Java集成MQTT和Kafka来构建一个高可用的消息处理系统。 MQTT(消息队列遥测传输)是一种轻量级的发布/订阅协议,适用于资源受限的设备和…...

【操作系统安全】任务6:Linux 系统文件与文件系统安全 学习指南

目录 一、文件系统基础概念 二、查看文件系统信息 2.1 磁盘空间查看 2.2 分区与挂载管理 2.3 文件系统类型操作 三、文件系统权限配置 3.1 基础权限管理 3.2 所有权管理 3.3 特殊权限设置 四、文件操作基础 4.1 文件创建 4.2 文件删除 4.3 文件复制与移动 4.4 文件…...

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…...

Zabbix安装(保姆级教程)

Zabbix 是一款开源的企业级监控解决方案,能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,从而能够快速响应服务器问题。Zabbix 基于存储的数据提供…...