通过qemu和crash分析崩溃内核

菜鸟笔记--移植linux内核卡在[ 2.032055] Memory Limit: none 最近移植linux内核到开发板时,启动过程中出现如下信息,卡在[ 2.032055] Memory Limit: none过不去。 [ 1.988722] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null) [ 1.996933] VFS: Mounted root (ext3 filesystem) readonly on device 179:2. [ 2.006997] dev 阅读详情

背景

        在产品研发过程中,有时候会遇到linux内核崩溃,在内核崩溃的时候一般会打印出奔崩位置的上下文、调用栈等。一般简单的问题通过查看内核崩溃时打印出来的日志就能大概判断出是哪里出了问题,但是如果遇到复杂的问题,单纯通过崩溃的日志是难以定位到问题根因的,这时候我们可以把内存ddr里的数据dump出来,然后通过工具crash查看崩溃时内核里的状态和数据,并作进一步的分析,最终找到问题的rootcause。

        在实际硬件产品中,在内核崩溃重启后,一般都是通过bootloader来dump出ddr里的数据,然后再拷贝到开发机上通过crash工具分析。为了方便起见,我们这里通过qemu的arm64模拟器来跑linux内核,然后让内核触发panic,再通过qemu来dump出模拟器内存里的数据,最后再用crash工具分析崩溃内核的dump文件。

        关于使用qemu跑linux内核的详细步骤请参考搭建qemu运行arm64 Linux环境这篇文章。

生成crash工具

crash简介

        crash工具是redhat公司的提供的一个开源的内核分析工具,它是在gdb的基础上实现了解析内核的功能,比如查看当前内核中存在的哪些线程、各个线程的堆栈、内存的使用情况、触发panic时栈中的各个变量的值等等。crash的在github上的主页地址:https://crash-utility.github.io/,如下:

图片

下载crash源码

        crash发布的各个release版本的汇总地址为:https://github.com/crash-utility/crash/releases,在github上的仓库地址为https://github.com/crash-utility/crash,当前最新的release版本是crash-8.0.4,这里我们下载这个最新版本的源码压缩包如下:

图片

编译crash源码

我们先在ubuntu上安装编译crash源码需要用到的工具,命令如下:

sudo apt install zlib1g-dev
sudo apt install libncurses5-dev

解压编译crash源码,然后编译适用于arm64平台的crash工具,命令和日志如下:

max@ubuntu2204:~$ tar xf crash-8.0.4.tar.gz
max@ubuntu2204:~$ cd crash-8.0.4/
max@ubuntu2204:~/crash-8.0.4$ make target=arm64
TARGET: ARM64
 CRASH: 8.0.4
   GDB: 10.2
……
……
ar: creating crashlib.a
  CXXLD  gdb
make[3]: Nothing to be done for 'all-target'.
max@ubuntu2204:~/crash-8.0.4$

查看生成的 crash 工具,如下:

max@ubuntu2204:~/crash-8.0.4$ file crash
crash: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=84677c50d0725597490901c46f45a35c1174ec1b, for GNU/Linux 3.2.0, with debug_info, not stripped

继续编译crash工具的扩展动态库:

max@ubuntu2204:~/crash-8.0.4$ make target=arm64 extensions
gcc -Wall -g -shared -rdynamic -o dminfo.so dminfo.c -fPIC -DARM64  -DGDB_10_2
gcc -Wall -g -shared -rdynamic -o echo.so echo.c -fPIC -DARM64  -DGDB_10_2
eppic.so: failed to pull eppic code from git repo
gcc -Wall -g -I. -shared -rdynamic -o snap.so snap.c -fPIC -DARM64  -DGDB_10_2
max@ubuntu2204:~/crash-8.0.4$

生成的扩展动态库如下:

max@ubuntu2204:~/crash-8.0.4$ ls extensions/*so
extensions/dminfo.so  extensions/echo.so  extensions/snap.so

crash源码包中包含的扩展动态库的源码比较少,如果需要使用trace等其他扩展功能,可以从https://crash-utility.github.io/extensions.html下载对应的源码,并放到crash源码中的 extensions 目录下,最后再执行编译make target=arm64 extensions 编译扩展动态库即可。

生成Image和vmlinux文件

        我们在编译内核镜像Image时会同时生成一个对应的vmlinux文件,vmlinux是内核静态链接生成的可执行文件,包含了内核的符号表等调试信息,在用crash工具解析内核的dump文件时,需要用到该dump文件对应的内核的vmlinux,这样crash才能正确解析内核里的数据。

        内核源码的下载的详细步骤请参考 获取Linux内核源码 这篇文章,arm64交叉编译器的安装和内核源码编译的详细过程请参考 搭建qemu运行arm64 Linux环境 这篇文章,这里就不再赘述。我们把交叉编译器添加到PATH环境变量,并下载linux6.1.0的内核源码,命令如下:​​​​​​​

PATH=/home/max/cross-compiler/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git -b linux-6.1.y
cd linux-stable/

linux6.1.0内核源码的默认配置中使能了"Reduce debugging information" 这个配置,这个配置会导致crash找不到内核的调试信息从而解析失败。我们先通过menuconfig菜单来关闭这个配置,命令如下:

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build menuconfig

在menuconfig菜单中依次选择如下选项:​​​​​​​

-> Kernel hacking    -> Compile-time checks and compiler options        -> Reduce debugging information (DEBUG_INFO_REDUCED [=n])

关闭该配置后的界面如下:

图片

然后使能内核的 "RAM block device support" 这个配置,让内核能挂载上文件系统,这里我们调整"Default RAM disk size"的值为65536,界面如下:

图片

保存后退出menuconfig,然后开始编译内核,命令和日志如下:​​​​​​​

max@ubuntu2204:~/linux-stable$ make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build -j8
make[1]: Entering directory '/home/max/linux-stable/build'
  SYNC    include/config/auto.conf.cmd
  GEN     Makefile
……
……
  LD      vmlinux
  NM      System.map
  SORTTAB vmlinux
  OBJCOPY arch/arm64/boot/Image
  GZIP    arch/arm64/boot/Image.gz
make[1]: Leaving directory '/home/max/linux-stable/build'
max@ubuntu2204:~/linux-stable$

查看生成的内核Image和对应的vmlinux文件,如下:​​​​​​​

max@ubuntu2204:~/linux-stable$ file build/arch/arm64/boot/Image
build/arch/arm64/boot/Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages
max@ubuntu2204:~/linux-stable$ 
max@ubuntu2204:~/linux-stable$ file build/vmlinux
build/vmlinux: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=bcefe411be529b3d592a4e2202124e062c042b5b, with debug_info, not stripped

到此适用于arm64平台的linux内核的Image和vmlinux文件就生成好了!

通过qemu运行内核

        用qemu模拟器跑linux内核时需要挂载文件系统,所以我们还需要制作包含busybox程序的initrd文件系统镜像,制作步骤请参考 搭建qemu运行arm64 Linux环境 这篇文章,这里就不再赘述。

        我们选择用ARMv8的64位CPU cortex-a57来运行linux内核,由于后面要用crash工具来分析该内核对应的dump文件,所以这里qemu要给内核传递一个nokaslr 参数,让内核关闭KASLR(内核地址空间布局随机化),这样crash才能解析该内核对应的dump文件。由于命令参数过长,方便起见,我们把运行qemu模拟器的命令写到一个脚本qemu.sh中,脚本如下:

#!/bin/bash
set -x

QEMU=~/qemu-8.2.0
KERNEL=~/linux-stable
INITRD=~/make_initrd
$QEMU/build/aarch64-softmmu/qemu-system-aarch64 \
-nographic \
-M virt \
-cpu cortex-a57 \
-smp 8 \
-m 2G \
-kernel $KERNEL/build/arch/arm64/boot/Image \
-append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
-initrd $INITRD/initrd.ext4

运行上面的脚本qemu.sh来通过模拟器运行刚才编译的内核Image,命令和日志如下:

max@ubuntu2204:~$ sh qemu.sh 
+ QEMU=/home/max/qemu-8.2.0
+ KERNEL=/home/max/linux-stable
+ INITRD=/home/max/make_initrd
+ /home/max/qemu-8.2.0/build/aarch64-softmmu/qemu-system-aarch64 -nographic -M virt -cpu cortex-a57 -smp 8 -m 2G -kernel /home/max/linux-stable/build/arch/arm64/boot/Image -append nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0 -initrd /home/max/make_initrd/initrd.ext4
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070]
[    0.000000] Linux version 6.1.72 (max@ubuntu2204) (aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_Binutils-2019.12) 2.28.2.20170706) #6 SMP PREEMPT Sat Jan 20 11:32:43 CST 2024
[    0.000000] random: crng init done
[    0.000000] Machine model: linux,dummy-virt
……
……
[    2.274459] Freeing unused kernel memory: 7552K
[    2.276233] Run /linuxrc as init process
[    2.403193] EXT4-fs (ram0): re-mounted. Quota mode: none.
Welcome to ARM64 Linux

Please press Enter to activate this console. 
~ # 
~ #

qemu模拟器跑起来内核后,我们在模拟器里通过sysrq让内核触发panic,命令和日志如下:

~ # 
~ # echo c > /proc/sysrq-trigger 
[   20.107747] sysrq: Trigger a crash
[   20.108570] Kernel panic - not syncing: sysrq triggered crash
[   20.109427] CPU: 2 PID: 140 Comm: sh Not tainted 6.1.72 #6
[   20.110033] Hardware name: linux,dummy-virt (DT)
[   20.110833] Call trace:
[   20.111345]  dump_backtrace.part.6+0xf0/0x100
[   20.111930]  show_stack+0x18/0x28
[   20.112292]  dump_stack_lvl+0x68/0x84
[   20.112607]  dump_stack+0x18/0x38
[   20.112947]  panic+0x19c/0x388
[   20.113336]  sysrq_handle_crash+0x1c/0x20
[   20.114123]  __handle_sysrq+0xbc/0x1b0
[   20.114612]  write_sysrq_trigger+0x70/0xa8
[   20.115142]  proc_reg_write+0xc8/0x100
[   20.115276]  vfs_write+0x138/0x450
[   20.115868]  ksys_write+0x6c/0x100
[   20.116035]  __arm64_sys_write+0x1c/0x28
[   20.116363]  invoke_syscall+0x44/0x100
[   20.116674]  el0_svc_common.constprop.3+0x6c/0xf0
[   20.117049]  do_el0_svc+0x2c/0xc8
[   20.117332]  el0_svc+0x20/0x60
[   20.117547]  el0t_64_sync_handler+0x98/0xc0
[   20.117758]  el0t_64_sync+0x170/0x174
[   20.118457] SMP: stopping secondary CPUs
[   20.119547] Kernel Offset: disabled
[   20.119739] CPU features: 0x88000,2023c080,0000421b
[   20.120348] Memory Limit: none
[   20.120945] ---[ end Kernel panic - not syncing: sysrq triggered crash ]---

生成内核dump文件

        在qemu里的内核panic后,我们让qemu进入monitor控制台,即需要先按下ctrl+a,松开后,再按c,这样就进入monitor控制台命令行了,如下:​​​​​​​

[   20.120348] Memory Limit: none
[   20.120945] ---[ end Kernel panic - not syncing: sysrq triggered crash ]---
QEMU 8.2.0 monitor - type 'help' for more information
(qemu) 
(qemu)

在monitor 命令行下执行 dump-guest-memory dump.img命令,把模拟器内存里的数据保存到dump.img 文件中,然后输入q退出qemu,这时候在当前目录就可以看到生成的 dump.img 镜像文件,命令和日志如下:​​​​​​​

(qemu) dump-guest-memory dump.img
(qemu) 
(qemu) q
max@ubuntu2204:~$
max@ubuntu2204:~$ file dump.img 
dump.img: ELF 64-bit LSB core file, ARM aarch64, version 1 (SYSV), SVR4-style

到此崩溃内核的dump文件就制作完成了。

通过crash分析内核dump文件

        在通过crash 解析arm64 平台上的dump文件时,需要给crash指定一些相关的参数,我们通过crash --help命令查看需要指定哪些参数,如下:

max@ubuntu2204:~$ ./crash-8.0.4/crash --help
  ……
  ……
  -m option=value
    --machdep option=value
      Pass an option and value pair to machine-dependent code.  These
      architecture-specific option/pairs should only be required in
      very rare circumstances:
      ……
      …….
      ARM64:
        phys_offset=<physical-address>
        kimage_voffset=<kimage_voffset-value>
        max_physmem_bits=<value>
        vabits_actual=<value>

​​​​​​​通过crash的help信息可知,我们需要指定参数vabits_actual,即内核配置的虚拟地址的有效bit数,这个配置我们可以内核源码中搜索CONFIG_ARM64_VA_BITS的配置获取,如下:​​​​​​​

max@ubuntu2204:~$ grep -r CONFIG_ARM64_VA_BITS  linux-stable/arch/arm64/configs/defconfig 
CONFIG_ARM64_VA_BITS_48=y
max@ubuntu2204:~$

同时还需要告诉crash要解析的dump文件对应的vmlinux在哪里,所以最终用crash解析内核dump文件的命令和日志如下:

max@ubuntu2204:~$ ./crash-8.0.4/crash dump.img linux-stable/build/vmlinux --machdep vabits_actual=48
crash 8.0.4
Copyright (C) 2002-2022  Red Hat, Inc.
……
……
      KERNEL: linux-stable/build/vmlinux
    DUMPFILE: dump.img
        CPUS: 8 [OFFLINE: 7]
        DATE: Sat Jan 20 14:02:56 CST 2024
      UPTIME: 00:02:21
LOAD AVERAGE: 2.60, 1.00, 0.37
       TASKS: 97
    NODENAME: (none)
     RELEASE: 6.1.72
     VERSION: #6 SMP PREEMPT Sat Jan 20 11:32:43 CST 2024
     MACHINE: aarch64  (unknown Mhz)
      MEMORY: 2 GB
       PANIC: "Kernel panic - not syncing: sysrq triggered crash"
         PID: 140
     COMMAND: "sh"
        TASK: ffff000006380ec0  [THREAD_INFO: ffff000006380ec0]
         CPU: 2
       STATE: TASK_RUNNING (PANIC)

crash>

当打印出上面的版本信息并出现 “crash >” 的提示符的时候,就表示内核的dump文件解析成功了!此时我们就可以在crash内输入各种命令来查看内核里的数据和状态,比如通过ps命令查看当前内核中有哪些任务,通过log命令查看内核ringbuffer里的日志,如下:

crash> ps
      PID    PPID  CPU       TASK        ST  %MEM      VSZ      RSS  COMM
>       0       0   0  ffff80000a0a3f80  RU   0.0        0        0  [swapper/0]
>       0       0   1  ffff00000294e740  RU   0.0        0        0  [swapper/1]
        0       0   2  ffff000002960000  RU   0.0        0        0  [swapper/2]
>       0       0   3  ffff000002960ec0  RU   0.0        0        0  [swapper/3]
>       0       0   4  ffff000002961d80  RU   0.0        0        0  [swapper/4]
>       0       0   5  ffff000002962c40  RU   0.0        0        0  [swapper/5]
>       0       0   6  ffff000002963b00  RU   0.0        0        0  [swapper/6]
>       0       0   7  ffff0000029649c0  RU   0.0        0        0  [swapper/7]
        1       0   2  ffff0000028b8000  IN   0.0     2276     1224  linuxrc
……
……
crash> 
crash> log
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd070]
[    0.000000] Linux version 6.1.72 (max@ubuntu2204) (aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_Binutils-2019.12) 2.28.2.20170706) #6 SMP PREEMPT Sat Jan 20 11:32:43 CST 2024
[    0.000000] random: crng init done
……
……
[   20.119739] CPU features: 0x88000,2023c080,0000421b
[   20.120348] Memory Limit: none
[   20.120945] ---[ end Kernel panic - not syncing: sysrq triggered crash ]---
crash>

到此我们就成功的通过crash工具解析了崩溃的内核!

        crash的使用方法可以通过执行crash –help命令查看,也可以参考crash官方的白皮书:https://crash-utility.github.io/crash_whitepaper.html。后面我们还会有专门的文章来详细介绍crash的使用方法和技巧,并且通过项目实例来讲解怎么通过crash来分析内核的稳定性问题。

请关注微信公众号 “Linux研习社” 获取更多技术内容:

【内核崩溃kdump(sysdump)和crash分析】 kdump实现了"双内核"布局,Kdump 在内核在内核panic后,立即调用kexec 引导到转储捕获内核(capture kernel),使用 kexec 引导 “覆盖” 当前运行的内核。该“转储捕获内核”的内存区域由主内核的bootargs参数 crashkernel 或dts指定。“转储捕获内核”可以是专门build的单独 Linux 内核image,也可以在支持可重定位内核的系统架构上重用主内核映像。 阅读详情

相关推荐

内核报非法指令,分析方法(undefined instruction: pc=00000000000c0dbc)

操作系统内部会对中断,异常进行处理等。其中有一类异常叫未定义指令undefined instruction,CPU遇到了不认识的指令,则会进入未定义指令异常处理函数,因为CPU不认识该指令,所以通常CPU遇到非法指令,则无法继续执行,会使内核崩溃panic。但在崩溃前会操作系统会打印一些debug信息,供工程师分析。 如下log,内核启动过程中调用用户态modprobe程序,而modprobe执...

于宸 1万+

Linux kernel debug技巧----开启DEBUG选项

本文转载至:http://www.wowotech.net/linux_application/kernel_debug_enable.html kernel的source code中有很多使用pr_debug/dev_dbg输出的日志信息(例如device tree解析的代码,drivers/of/fdt.c)。默认情况下,kernel不会将这些日志输出到控制台上,除非: 1

闲云孤鹤 1万+

Linux内核panic原理分析与实战调试指南

内核panic是Linux操作系统遇到不可恢复错误时的自我保护机制,类似于计算机系统的'紧急制动'。其核心原理是通过硬件异常检测和软件保护机制,在内存访问违规、数据结构损坏或硬件故障等致命错误发生时主动终止系统。从技术价值看,这种机制虽然导致服务中断,但能防止数据损坏和安全漏洞扩散。在云计算、嵌入式设备等场景中,理解panic机制对保障系统稳定性至关重要。通过分析panic日志中的内存地址、调用栈等热词信息,结合addr2line、kdump等工具,开发者可以快速定位空指针解引用、内存越界等典型问题。本文以

weixin_32183107的博客 270

展讯平台 Sysdump log解析

一.初步定为分析 在ylog的phone.info中搜索关键词bootmode 例如: [ro.bootmode]: [panic] 可以确定是kenel panic导致的手机重启 二.Kernel Panic的产生的原因 panic 是英文中是惊慌的意思,Linux Kernel panic正如其名,linux kernel不知道如何走了,它会尽可能把它此时能获取的全部信息都打印...

liu362732346的博客 4506

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

weixin_46525734的博客 1967

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1637

实例演示 | 用Kdump分析内核奔溃原因

本文主要介绍kdump服务和crash的使用,并结合一个简单的实例演示如何分析内核奔溃的原因。本文基于linux kernel 4.19, 体系结构为aarch64。kdump概述kdumpkdump 是一种先进的基于 kexec 的内核崩溃转储机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。当内核产生错误时,kdump会将内存导出为v...

Peter的专栏 1203

深入Linux内核:PTP硬件时间戳(HW Timestamp)是如何炼成的?

本文深入探讨了Linux内核中PTP硬件时间戳(HW Timestamp)的实现原理与实战应用。通过分析IEEE 1588协议在网络时间同步中的关键作用,详细解析了硬件时间戳在Linux内核中的架构设计、驱动开发及性能优化技巧,帮助开发者实现纳秒级精度的时间同步。

weixin_30727835的博客 651

Linux:kdump 调试指南

Linux,kdump,crashdump

JiMoKuangXiangQu的专栏 1092

基于STM32F427的模拟SSI协议绝对式编码器位置反馈通信

基于STM32F427的模拟SSI协议绝对式编码器位置反馈通信

xeke997的博客 6064

霍尔安装歪了也能用?揭秘无感FOC中的‘霍尔自学习’黑科技,实现信号线自适应

本文揭秘了无感FOC中的‘霍尔自学习’黑科技,即使霍尔安装歪了或信号线接错,电机仍能平稳运转。该技术通过算法创新解决了传统霍尔方案的安装公差、接线容错和校准成本问题,显著提升了电机控制的可靠性和效率。文章详细解析了自学习算法的实现架构、关键技术及工程实践中的优化方案,展示了其在工业应用中的卓越性能。

weixin_28309571的博客 463

Linux内核学习5--Linux驱动的调试(TODO)

printk` 是最简单和最常用的方法,但对于复杂的驱动程序,使用 `gdb`、`ftrace`、`kprobes`、`kgdb` 等工具可以提供更深入的调试能力。- 使用 `kgdb`(Kernel GNU Debugger)或 `kgdboc`(Kernel GNU Debugger over Console)来调试内核模块。`kgdb` 是用于调试运行中的 Linux 内核的调试工具。通过 `/sys` 和 `/proc` 文件系统,可以访问和检查内核状态、驱动程序状态、设备配置等信息。

fanged的专栏 1124

ZYNQ 系统的IEEE1588 实现方法

zynq IEEE588/PTP 实现方案(讨论稿)

姚家湾博客 1万+

Linux内核调试方法总结

一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_stack() 五  printk() 1  printk函数的健壮性 2  printk函数脆弱之处 3  LOG等级 4  记录缓冲区 5  syslogd/klogd 6  dmesg

bugouyonggan的专栏 549

uniapp [安卓苹果App端] - 实现微信支付功能+拉起微信付款支付后返回本app页面,详解uniApp如何唤起本机微信app并跳转到支付页面全流程及示例源码(uniapp实现微信支付,可打包)

uni-app项目在APP端使用微信支付功能,uniapp前端实现微信支付,uniapp开发安卓App对接微信支付,uniapp苹果ios唤起微信支付,uniapp调用微信支付uniapp开发app-调用微信支付,uniapp开发安卓苹果app如何接入微信支付,前后端应该怎么做,UniApp中实现微信支付功能,支付报错,调起失败没响应,uniapp苹果微信支付唤起实现,app唤起微信支付,拉起微信支付,uniapp中唤醒微信进行支付并返回app,uniApp调起微信支付失败报错,全网最详细的uniapp微信

🏆 前端领域优质创作者 1万+

磁悬浮分子泵:起源、现状与未来趋势深度解析

摘要 磁悬浮分子泵作为高真空获取的关键设备,通过磁悬浮技术实现转子无接触高速运转,大幅提升了真空系统的性能和可靠性。本文系统梳理了分子泵从机械轴承到磁悬浮的技术演变历程,分析了当前行业格局及主要厂商产品特性,包括爱德华兹、普发真空等国际巨头的技术优势。研究进一步探讨了磁悬浮分子泵在半导体制造、科研设备等领域的核心应用,通过数学模型揭示了其性能参数关系。最后,展望了未来在智能化、节能化等方面的发展趋势,为相关领域的技术创新提供参考。 关键词:磁悬浮分子泵;高真空技术;半导体制造;科研设备;技术发展

技术工作者 690

Linux内核模块调试技巧与实战指南

Linux内核模块调试是系统开发中的关键技术,涉及printk日志、proc文件系统、kprobes动态插桩等核心方法。内核调试与用户空间程序调试不同,需要处理系统崩溃风险,掌握Oops分析和内存泄漏检测等高级技巧。通过ftrace性能分析和crash工具,开发者可以快速定位模块问题。本文结合实战案例,详解如何配置QEMU调试环境和kdump崩溃转储,帮助开发者提升内核模块开发效率与稳定性。

weixin_31714129的博客 248

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一文教你用Kdump分析内核崩溃原因(实例演示 ~)

克转储kdump 是一种基于 kexec 的内核崩溃转储机制,用来捕获内核 crash(内核崩溃)的时候产生的 crash dump。当内核产生错误时,kdump会将内存导出为vmcore保存到磁盘。kdump流程当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核启动时会保留一段内存给kdump用。kdump的配置系统启动时为crashkernel保留内存。

youzhangjing_的博客 4002

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux内核调试之kdump

kdump原理和crash 工具的使用

Hober 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

crash常用命令讲解

crash工具是redhat公司的提供的一个开源的内核分析工具,它是在gdb的基础上实现了解析内核的功能,比如查看各个线程的内核栈、各任务的状态、内存的使用情况、中断的统计计数等等,我们可以根据当前内核里的数据来分析一些偶现的稳定性问题。

linux_research的博客 3296

FT2000+ qemu kvm openEuer crash 分析 频繁设置CPU online及cgroup导致进程卡死、不调度故障

内核版本信息突然就坚挺起来,长时间稳定运行。。。

hknaruto的专栏 1292

编译内核/kdump/crash

练习题1. 启动错误,无法正常开机2. 为了解决1,需要crash定位,再重新编译内核,但你可能遇到编译错误3. 正常vCPU或热插大于某值时可能出现错误,请寻找边界值,并解决cpu数限制问题目标:虚拟机正常启动,熟悉编译内核流程和工具,解决编译过程中的各种问题,争取搞清BUG的原因。 1. 使用qemu-nbd挂载qcow2镜像qemu-nbd工具是:QEMU Disk Networ...

abnc8791的博客 408

从Oops到Fix:用Crash工具解剖Linux内核转储文件全流程

本文详细介绍了如何使用Crash工具分析Linux内核转储文件,从Oops信息提取到最终问题修复的全流程。通过实战案例和高级调试技巧,帮助开发者快速定位和解决内核崩溃问题,提升系统稳定性。文章涵盖了kdump配置、vmcore生成、反汇编分析以及典型崩溃场景的解决方案。

xk7n92h3p5m的博客 715

linux内核探秘pdf_内核崩溃了怎么办笨叔叔在开源峰会上的分享干货别错过!

今天有一个大消息要宣布事情是这样的...一直悄咪咪关注大家的奥特曼越来越觉得关注内核之旅的小可爱们真是要知识有知识,要文化有文化能文能武,可萌可刚6月25号上海的OSS China峰会,重大事件曼曼给你捋一捋~此次幸运的是,笨叔和ubuntu的大牛Gavin为我们分享了kdump+crash工具,它可以很方便地帮助我们分析系统的假死机和panic,也就是分析系统死机黑屏无响应等问题,研究...

weixin_30702441的博客 269

Linux内核中的调试技术详解

内核调试是指在Linux内核开发和维护过程中,通过各种工具和技术来定位、分析和解决内核中的问题。内核调试的目的是找出内核中的错误、性能问题和安全漏洞,并提供解决方案。

jiang_style的博客 1099

Linux内核调试:GDB与QEMU实战指南

内核调试是Linux系统开发中的关键技术,涉及底层硬件控制和系统稳定性保障。通过调试工具可以分析系统运行状态、定位复杂问题,在驱动开发、性能优化等场景发挥关键作用。GDB作为通用调试器,配合QEMU虚拟化环境,为内核调试提供了可靠方案。这种方法无需专用硬件,支持断点设置、变量监控等核心功能,特别适合模块开发、启动过程分析等场景。printk和ftrace等原生工具可辅助验证调试结果,而KASLR禁用、调试符号加载等技巧能提升调试效率。掌握这些方法对操作系统开发、嵌入式系统调试等工程实践具有重要意义。

weixin_33824363的博客 346
上一篇: 搭建qemu运行arm64 Linux环境
下一篇: crash常用命令讲解
Linux研习社
博客等级 码龄3年 164粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值