ubuntu22.04 使用crash

文章目录

  • 前言
  • 一、apt 安装dbgsym vnlinux
  • 二、使用.ddeb包安装dbgsym vnlinux
  • 三、dbgsym发行版
  • 四、crash调试
  • 参考资料

前言

最近在适配 ubuntu系统,记录一下其crash的安装。

一、apt 安装dbgsym vnlinux

# echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiversedeb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiversedeb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
$ sudo apt install ubuntu-dbgsym-keyring
$ sudo apt-get update
# apt -y install linux-image-$(uname -r)-dbgsym
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:linux-image-unsigned-5.15.0-122-generic-dbgsym
The following NEW packages will be installed:linux-image-5.15.0-122-generic-dbgsym linux-image-unsigned-5.15.0-122-generic-dbgsym
0 upgraded, 2 newly installed, 0 to remove and 42 not upgraded.
Need to get 1,061 MB of archives.
After this operation, 6,917 MB of additional disk space will be used.
Get:1 http://ddebs.ubuntu.com jammy-updates/main amd64 linux-image-unsigned-5.15.0-122-generic-dbgsym amd64 5.15.0-122.132 [1,061 MB]

二、使用.ddeb包安装dbgsym vnlinux

也可以直接在 http://ddebs.ubuntu.com/pool/main/l/linux/下载对应的.ddeb包:
在这里插入图片描述

dpkg -i linux-image-unsigned-5.15.0-122-generic-dbgsym_5.15.0-122.132_amd64.ddeb

三、dbgsym发行版

在http://ddebs.ubuntu.com/pool/main/l/linux/查看支持的dbgsym vmlinux:

发行版内核版本
14.043.13.0
16.044.4.0
18.044.15.0
20.045.4.0
22.045.15.0
24.046.8.0

其他内核版本,请参考:http://ddebs.ubuntu.com/pool/main/l/

四、crash调试

# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy# uname -r
6.5.0-18-generic

我这里用ubuntu22.04 的6.5.0-18-generic内核调试为例:

/** 64-bit SYSCALL instruction entry. Up to 6 arguments in registers.** This is the only entry point used for 64-bit system calls.  The* hardware interface is reasonably well designed and the register to* argument mapping Linux uses fits well with the registers that are* available when SYSCALL is used.** SYSCALL instructions can be found inlined in libc implementations as* well as some other programs and libraries.  There are also a handful* of SYSCALL instructions in the vDSO used, for example, as a* clock_gettimeofday fallback.** 64-bit SYSCALL saves rip to rcx, clears rflags.RF, then saves rflags to r11,* then loads new ss, cs, and rip from previously programmed MSRs.* rflags gets masked by a value from another MSR (so CLD and CLAC* are not needed). SYSCALL does not save anything on the stack* and does not change rsp.** Registers on entry:* rax  system call number* rcx  return address* r11  saved rflags (note: r11 is callee-clobbered register in C ABI)* rdi  arg0* rsi  arg1* rdx  arg2* r10  arg3 (needs to be moved to rcx to conform to C ABI)* r8   arg4* r9   arg5* (note: r12-r15, rbp, rbx are callee-preserved in C ABI)** Only called from user space.** When user can change pt_regs->foo always force IRET. That is because* it deals with uncanonical addresses better. SYSRET has trouble* with them due to bugs in both AMD and Intel CPUs.*/SYM_CODE_START(entry_SYSCALL_64)UNWIND_HINT_ENTRYENDBRswapgs/* tss.sp2 is scratch space. */movq	%rsp, PER_CPU_VAR(cpu_tss_rw + TSS_sp2)SWITCH_TO_KERNEL_CR3 scratch_reg=%rspmovq	PER_CPU_VAR(pcpu_hot + X86_top_of_stack), %rspSYM_INNER_LABEL(entry_SYSCALL_64_safe_stack, SYM_L_GLOBAL)ANNOTATE_NOENDBR/* Construct struct pt_regs on stack */pushq	$__USER_DS				/* pt_regs->ss */pushq	PER_CPU_VAR(cpu_tss_rw + TSS_sp2)	/* pt_regs->sp */pushq	%r11					/* pt_regs->flags */pushq	$__USER_CS				/* pt_regs->cs */pushq	%rcx					/* pt_regs->ip */
SYM_INNER_LABEL(entry_SYSCALL_64_after_hwframe, SYM_L_GLOBAL)......
SYM_INNER_LABEL(entry_SYSCALL_64_after_hwframe, SYM_L_GLOBAL)pushq	%rax					/* pt_regs->orig_ax */PUSH_AND_CLEAR_REGS rax=$-ENOSYS/* IRQs are off. */movq	%rsp, %rdi/* Sign extend the lower 32bit as syscall numbers are treated as int */movslq	%eax, %rsi/* clobbers %rax, make sure it is after saving the syscall nr */IBRS_ENTERUNTRAIN_RETcall	do_syscall_64		/* returns with IRQs disabled */......

