做网站公司赚钱么网站做优化有几种方式

张小明 2026/1/7 19:19:38
做网站公司赚钱么,网站做优化有几种方式,张家界做网站的,服装品牌网站开发php1 系统简介 当 Linux 系统内核发生崩溃的时候#xff0c;可以通 KEXECKDUMP 等方式收集内核崩溃之前的内存#xff0c;生成一个转储文件 vmcore。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因#xff0c;从而进行操作系统的代码改进。主要用于分析以下问题…1 系统简介当 Linux 系统内核发生崩溃的时候可以通 KEXECKDUMP 等方式收集内核崩溃之前的内存生成一个转储文件 vmcore。内核开发者通过分析该 vmcore 文件就可以诊断出内核崩溃的原因从而进行操作系统的代码改进。主要用于分析以下问题场景• Android 系统内存泄露导致的卡顿、 ANR 重启问题• Linux 内核软件 Panic Oops 崩溃问题、死锁问题• Linux 内核态 Memory overflow 内存溢出、 OOM 内存分配失败问题2 Crash 工具使用方法和分析免费crash工具资源下载路径。2.1 CrashDump 分析所需资源Crashdump 需要的资源如下需要小机固件对应的内核符号表 vmlinux。• linux-5.4 及以后放在 longan 目录下的 out/kernel/build• linux-4.9 放在内核目录下注 linux-5.4 可以到 longon/build 目录下执行 getvmlinux.sh 固件路径会在该目录生成一个 output 目录里面包含了固件的 vmlinux。crash 解析程序 crash_arm6432 位为 crash_arm跟版本相关。2.2 解析内存镜像将 crash_arm(64) vmlinux 以及 dump 出来的内存镜像放到同一个目录下然后执行以下指令解析内存镜像linux-4.9 下使用这条指令./crash_arm64 vmlinux dram_data_201912101133240x40000000linux-5.4 下使用这条指令./crash_arm64 vmlinux dram_data_20205141926340x40000000--machdep vabits_actual39--machdep kimage_voffset0xffffffbfd0000000linux-5.10 及 linux-5.15 下使用这条指令注意需要使用 8.0.1 版本的工具./crash_arm64 vmlinux dram_data_2022920933220x40000000--machdep vabits_actual39--machdep kimage_voffset0xffffffbfc8000000--kaslr0x80000参数的解释• vmlinux当前固件对应的 vmlinux版权所有 © 珠海全志科技股份有限公司。保留一切权利 13文档密级秘密• dram_data_2020514192634 dump 出来的数据文件名或者通过 decrypt 工具进行解密后的文件名• 0x40000000 自定义的 dram 的起始地址由 Memory Map Spec 指定• vabits_actual39设置访问的位宽通过 CONFIG_ARM64_VA_BITS_39 进行配置• machdep kimage_voffset0xffffffbfd0000000指定内核镜像的偏移地址不便于计算可在内核中添加打印获取其值• -kaslr 0x80000 kaslr 特性会对内核加载地址做 relocation使能该特性后内核实际映射的运行时地址和链接地址是不一样的中间差距 kaslr offset 值crash 时dump_kernel_offset 函数会打印具体的值。若编译的固件为 ARM32则使用 crash_arm32 工具和以下指令进行解析建议使用高版本的 crash_arm32 工具进行解析./crash_arm32 vmlinux dram_data_201912101133240x40000000如需调试请优先考虑从固件中解压 vmlinux。使用方法如下• 使用脚本进行提取 vmlinux脚本存放路径为 build/getvmlinux.sh。./getvmlinux.shaw-format-firmware2.3 常见命令使用解析完内存镜像后会进去控制台常见的指令如下bt显示调用堆栈crash_arm64bt-f PID:1191TASK:ffffff8046b1da00 CPU:0COMMAND:kworker/0:2Hbt:WARNING:cannot determine starting stack framefortask ffffff8046b1da00 crash_arm64bt-a # 查看当前SOC内所有CPU的任务堆栈 PID:1191TASK:ffffff8046b1da00 CPU:0COMMAND:kworker/0:2Hbt:WARNING:cannot determine starting stack framefortask ffffff8046b1da00 PID:0TASK:ffffff80c01eec00 CPU:1COMMAND:swapper/1bt:WARNING:cannot determine starting stack framefortask ffffff80c01eec00 PID:0TASK:ffffff80c01e9200 CPU:2COMMAND:swapper/2bt:WARNING:cannot determine starting stack framefortask ffffff80c01e9200 PID:0TASK:ffffff80c01f9200 CPU:3COMMAND:swapper/3bt:WARNING:cannot determine starting stack framefortask ffffff80c01f9200 PID:0TASK:ffffff80c01f8000 CPU:4COMMAND:swapper/4bt:WARNING:cannot determine starting stack framefortask ffffff80c01f8000 PID:2022TASK:ffffff8084915a00 CPU:5COMMAND:irq/297-gt9xxbt:WARNING:cannot determine starting stack framefortask ffffff8084915a00 PID:0TASK:ffffff80c01fb600 CPU:6COMMAND:swapper/6bt:WARNING:cannot determine starting stack framefortask ffffff80c01fb600 PID:0TASK:ffffff80c01fa400 CPU:7COMMAND:swapper/7bt:WARNING:cannot determine starting stack framefortask ffffff80c01fa400log/dmesg显示内核死机前打印信息crash_arm64log[33108.133841]sunxi-mmc4022000.sdmmc:sdc set ios:clk52000000Hz bm PP pm ON vdd23width8timing MMC-HS200 dt B[33108.146503]sunxi-mmc4022000.sdmmc:sdc set ios:clk150000000Hz bm PP pm ON vdd23width8timing MMC-HS200 dt B[33108.161514]sunxi-mmc4022000.sdmmc:sdc set ios:clk150000000Hz bm PP pm ON vdd23width8timing MMC-HS(SDR20)dt B[33108.175606]sunxi-mmc4022000.sdmmc:sdc set ios:clk52000000Hz bm PP pm ON vdd23width8timing MMC-HS(SDR20)dt B[33108.189617]sunxi-mmc4022000.sdmmc:sdc set ios:clk50000000Hz bm PP pm ON vdd23width8timing MMC-HS400 dt B[33108.202060]sunxi-mmc4022000.sdmmc:sdc set ios:clk150000000Hz bm PP pm ON vdd23width8timing MMC-HS400 dt B crash_arm64dmesg[33108.133841]sunxi-mmc4022000.sdmmc:sdc set ios:clk52000000Hz bm PP pm ON vdd23width8timing MMC-HS200 dt B[33108.146503]sunxi-mmc4022000.sdmmc:sdc set ios:clk150000000Hz bm PP pm ON vdd23width8timing MMC-HS200 dt B[33108.161514]sunxi-mmc4022000.sdmmc:sdc set ios:clk150000000Hz bm PP pm ON vdd23width8timing MMC-HS(SDR20)dt B[33108.175606]sunxi-mmc4022000.sdmmc:sdc set ios:clk52000000Hz bm PP pm ON vdd23width8timing MMC-HS(SDR20)dt B[33108.189617]sunxi-mmc4022000.sdmmc:sdc set ios:clk50000000Hz bm PP pm ON vdd23width8timing MMC-HS400 dt B[33108.202060]sunxi-mmc4022000.sdmmc:sdc set ios:clk150000000Hz bm PP pm ON vdd23width8timing MMC-HS400 dt B[33108.244306]prate:2400000000,drate:480000000ps任务列表的展示crash_arm64ps # 展示所有的任务就像在一个实时系统上一样 PID PPID CPU TASK ST%MEM VSZ RSS COMM000ffffffc00aec2100 RU0.000[swapper/0]001ffffff80c01eec00 RU0.000[swapper/1]002ffffff80c01e9200 RU0.000[swapper/2]003ffffff80c01f9200 RU0.000[swapper/3]004ffffff80c01f8000 RU0.000[swapper/4]005ffffff80c01fc800 RU0.000[swapper/5]006ffffff80c01fb600 RU0.000[swapper/6]007ffffff80c01fa400 RU0.000[swapper/7]107ffffff80c01c9200 IN0.122399603848init201ffffff80c01c8000 IN0.000[kthreadd]320ffffff80c01cc800 ID0.000[rcu_gp]420ffffff80c01cb600 ID0.000[netns]820ffffff80c01e6c00 ID0.000[mm_percpu_wq]1020ffffff80c01e0000 IN0.000[rcu_tasks_kthre]1120ffffff80c01e4800 IN0.000[rcu_tasks_trace]1220ffffff80c01e3600 RU0.000[ksoftirqd/0]1327ffffff80c01e2400 ID0.000[rcu_preempt]1426ffffff80c01e5a00 IN0.000[rcub/0]crash_arm64ps1# 根据PID 查看对应任务信息 PID PPID CPU TASK ST%MEM VSZ RSS COMM107ffffff80c01c9200 IN0.122399603848initcrash_arm64ps init # 根据任务名查看对应任务信息 PID PPID CPU TASK ST%MEM VSZ RSS COMM107ffffff80c01c9200 IN0.122399603848init22906ffffff80c02b6c00 IN0.122399603848init23012ffffff80c028c800 IN0.121671042796initfilesfuser可以看到谁正在使用的文件路径或模式list/tree可以从内核结构见列表或基数/ rbtreeirq中断信息查询crash_arm64irq # 展示所有已经注册的中断信息包括IRQ中断亲和力 IRQ IRQ_DESC/_DATA IRQACTION NAME0(unused)(unused)1ffffff80c000f600 ffffff80c00cd000IPI2ffffff80c000c200 ffffff80c00cd280IPI3ffffff80c000c600 ffffff80c00cd500IPI4ffffff80c000dc00 ffffff80c00cde00IPI5ffffff80c000ce00 ffffff80c00cd600IPI6ffffff80c000fc00 ffffff80c00cd580IPI7ffffff80c000d600 ffffff80c00cd700IPI8ffffff80c000e400(unused)9ffffff80c000d400(unused)10ffffff80c000f200(unused)11ffffff80c000e800 ffffff80c00ce000arch_timer12ffffff80c000d200(unused)13ffffff80c19cf800 ffffffc00ae1a70014ffffff80c19cf000 ffffff80c7f93e00timer300800015ffffff80c19cec00 ffffff80c1755a00arm-pmu16ffffff80c03b3400 ffffff80c414b6807121000.dma1-controller17ffffff80c03b0a00 ffffff80c41262007090000.rtc18ffffff80c03b0200 ffffff80c19c04003002000.dma-controllercrash_arm64irq|greptwi0416ffffff80c2ab4e00 ffffff80c3e6f5802502000.twi0420ffffff80c2ab5400 ffffff80c3e5dd807081400.s_twi0crash_arm64irq416# 展示某一个具体IRQ的信息 IRQ IRQ_DESC/_DATA IRQACTION NAME416ffffff80c2ab4e00 ffffff80c3e6f5802502000.twi0dis反汇编代码 –这对检查比特翻转问题有用 高频使用rd/wr读写存储器地址ps : 显示任务结构高频使用crash_arm64ps|grep gt9xx202225ffffff8084915a00 RU0.000[irq/297-gt9xx]crash_arm64task2022PID:2022TASK:ffffff8084915a00 CPU:5COMMAND:irq/297-gt9xxstructtask_struct{thread_info{flags8,ttbr01118797824,{struct对结构体进行解析高频使用crash_arm64structi2c_msg# 显示内核结构及其大小structi2c_msg{__u16 addr;__u16 flags;__u16 len;__u8*buf;}crash_arm64structi2c_msg-o # 显示成员的偏移量structi2c_msg{[0]__u16 addr;[2]__u16 flags;[4]__u16 len;[8]__u8*buf;}SIZE:16crash_arm64structi2c_msgffffffc010feb9e8 # 加上结构体的地址可以打印出对应的元素值structi2c_msg{addr93,flags0,len3,buf0xffffffc010feb9f8\201N}waitq可以看到任务在 waitq 待定search在内存范围内搜索值/字符串vm可以看到任务的虚拟内存映射虚拟机可以看到物理内存映射。kmem显示内核内存页信息。p打印一个表达式或变量 struct 的成员mod载一个模块才能继续打印分析 ko 内的数据信息2.4 应用场景案例2.4.1 访问非法地址使用 dmesg 命令查看死机现场的 log。看到最后的死机现场如下所示PC is at sunxi_uart_dev_info_show0x28/0x8c再用反汇编命令 dis 解析出代码对应的源码及汇编dis-l sunxi_uart_dev_info_show0x28可以看出跑飞的代码为 /home/lidaxin/AndroidQ/longan/kernel/linux-4.9/drivers/tty/serial/sunxiuart.c: 1501。对应汇编为 str wzr,[x1]这里是要往 x1 地址内存写 0 log 信息可以看到x10, 往 0 地址写 0那就是访问非法地址了。可以看出跑飞的代码为linux-4.9/drivers/tty/serial/sunxi-uart.c:1501。对应汇编为 str wzr,[x1]这里是要往 x1 地址内存写 0 log 信息可以看到 x10, 往 0 地址写 0那就是访问非法地址了。2.4.2 OOM通过 dmesg 查看 OOM 的报错详细信息。解析后的 panic 原因是 Out of memory.再通过 dmesg 查看 OOM 的报错详细信息。内存使用情况 free 只有 11252kB,low 水位是18024kB此时报出 oom 为正常。 anon 页面和 file 页面都很少说明进程占用的内存已经很少。 mlock 页面为 1609904kB unevictable 页面 1609904kB 。 mlock 的页面即为 unevictable 的。所以这里要看是哪个进程把内存 mlock 了。再查看进程的内存占用信息可以看出内存占用最高的进程是 memtester 进程。所以这里造成 oom 的原因是 memtester 进程内存占用太高。2.4.3 内核链表信息被破坏使用 dmesg 命令查看死机现场的 log。crash_arm64dmesg可以看到最后的死机现场如下查看死机地址 PC 指针所处源码位置crash_arm64dis-l0xffffff800848a9b8得到查看源码可以看到 strcmp 取第 0 个参数时取到了非法指针 0x1f00000000000000.进一步查看是哪里调用了 strcmp查看 LR 指针所处源码位置crash_arm64dis-l0xffffff8008115f8c得到查看源码如下得知是内核在操作以 all_lock_classes 为头的 lock_class 结构体链表时取到了非法指针。这里的非法指针是 0x1f00000000000000所以逃过了内核的指针为 NULL 的合法性检查将错误传入到了下一层的 strcmp。Dump 出 all_lock_classes 为头的链 表上 所有 lock_class 结构详细 信息 并转储 到all_lock_classes.txt 文件。crash_arm64list-H all_lock_classes lock_class.lock_entry-s lock_classall_lock_classes.txt查看 all_lock_classes.txt 文件搜索 name 关键字找到 line22891 行数据结构的 name 字符串指针非法。再往上找到此结构的地址发现数据结构地址非法指针末尾没有 4 对齐再查看链表的上一个数据成员的 next 指针链表上一个 struct 的 next 指针已经被破坏导致下一个数据结构地址非法取到的 name 指针自然非法 strcmp 取到非法指针 0x1f00000000000000内核崩溃。参见 dump 信息中X0 寄存器strcmp 函数的第 0 个参数值为 0x1f00000000000000非法 name 指针也为0x1f00000000000000严格匹配 strcmp dst1 地址证实 strcmp() 函数进行字符串匹配时取到非法指针内核崩溃。为进一步证实推论单个链表指针被破坏参照正常 struct 结构规律Next 指针值为 struct 指针值加 0x200struct 指针值 0xffffff800998caf80x200next 指针值 0xffffff800998ccf8所以被破坏结构的 next 指针合法值应为0xffffff800998cce80x2000xffffff800998cee8。Struct 结构地址为 0xffffff800998cee8-0x100xffffff800998ced8。获取 0xffffff800998ced8 结构体详细信息看是否合法crash_arm64structlock_class0xffffff800998ced8显式结果合法取到了合法的 prev/next 指针及合法的 name 字符串如上推测得到证实。如果 pc 指针能退回并将此错误指针修改回去内核就又可以欢快的 run了2.4.4 内核指针被破坏使用 dmesg 命令查看死机现场的 log。crash_arm64dmesg可以看到最后的死机现场如下查看死机地址 PC 指针所处源码位置crash_arm64dis-l0xffffff8008232bcc得到查看源码得知内核在执行寻址 oldpage 结构体成员时取到了非法指针 0xffffffaf00d59828。对应汇编如下看最后一句指令功能。 x19 寄存器中存放 page 结构体指针偏移 40 寻找其 pobjects 结构成员。从 log 信息可以获知 x19 寄存器值 0xffffffaf00d59800 就已经不是一个合法指针了。根据 linux 启动后的 memory mapping 图推测 x19 是从 0xffffffbf00d59800 翻转到 0xffffffaf00d59800 的。 0xffffffbf00d59800 是一个合法的 page 指针。为了证实这个结论进一步查看 0xffffffbf00d59800 指向的内容是否是一个合法的 page 结构如下crash_arm64structpage0xffffffbf00d59800得到了一个合法的 page 结构如下证实推测x19 是从 0xffffffbf00d59800 翻转到0xffffffaf00d59800 的2.4.5 指针访问权限非法使用 dmesg 命令查看死机现场的 log。crash_arm64dmesg可以看到最后的死机现场如下查看死机地址 PC 指针所处源码位置crash_arm64dis-l0xffffff800814a1fc得到死机时 CPU 正在执行指令 ldr x23, [sp, #48]一个普通的存取堆栈操作。对照死机 log sp 指针值 0xffffffc03866bd40 是个内核合法地址如下图内核地址范围用 crash 工具尝试读取此地址crash_arm64rd0xffffffc03866bd400x100得到说明内存中内核页表是 ok 的。查看 log 所处的内核源码内核在 line 350 行报错说明 fault 地址一定小于 4G。但此处 sp 远大于 4G而且内核页表完好 CPU 不应该进入缺页异常分支。推测 CPU MMU 硬件出错。2.4.6 访问内核地址报错使用 dmesg 命令查看死机现场的 log。crash_arm64dmesg可以看到最后的死机现场如下fault 地址 0xffffffc03699f96c是一个合法的内核地址在下图内核 mapping 空间内查看死机地址 PC 指针所处源码位置crash_arm64dis-l ffffff800873362c得到触发异常的指令是一条正常 load/store 指令其中 x28 寄存器是合法内核指针在如下地址空间内尝试读取引发 fault 的地址 0xffffffc03699f96c crash 工具可以正常读取和完成地址转换crash_arm64rd ffffffc03699f96c10如下图手动读取内存中的 3 级内核页表。为了找到根页表读取 init_mm 结构体如下crash_arm64p init_mm结果如下得到内核页表基地址 pgd 0xffffff800a4d8000读取内核基页表并存到 kernel_memory_pgd_table.txt 中crash_arm64rd0xffffff800a4d8000512kenel_memory_table.txt根据 fault 地址 0xffffffc03699f96c找到一级页目录项如下末尾 2bit 全 1是一个合法页目录项。读取二级页目录到 kenel_memory_pmd_c_table.txt 文件中:crash_arm64rd-p000000007f7ea000512kenel_memory_pmd_c_table.txt根据 fault 地址 0xffffffc03699f96c找到二级页目录项如下末尾 2bit 全 1是一个合法的页目录项。读取三级页目录到 kenel_memory_pte_139_table.txt 文件中crash_arm64rd-p000000007f6b0000512kernel_memory_pte_139_table.txt截图如下都是合法页表以上过程再次说明内核页表没问题问题处在 CPU MMU 硬件上。3 注意事项3.1 WARNING: cannot access vmalloc’d modulememorycrash 加载过程中出现如下的 logmachine type mismatch/“WARNING:cannot access vmallocd module memory ”表示 DRAM 数据与 vmlinux 不匹配需要重新提供匹配的数据。3.2 crash: cannot determine page sizecrash 加载过程中出现如下的 logcrash:cannot determine page size• 表示 crash 工具不匹配区分是 arm32 还是 arm64 的平台• 要注意 dump 内存的大小要完全 dump 出来。详见 3.1.1 章节检查 crash 数据的获取时配置是否正确• 可以在解析命令后添加参数-p 4k指定 page size 的大小• 也可能是 crash 工具的版本不匹配推荐使用最新的 crash 进行调试验证。5.3 crash_arm64: read error: kernel virtual address: ffffffc0087cf580 type: “kernel_config_data”crash 加载过程中出现如下的 logcrash_arm64:read error:kernel virtual address:ffffffc0087cf580 type: kernel_config_data WARNING:cannot read kernel_config_data crash_arm64:read error:kernel virtual address:ffffffc008e68860 type:possibleWARNING:cannot read cpu_possible_map crash_arm64:read error:kernel virtual address:ffffffc008e68858 type:presentWARNING:cannot read cpu_present_map crash_arm64:read error:kernel virtual address:ffffffc008e68850 type:onlineWARNING:cannot read cpu_online_map crash_arm64:read error:kernel virtual address:ffffffc008e68878 type:activeWARNING:cannot read cpu_active_map crash_arm64:read error:kernel virtual address:ffffffc008f875a8 type:shadow_timekeeper xtime_sec crash_arm64:read error:kernel virtual address:ffffffc008e6dc44 type:init_uts_nscrash_arm64:tmp/vmlinux and/var/tmp/ramdump_elf_sDmBG5donot match!• 表示 crash 工具指定的 kimage_voffset 有误需要提供正确的内核镜像偏移量参数。• 对于 ARM 64 位系统 mmu 模块会将 kimage_voffset 导出为全局符号见kernel/linux-5.15/arch/arm64/mm/mmu.c。• 在任意能够运行的驱动添加如下代码将信息偏移量信息打印出来替换掉该参数即可。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