看其vmlinux:

 cat /boot/System.map-6.5.0-18-generic | grep entry_SYSCALL_64_after_hwframe
ffffffff82200078 T entry_SYSCALL_64_after_hwframe
ffffffff82200078:       50                      push   %rax
ffffffff82200079:       57                      push   %rdi
ffffffff8220007a:       56                      push   %rsi
ffffffff8220007b:       52                      push   %rdx
ffffffff8220007c:       51                      push   %rcx
ffffffff8220007d:       6a da                   push   $0xffffffffffffffda
ffffffff8220007f:       41 50                   push   %r8
ffffffff82200081:       41 51                   push   %r9
ffffffff82200083:       41 52                   push   %r10
ffffffff82200085:       41 53                   push   %r11
ffffffff82200087:       53                      push   %rbx
ffffffff82200088:       55                      push   %rbp
ffffffff82200089:       41 54                   push   %r12
ffffffff8220008b:       41 55                   push   %r13
ffffffff8220008d:       41 56                   push   %r14
ffffffff8220008f:       41 57                   push   %r15
ffffffff82200091:       31 f6                   xor    %esi,%esi
ffffffff82200093:       31 d2                   xor    %edx,%edx
......
ffffffff822000d1:       90                      nop
ffffffff822000d2:       90                      nop
ffffffff822000d3:       90                      nop
ffffffff822000d4:       90                      nop
ffffffff822000d5:       90                      nop
ffffffff822000d6:       90                      nop
ffffffff822000d7:       90                      nop
ffffffff822000d8:       90                      nop
ffffffff822000d9:       90                      nop
ffffffff822000da:       90                      nop
ffffffff822000db:       90                      nop
ffffffff822000dc:       90                      nop
ffffffff822000dd:       90                      nop
ffffffff822000de:       90                      nop
ffffffff822000df:       90                      nop
ffffffff822000e0:       90                      nop
ffffffff822000e1:       e8 9a 4a f1 ff          call   0xffffffff82114b80
ffffffff822000e6:       90                      nop
ffffffff822000e7:       90                      nop
ffffffff822000e8:       90                      nop
ffffffff822000e9:       90                      nop
ffffffff822000ea:       90                      nop

到了ffffffff822000d1处,全是 nop指令:

# cat /boot/System.map-6.5.0-18-generic | grep '\<do_syscall_64\>'
ffffffff82114b80 T do_syscall_64

而我看crash:

crash> dis entry_SYSCALL_64_after_hwframe
0xffffffff97400078 <entry_SYSCALL_64_after_hwframe>:    push   %rax
0xffffffff97400079 <entry_SYSCALL_64_after_hwframe+1>:  push   %rdi
0xffffffff9740007a <entry_SYSCALL_64_after_hwframe+2>:  push   %rsi
0xffffffff9740007b <entry_SYSCALL_64_after_hwframe+3>:  push   %rdx
0xffffffff9740007c <entry_SYSCALL_64_after_hwframe+4>:  push   %rcx
0xffffffff9740007d <entry_SYSCALL_64_after_hwframe+5>:  push   $0xffffffffffffffda
0xffffffff9740007f <entry_SYSCALL_64_after_hwframe+7>:  push   %r8
0xffffffff97400081 <entry_SYSCALL_64_after_hwframe+9>:  push   %r9
0xffffffff97400083 <entry_SYSCALL_64_after_hwframe+11>: push   %r10
0xffffffff97400085 <entry_SYSCALL_64_after_hwframe+13>: push   %r11
0xffffffff97400087 <entry_SYSCALL_64_after_hwframe+15>: push   %rbx
0xffffffff97400088 <entry_SYSCALL_64_after_hwframe+16>: push   %rbp
0xffffffff97400089 <entry_SYSCALL_64_after_hwframe+17>: push   %r12
0xffffffff9740008b <entry_SYSCALL_64_after_hwframe+19>: push   %r13
0xffffffff9740008d <entry_SYSCALL_64_after_hwframe+21>: push   %r14
0xffffffff9740008f <entry_SYSCALL_64_after_hwframe+23>: push   %r15
0xffffffff97400091 <entry_SYSCALL_64_after_hwframe+25>: xor    %esi,%esi
0xffffffff97400093 <entry_SYSCALL_64_after_hwframe+27>: xor    %edx,%edx
0xffffffff97400095 <entry_SYSCALL_64_after_hwframe+29>: xor    %ecx,%ecx
0xffffffff97400097 <entry_SYSCALL_64_after_hwframe+31>: xor    %r8d,%r8d
0xffffffff9740009a <entry_SYSCALL_64_after_hwframe+34>: xor    %r9d,%r9d
0xffffffff9740009d <entry_SYSCALL_64_after_hwframe+37>: xor    %r10d,%r10d
0xffffffff974000a0 <entry_SYSCALL_64_after_hwframe+40>: xor    %r11d,%r11d
0xffffffff974000a3 <entry_SYSCALL_64_after_hwframe+43>: xor    %ebx,%ebx
0xffffffff974000a5 <entry_SYSCALL_64_after_hwframe+45>: xor    %ebp,%ebp
0xffffffff974000a7 <entry_SYSCALL_64_after_hwframe+47>: xor    %r12d,%r12d
0xffffffff974000aa <entry_SYSCALL_64_after_hwframe+50>: xor    %r13d,%r13d
0xffffffff974000ad <entry_SYSCALL_64_after_hwframe+53>: xor    %r14d,%r14d
0xffffffff974000b0 <entry_SYSCALL_64_after_hwframe+56>: xor    %r15d,%r15d
0xffffffff974000b3 <entry_SYSCALL_64_after_hwframe+59>: mov    %rsp,%rdi
0xffffffff974000b6 <entry_SYSCALL_64_after_hwframe+62>: movslq %eax,%rsi
0xffffffff974000b9 <entry_SYSCALL_64_after_hwframe+65>: xchg   %ax,%ax
0xffffffff974000bb <entry_SYSCALL_64_after_hwframe+67>: mov    $0x48,%ecx
0xffffffff974000c0 <entry_SYSCALL_64_after_hwframe+72>: mov    %gs:0x1fbd0,%rdx
0xffffffff974000c9 <entry_SYSCALL_64_after_hwframe+81>: mov    %edx,%eax
0xffffffff974000cb <entry_SYSCALL_64_after_hwframe+83>: shr    $0x20,%rdx
0xffffffff974000cf <entry_SYSCALL_64_after_hwframe+87>: wrmsr
0xffffffff974000d1 <entry_SYSCALL_64_after_hwframe+89>: jmp    0xffffffff974000e1 <entry_SYSCALL_64_after_hwframe+105>
0xffffffff974000d3 <entry_SYSCALL_64_after_hwframe+91>: int3
0xffffffff974000d4 <entry_SYSCALL_64_after_hwframe+92>: int3
0xffffffff974000d5 <entry_SYSCALL_64_after_hwframe+93>: int3
0xffffffff974000d6 <entry_SYSCALL_64_after_hwframe+94>: int3
0xffffffff974000d7 <entry_SYSCALL_64_after_hwframe+95>: int3
0xffffffff974000d8 <entry_SYSCALL_64_after_hwframe+96>: int3
0xffffffff974000d9 <entry_SYSCALL_64_after_hwframe+97>: int3
0xffffffff974000da <entry_SYSCALL_64_after_hwframe+98>: int3
0xffffffff974000db <entry_SYSCALL_64_after_hwframe+99>: int3
0xffffffff974000dc <entry_SYSCALL_64_after_hwframe+100>:        int3
0xffffffff974000dd <entry_SYSCALL_64_after_hwframe+101>:        int3
0xffffffff974000de <entry_SYSCALL_64_after_hwframe+102>:        int3
0xffffffff974000df <entry_SYSCALL_64_after_hwframe+103>:        int3
0xffffffff974000e0 <entry_SYSCALL_64_after_hwframe+104>:        int3
0xffffffff974000e1 <entry_SYSCALL_64_after_hwframe+105>:        call   0xffffffff97314b80 <do_syscall_64>

在0xffffffff974000d1处nop指令变成了jmp:

0xffffffff974000d1 <entry_SYSCALL_64_after_hwframe+89>: jmp    0xffffffff974000e1 <entry_SYSCALL_64_after_hwframe+105>
......
0xffffffff974000e1 <entry_SYSCALL_64_after_hwframe+105>:        call   0xffffffff97314b80 <do_syscall_64>

与UNTRAIN_RET指令有关。

(2)

/** Save all registers in pt_regs. Return GSBASE related information* in EBX depending on the availability of the FSGSBASE instructions:** FSGSBASE	R/EBX*     N        0 -> SWAPGS on exit*              1 -> no SWAPGS on exit**     Y        GSBASE value at entry, must be restored in paranoid_exit** R14 - old CR3* R15 - old SPEC_CTRL*/
SYM_CODE_START(paranoid_entry)ANNOTATE_NOENDBRUNWIND_HINT_FUNCPUSH_AND_CLEAR_REGS save_ret=1ENCODE_FRAME_POINTER 8/** Always stash CR3 in %r14.  This value will be restored,* verbatim, at exit.  Needed if paranoid_entry interrupted* another entry that already switched to the user CR3 value* but has not yet returned to userspace.** This is also why CS (stashed in the "iret frame" by the* hardware at entry) can not be used: this may be a return* to kernel code, but with a user CR3 value.** Switching CR3 does not depend on kernel GSBASE so it can* be done before switching to the kernel GSBASE. This is* required for FSGSBASE because the kernel GSBASE has to* be retrieved from a kernel internal table.*/SAVE_AND_SWITCH_TO_KERNEL_CR3 scratch_reg=%rax save_reg=%r14/** Handling GSBASE depends on the availability of FSGSBASE.** Without FSGSBASE the kernel enforces that negative GSBASE* values indicate kernel GSBASE. With FSGSBASE no assumptions* can be made about the GSBASE value when entering from user* space.*/ALTERNATIVE "jmp .Lparanoid_entry_checkgs", "", X86_FEATURE_FSGSBASE/** Read the current GSBASE and store it in %rbx unconditionally,* retrieve and set the current CPUs kernel GSBASE. The stored value* has to be restored in paranoid_exit unconditionally.** The unconditional write to GS base below ensures that no subsequent* loads based on a mispredicted GS base can happen, therefore no LFENCE* is needed here.*/SAVE_AND_SET_GSBASE scratch_reg=%rax save_reg=%rbxjmp .Lparanoid_gsbase_done.Lparanoid_entry_checkgs:/* EBX = 1 -> kernel GSBASE active, no restore required */movl	$1, %ebx/** The kernel-enforced convention is a negative GSBASE indicates* a kernel value. No SWAPGS needed on entry and exit.*/movl	$MSR_GS_BASE, %ecxrdmsrtestl	%edx, %edxjs	.Lparanoid_kernel_gsbase/* EBX = 0 -> SWAPGS required on exit */xorl	%ebx, %ebxswapgs
.Lparanoid_kernel_gsbase:FENCE_SWAPGS_KERNEL_ENTRY
.Lparanoid_gsbase_done:/** Once we have CR3 and %GS setup save and set SPEC_CTRL. Just like* CR3 above, keep the old value in a callee saved register.*/IBRS_ENTER save_reg=%r15UNTRAIN_RET_FROM_CALLRET
SYM_CODE_END(paranoid_entry)