河北青山建设集团有限公司网站青海省城乡建设网站

2026上海国际智能新材料展览会将于2026年10月12-16日 在国家会展中心(上海)举办2026上海工博会:智领新材料未来智能材料行业作为战略性新兴产业的重要组成部分,是一类能够感知外部环境刺激(如温度、压力、电场、磁场等),并通过自身…

张小明 2026/1/3 17:44:57 网站建设

wap建站程序源码中山做网站公司

Python Web编程:CGI与WSGI详解 1. CGI编程基础 在Web编程中,CGI(Common Gateway Interface)脚本是一种常见的技术,用于让第三方Web服务器访问Python程序。当Web服务器需要处理表单中的用户输入或生成动态内容时,通常会执行CGI脚本。 1.1 CGI脚本的输入与输出 当提交与…

张小明 2026/1/3 16:05:53 网站建设

动漫网站源码免费网博士自助建站系统下载

第一章:Open-AutoGLM命令行模式常用指令汇总Open-AutoGLM 是一款基于命令行的自动化大语言模型管理工具,支持模型部署、推理调用、参数配置与日志监控等功能。通过命令行模式,用户可以高效地完成批量任务调度与远程服务管理。基础启动指令 启…

张小明 2026/1/4 3:58:03 网站建设

个人怎样建立网站设计logo网站免费下载

在 Spring Boot 开发中,参数配置的合理性直接影响应用的可维护性、可扩展性和安全性。结合实际项目经验,以下是经过验证的参数配置最佳实践,涵盖配置格式、分层管理、安全规范、部署适配等核心场景:一、基础规范:选择合…

张小明 2026/1/3 22:37:10 网站建设

如何知道网站流量济南中建设计院网站

它是理性、技术导向且务实的。 文章的策略不是“为了用框架而用框架”,而是从痛点出发(手动写 Factory 的繁琐、SavedStateHandle 的难搞、Compose 的未来),最后通过对比得出结论。 Android 架构进化之路:为何在 Retro…

张小明 2026/1/3 19:41:21 网站建设

网站建设微金手指下拉15网站设计的趋势

Langchain-Chatchat如何实现多条件组合检索?高级搜索设计 在企业知识管理的实践中,一个常见的挑战是:面对成千上万份PDF、Word和TXT文档,员工却常常“知道信息存在,却找不到具体内容”。传统的全文搜索依赖关键词匹配&…

张小明 2026/1/3 22:11:15 网站建设