查看vmlinux:

# cat /boot/System.map-6.5.0-18-generic | grep '\<paranoid_entry\>'
ffffffff822013b0 T paranoid_entry
ffffffff822013b0:       56                      push   %rsi
ffffffff822013b1:       48 8b 74 24 08          mov    0x8(%rsp),%rsi
ffffffff822013b6:       48 89 7c 24 08          mov    %rdi,0x8(%rsp)
ffffffff822013bb:       52                      push   %rdx
ffffffff822013bc:       51                      push   %rcx
ffffffff822013bd:       50                      push   %rax
ffffffff822013be:       41 50                   push   %r8
ffffffff822013c0:       41 51                   push   %r9
ffffffff822013c2:       41 52                   push   %r10
ffffffff822013c4:       41 53                   push   %r11
ffffffff822013c6:       53                      push   %rbx
ffffffff822013c7:       55                      push   %rbp
ffffffff822013c8:       41 54                   push   %r12
ffffffff822013ca:       41 55                   push   %r13
ffffffff822013cc:       41 56                   push   %r14
ffffffff822013ce:       41 57                   push   %r15
ffffffff822013d0:       56                      push   %rsi
ffffffff822013d1:       31 f6                   xor    %esi,%esi
ffffffff822013d3:       31 d2                   xor    %edx,%edx
......
ffffffff82201484:       90                      nop
ffffffff82201485:       90                      nop
ffffffff82201486:       90                      nop
ffffffff82201487:       90                      nop
ffffffff82201488:       90                      nop
ffffffff82201489:       90                      nop
ffffffff8220148a:       90                      nop
ffffffff8220148b:       90                      nop
ffffffff8220148c:       90                      nop
ffffffff8220148d:       90                      nop
ffffffff8220148e:       90                      nop
ffffffff8220148f:       90                      nop
ffffffff82201490:       90                      nop
ffffffff82201491:       90                      nop
ffffffff82201492:       90                      nop

到了ffffffff82201484处都是nop指令。

crash查看:

crash> dis paranoid_entry
0xffffffff974013b0 <paranoid_entry>:    push   %rsi
0xffffffff974013b1 <paranoid_entry+1>:  mov    0x8(%rsp),%rsi
0xffffffff974013b6 <paranoid_entry+6>:  mov    %rdi,0x8(%rsp)
0xffffffff974013bb <paranoid_entry+11>: push   %rdx
0xffffffff974013bc <paranoid_entry+12>: push   %rcx
0xffffffff974013bd <paranoid_entry+13>: push   %rax
0xffffffff974013be <paranoid_entry+14>: push   %r8
0xffffffff974013c0 <paranoid_entry+16>: push   %r9
0xffffffff974013c2 <paranoid_entry+18>: push   %r10
0xffffffff974013c4 <paranoid_entry+20>: push   %r11
0xffffffff974013c6 <paranoid_entry+22>: push   %rbx
0xffffffff974013c7 <paranoid_entry+23>: push   %rbp
0xffffffff974013c8 <paranoid_entry+24>: push   %r12
0xffffffff974013ca <paranoid_entry+26>: push   %r13
0xffffffff974013cc <paranoid_entry+28>: push   %r14
0xffffffff974013ce <paranoid_entry+30>: push   %r15
0xffffffff974013d0 <paranoid_entry+32>: push   %rsi
0xffffffff974013d1 <paranoid_entry+33>: xor    %esi,%esi
0xffffffff974013d3 <paranoid_entry+35>: xor    %edx,%edx
......
0xffffffff97401484 <paranoid_entry+212>:        jmp    0xffffffff97401493 <paranoid_entry+227>
0xffffffff97401486 <paranoid_entry+214>:        int3
0xffffffff97401487 <paranoid_entry+215>:        int3
0xffffffff97401488 <paranoid_entry+216>:        int3
0xffffffff97401489 <paranoid_entry+217>:        int3
0xffffffff9740148a <paranoid_entry+218>:        int3
0xffffffff9740148b <paranoid_entry+219>:        int3
0xffffffff9740148c <paranoid_entry+220>:        int3
0xffffffff9740148d <paranoid_entry+221>:        int3
0xffffffff9740148e <paranoid_entry+222>:        int3
0xffffffff9740148f <paranoid_entry+223>:        int3
0xffffffff97401490 <paranoid_entry+224>:        int3
0xffffffff97401491 <paranoid_entry+225>:        int3
0xffffffff97401492 <paranoid_entry+226>:        int3
0xffffffff97401493 <paranoid_entry+227>:        ret
0xffffffff97401494 <paranoid_entry+228>:        int3
0xffffffff97401495 <paranoid_entry+229>:        int3
0xffffffff97401496 <paranoid_entry+230>:        int3
0xffffffff97401497 <paranoid_entry+231>:        int3

到了0xffffffff97401484:

0xffffffff97401484 <paranoid_entry+212>:        jmp    0xffffffff97401493 <paranoid_entry+227>
0xffffffff97401493 <paranoid_entry+227>:        ret

也是nop指令变成了jmp指令。
这与UNTRAIN_RET_FROM_CALL指令有关。

参考资料

https://ebpf.top/post/ubuntu_kdump_crash/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EDA - Spring Boot构建基于事件驱动的消息系统

文章目录 概述事件驱动架构的基本概念工程结构Code创建事件和事件处理器创建事件总线创建消息通道和发送逻辑创建事件处理器消息持久化创建消息发送事件配置 Spring Boot 启动类测试消息消费运行项目 概述 在微服务架构和大规模分布式系统中&#xff0c;事件驱动架构&#xff…

CAD C# 批量替换当前图中块、标注

本案例功能为选择当前文档中一个块&#xff08;旧块&#xff09;&#xff0c;然后选择新图元&#xff08;新块&#xff09;&#xff0c;运行插件后新块将替换图中所有的旧块。 效果如下&#xff1a; public static class Class1{//选取对象替换块定义[CommandMethod("TT&…

SpringBoot快速使用

一些名词的碎碎念: 1> 俩种网络应用设计模式 C/S 客户端/服务器 B/S 浏览器/服务器 俩者对比: 2> 集群和分布式的概念 集群: 分布式: 例子: 一个公司有一个人身兼多职 集群: 招聘N个和上面这个人一样身兼多职 分布式: 招聘N个人,分担上面这个人的工作,进行工作的拆分. 工…

苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片

美股快讯&#xff1a;苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片 苹果公司计划从明年开始在其设备上改用国产芯片进行蓝牙和Wi-Fi连接&#xff0c;此举将逐步淘汰目前由博通提供的部分部件。这种代号为Proxima的芯片已经开发了数年&#xff0c;现在计划用于…

快速理解分布式事务Seate基本知识

Seata是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式&#xff0c;为用户打造一站式的分布式解决方案。 一.Seate的三大角色 在 Seata 的架构中&#xff0c;一共有三个角色&#xff1a;…

前端项目初始化搭建(二)

一、使用 Vite 创建 Vue 3 TypeScript 项目 PS E:\web\cursor-project\web> npm create vitelatest yf-blog -- --template vue-ts> npx > create-vite yf-blog --template vue-tsScaffolding project in E:\web\cursor-project\web\yf-blog...Done. Now run:cd yf-…

多模态大模型(二)——用Transformer Encoder和Decoder的方法(BLIP、CoCa、BEiTv3)

文章目录 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要&#xff0c;一个很有效的、根据图片生成caption的工具1. BLIP的研究动机2. BLIP的模型结构3. CapFilt Model4. BLIP的训练过程 CoCa: C…

【理想汽车中科院】基于模仿学习的端到端自动驾驶数据缩放规律

论文: https://arxiv.org/pdf/2412.02689 项目: https://github.com/ucaszyp/Driving-Scaling-Law 0. 摘要 端到端自动驾驶范式因其可扩展性而最近吸引了大量关注。然而&#xff0c;现有方法受到现实世界数据规模有限的制约&#xff0c;这阻碍了对端到端自动驾驶相关扩展规律…

【工具介绍】可以批量查看LableMe标注的图像文件信息~

在图像处理和计算机视觉领域&#xff0c;LabelMe是一个广泛使用的图像标注工具&#xff0c;它帮助我们对图像中的物体进行精确的标注。但是&#xff0c;当标注完成后&#xff0c;我们常常需要一个工具来批量查看这些标注信息。 今天&#xff0c;我要介绍的这款exe程序&#xf…

链式栈的实现及其应用

目录 一、链式栈结构模型 二、链式栈的实现 2.1创建 2.2压栈 2.3出栈 2.4判断栈是否为空 2.5查看栈顶 2.6释放栈 三、应用 链式栈实际上就是基于链表&#xff0c;压栈和弹栈可分别看作头插和头删&#xff0c;链表尾部就是栈底&#xff0c;头指针就是栈顶指针 一、链式…

day12 接口测试 ——入门→精通→实战(1)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、接口测试分类 1.1 内部接口&#xff1a; 1.2 外部接口&#xff1a; 2、目前接口架构设计 2.1、基于SOAP架构&#xff0c; 2.2、基于RPC架构&#xff0c; 2.3、基于RestFul架构&#xff0c; 2.3.1…

程序的调试

一名优秀的程序员也是一名出色的侦探&#xff0c;每一次调试都是尝试破案的过程 目录 前言 一、什么是调试&#xff1f; 二、调试 1.调试是什么 2.基本步骤 三、调试注意事项 1.怎么写出易于调试的代码 assert(断言) const 2.常见错误 总结 前言 主要是怎么调试&#xff0c;调…

FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…

25.DDD数量关系

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗&#xff1f;领域对象之…

每天40分玩转Django:Django视图和URL

Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…

语言模型(序列模型)

终于快要毕业了&#xff0c;乘着还在还在研究室&#xff0c;把最后一章sequence模型也学完吧。 Sequence Model 一&#xff1a;基础知识1&#xff1a;符号的定义2&#xff1a;词典(Vocabulary) 与编码(Encoding) 二&#xff1a;RNN(Recurrent Neural Networks) 循环神经网络1&…

【自然语言处理与大模型】使用llama.cpp将HF格式大模型转换为GGUF格式

llama.cpp的主要目标是在本地和云端的各种硬件上以最小的设置和最先进的性能实现LLM推理。是一个专为大型语言模型&#xff08;LLM&#xff09;设计的高性能推理框架&#xff0c;完全使用C和C编写&#xff0c;没有外部依赖&#xff0c;这使得它可以很容易地被移植到不同的操作系…

npm : 无法加载文件 D:\nodejs\npm.ps1

问题描述 npm run serve 启动一个Vue项目&#xff0c;报错如下&#xff1a; npm : 无法加载文件 D:\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…

线程池+线程安全+常见锁

目录 一、线程池1、日志与策略模式2、线程池设计3、线程安全的单例模式&#xff08;1&#xff09;单例模式的特点&#xff08;2&#xff09;饿汉实现方式和懒汉实现方式&#xff08;i&#xff09;饿汉方式实现单例模式&#xff08;ii&#xff09;懒汉方式实现单例模式&#xff…

数据结构6.4——归并排序

基本思想&#xff1a; 归并排序是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用。将已有的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个…