arm linux应用程序crash分析一般方法
目录:
- 前言
- 一、定位问题的基本方法论
- 1.1 生产环境下系统崩溃的日志信息示例
- 二、 分析这类什么都没有的app crash的一般方法论:
- 附录:
- 附录1 pmap -p 进程PID 查看进程的内存分配情况
- 附录2 cat /proc/pid/maps
- 总结
前言
linux的应用程序app开发过程中,出现一些应用程序的崩溃是比较常见的事情,根据不同的场景,往往有可以分成两类:
1.开发环境下,解决应用程序的崩溃往往有很多的方法,常规的例如:上下文看代码逻辑,版本回退缩代码bug范围,不同版本横向对比,printf打印跟踪代码运行,debug工具上,配置内核show出来kallsyms,配置coredump抓应用崩溃日志等等,方式方法有很多种,分析问题手段也比较多一些,相对难度小一些。
2.在生产环境下,手段往往比较少一些,因为一般发布版本的应用程序,app的debug符号都被strip掉了,内核的kallsyms可能都看不到(cat /proc/kallsyms无输出),内核日志种dump出来的backtrace没有任何的函数名称,甚至有时候coredump都是不打开不配置的(也就是没有coredump的日志),全程只有一个内核的kmsg出来的信息,用来分析app的崩溃。如果这时候不掌握一些分析问题的基本方法论,全靠运气解决问题,恐怕会比较低效率,今天在这里为大家介绍我在日常开发过程中,针对linux应用开发中出现的应用程序崩溃的一些分析方法
一、定位问题的基本方法论
提示:以下是本篇文章正文内容,下面案例可供参考
1.1 生产环境下系统崩溃的日志信息示例
先看一个生产环境下,没有coredump日志,没有内核kallsyms参考,不能用gdb调试的linux app奔溃日志
[ 407.407974] [0][527: stream xfer] stream xfer: unhandled page fault (11) at 0x6f2c1000, code 0x817
[ 407.407985] [0][527: stream xfer] pgd = 811c0000
[ 407.407991] [0][527: stream xfer] [6f2c1000] *pgd=010c5831, *pte=00000000, *ppte=00000000
[ 407.408164] [0][527: stream xfer] CPU: 0 PID: 527 Comm: stream xfer Tainted: P O 4.19.91 #1
[ 407.408168] [0][527: stream xfer] Hardware name: Novatek Video Platform
[ 407.408174] [0][527: stream xfer] PC is at 0x76e83ff8
[ 407.408177] [0][527: stream xfer] LR is at 0x00039e4c
[ 407.408182] [0][527: stream xfer] pc : [<76e83ff8>] lr : [<00039e4c>] psr: 200f0010
[ 407.408188] [0][527: stream xfer] sp : 6cc7ae04 ip : 6f2c0fe8 fp : 6cc7af8c
[ 407.408192] [0][527: stream xfer] r10: 702c1d18 r9 : 00000000 r8 : 00000000
[ 407.408198] [0][527: stream xfer] r7 : 6f205008 r6 : 6cc7ae2c r5 : 000cf9c0 r4 : 746a5030
[ 407.408203] [0][527: stream xfer] r3 : 00000000 r2 : 000d0792 r1 : 7476106e r0 : 6f205008
[ 407.408210] [0][527: stream xfer] Flags: nzCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
[ 407.408216] [0][527: stream xfer] Control: 10c5387d Table: 011c0059 DAC: 00000055
[ 407.408222] [0][527: stream xfer] CPU: 0 PID: 527 Comm: stream xfer Tainted: P O 4.19.91 #1
[ 407.408226] [0][527: stream xfer] Hardware name: Novatek Video Platform
[ 407.408230] [0][527: stream xfer] Backtrace:
[ 407.408237] [0][527: stream xfer] Function entered at [<800139ec>] from [<80013b14>]
[ 407.408246] [0][527: stream xfer] r7:6f2c1000 r6:803d1048 r5:0000000b r4:80d79100
[ 407.408251] [0][527: stream xfer] Function entered at [<80013afc>] from [<80302b80>]
[ 407.408255] [0][527: stream xfer] Function entered at [<80302b60>] from [<800103d8>]
[ 407.408260] [0][527: stream xfer] Function entered at [<800103c4>] from [<80014c84>]
[ 407.408264] [0][527: stream xfer] Function entered at [<80014be8>] from [<80014fd0>]
[ 407.408275] [0][527: stream xfer] r9:00000817 r8:81bf5200 r7:80d79100 r6:6f2c1000 r5:00000055 r4:80ca5fb0
[ 407.408279] [0][527: stream xfer] Function entered at [<80014d60>] from [<80015190>]
[ 407.408289] [0][527: stream xfer] r10:702c1d18 r9:00000000 r8:803d4224 r7:80ca5fb0 r6:6f2c1000 r5:803d1048
[ 407.408293] [0][527: stream xfer] r4:00000817
[ 407.408298] [0][527: stream xfer] Function entered at [<80015144>] from [<80009da0>]
[ 407.408303] [0][527: stream xfer] Exception stack(0x80ca5fb0 to 0x80ca5ff8)
[ 407.408311] [0][527: stream xfer] 5fa0: 6f205008 7476106e 000d0792 00000000
[ 407.408321] [0][527: stream xfer] 5fc0: 746a5030 000cf9c0 6cc7ae2c 6f205008 00000000 00000000 702c1d18 6cc7af8c
[ 407.408330] [0][527: stream xfer] 5fe0: 6f2c0fe8 6cc7ae04 00039e4c 76e83ff8 200f0010 ffffffff
[ 407.408339] [0][527: stream xfer] r8:10c5387d r7:10c5387d r6:ffffffff r5:200f0010 r4:76e83ff8
二、 分析这类什么都没有的app crash的一般方法论:
-
1.2.1 分析问题前,需要先准备什么?
准备App发行版时候,同一时刻编译的带有debug信息的发布版本应用程序,姑且称之为App.debug
怎么看App是不是有debug符号(arm-xxx-xxx-xxx-readelf -S App.debug | grep -i debug)
-
1.2.2 先定位App崩溃发生在内核空间,还是用户空间?
- 收集有用的基础信息,比如,App crash时候的PC寄存器内容,LR寄存器内容,Bactrace中的地址
- 看linux内核的配置,先了解自己linux内核配置是2GB内核+2GB用户,还是1GB用户+3GB内核,还是3GB用户+1GB内核,即,了解一下自己是定义内核的起始地址的。一般是2+2或者3+1,即,内核的起始地址是从0x80000000开始或者0xc0000000。通过这个内核符号的起始地址,就可以大致知道内核函数或者变量(统一称为内核符号)放置的地址,
也可以通过查看内核编译生成的System.map或者cat /proc/kallsyms
查看崩溃时候PC寄存器访问的地址,是在内核中,还是用户空间中 - 如果可以重新编译内核,打开CONFIG_KALLSYMS=y,这样就可以通过
cat /proc/kallsyms
查看内核所有符号 - 如果可以重新编译内核,配置CONFIG_COREDUMP=y,并配置文件系统中,在初始化时候,配置一下coredump
# coredump setting vi /etc/profile echo 1 > /proc/sys/kernel/core_uses_pid ulimit -c unlimited echo "/var/log/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
-
1.2.3 如果发生在用户空间,是发生在App自生code中,还是发生中调用的系统调用或者链接的库中?
-
如果崩溃发生在APP自己的code中,我怎么定位?
arm-xxx-xxx-xxx-addr2line -a PC寄存器中的地址 -e App.debug
-
如果崩溃发生在APP链接的库中,我该怎么下一步分析?
如果崩溃是发生在库里,往往arm-xxx-xxx-xxx-addr2line 出来的是??这样的符号,表示没有实际的函数符号 (因为库中的debug信息都被strip掉了) 这个时候arm-xxx-xxx-xxx-addr2line -a LR寄存器中的地址 -e App.debug 根据LR寄存器定位看看是调用了什么库函数,然后在其周围对库函数形参进行参数检查,比如空指针,或者参数范围检测等
-
附录:
附录1 pmap -p 进程PID 查看进程的内存分配情况
root@sampleuser:~$ pmap -q 156
156: /usr/bin/cam_app
0000000000010000 8484K rwxp [ anon ]
0000000001692000 132K rw-p [heap]
000000006d064000 4K ---p [ anon ]
000000006d065000 8192K rw-p [ anon ]
000000006d865000 4K ---p [ anon ]
000000006d866000 8192K rw-p [ anon ]
000000006e066000 4K ---p [ anon ]
000000006e067000 8192K rw-p [ anon ]
000000006e867000 4K ---p [ anon ]
000000006e868000 10596K rw-p [ anon ]
000000006f2c1000 4K ---p [ anon ]
000000006f2c2000 8192K rw-p [ anon ]
000000006fac2000 4K ---p [ anon ]
000000006fac3000 8192K rw-p [ anon ]
00000000702c3000 4K ---p [ anon ]
00000000702c4000 9736K rw-p [ anon ]
0000000070c46000 4K ---p [ anon ]
0000000070c47000 8192K rw-p [ anon ]
0000000071447000 4K ---p [ anon ]
0000000071448000 8192K rw-p [ anon ]
0000000071c48000 4K ---p [ anon ]
0000000071c49000 8192K rw-p [ anon ]
0000000072449000 4K ---p [ anon ]
000000007244a000 8192K rw-p [ anon ]
0000000072c4a000 4K ---p [ anon ]
0000000072c4b000 8192K rw-p [ anon ]
000000007344b000 4K ---p [ anon ]
000000007344c000 8192K rw-p [ anon ]
0000000073c4c000 4K ---p [ anon ]
0000000073c4d000 12996K rw-p [ anon ]
00000000748fe000 4K ---p [ anon ]
00000000748ff000 8192K rw-p [ anon ]
00000000750ff000 4K ---p [ anon ]
0000000075100000 8192K rw-p [ anon ]
0000000075900000 132K rw-p [ anon ]
0000000075921000 892K ---p [ anon ]
0000000075a37000 136K rw-s /dev/log_vg
0000000075b00000 132K rw-p [ anon ]
0000000075b21000 892K ---p [ anon ]
0000000075c45000 4K ---p [ anon ]
0000000075c46000 16K rw-p [ anon ]
0000000075c4a000 4K ---p [ anon ]
0000000075c4b000 16K rw-p [ anon ]
0000000075c4f000 4K ---p [ anon ]
0000000075c50000 16K rw-p [ anon ]
0000000075c54000 4K ---p [ anon ]
0000000075c55000 16K rw-p [ anon ]
0000000075c59000 4K ---p [ anon ]
0000000075c5a000 8192K rw-p [ anon ]
000000007645a000 4K ---p [ anon ]
000000007645b000 8192K rw-p [ anon ]
0000000076c5b000 120K r-xp /lib/libgcc_s.so.1
0000000076c79000 60K ---p /lib/libgcc_s.so.1
0000000076c88000 4K r--p /lib/libgcc_s.so.1
0000000076c89000 4K rw-p /lib/libgcc_s.so.1
0000000076c8a000 984K r-xp /usr/lib/libstdc++.so.6.0.25
0000000076d80000 60K ---p /usr/lib/libstdc++.so.6.0.25
0000000076d8f000 20K r--p /usr/lib/libstdc++.so.6.0.25
0000000076d94000 12K rw-p /usr/lib/libstdc++.so.6.0.25
0000000076d97000 4K rw-p [ anon ]
0000000076d98000 368K r-xp /lib/libm-2.30.so
0000000076df4000 60K ---p /lib/libm-2.30.so
0000000076e03000 4K r--p /lib/libm-2.30.so
0000000076e04000 4K rw-p /lib/libm-2.30.so
0000000076e05000 1200K r-xp /lib/libc-2.30.so
0000000076f31000 64K ---p /lib/libc-2.30.so
0000000076f41000 8K r--p /lib/libc-2.30.so
0000000076f43000 4K rw-p /lib/libc-2.30.so
0000000076f44000 12K rw-p [ anon ]
0000000076f47000 4K r--p /usr/bin/cam_app
0000000076f48000 128K r-xp /lib/ld-2.30.so
0000000076f68000 64K ---p [ anon ]
0000000076f78000 4K r--p /lib/ld-2.30.so
0000000076f79000 4K rw-p /lib/ld-2.30.so
0000000076f7a000 8K rw-s /dev/nvtmpp
0000000076f7c000 8K rw-s /dev/nvtmpp
0000000076f7e000 4K rw-s /SYSV474f4c48
0000000076f7f000 8K rw-p [ anon ]
0000000076f81000 92K r-xp /lib/libpthread-2.30.so
0000000076f98000 60K ---p /lib/libpthread-2.30.so
0000000076fa7000 4K r--p /lib/libpthread-2.30.so
0000000076fa8000 4K rw-p /lib/libpthread-2.30.so
0000000076fa9000 8K rw-p [ anon ]
0000000076fab000 24K r-xp /lib/librt-2.30.so
0000000076fb1000 60K ---p /lib/librt-2.30.so
0000000076fc0000 4K r--p /lib/librt-2.30.so
0000000076fc1000 4K rw-p /lib/librt-2.30.so
0000000076fc2000 8K rw-p [ anon ]
000000007eaff000 132K rw-p [stack]
000000007edf6000 4K r-xp [sigpage]
附录2 cat /proc/pid/maps
root@HK100EB3104D1006:~$ cat /proc/156/maps
00010000-00859000 rwxp 00000000 00:00 0
01b36000-01b57000 rw-p 00000000 00:00 0 [heap]
6cf64000-6cf65000 ---p 00000000 00:00 0
6cf65000-6d765000 rw-p 00000000 00:00 0
6d765000-6d766000 ---p 00000000 00:00 0
6d766000-6df66000 rw-p 00000000 00:00 0
6df66000-6df67000 ---p 00000000 00:00 0
6df67000-6e767000 rw-p 00000000 00:00 0
6e767000-6e768000 ---p 00000000 00:00 0
6e768000-6f1c1000 rw-p 00000000 00:00 0
6f1c1000-6f1c2000 ---p 00000000 00:00 0
6f1c2000-6f9c2000 rw-p 00000000 00:00 0
6f9c2000-6f9c3000 ---p 00000000 00:00 0
6f9c3000-701c3000 rw-p 00000000 00:00 0
701c3000-701c4000 ---p 00000000 00:00 0
701c4000-70ff7000 rw-p 00000000 00:00 0
70ff7000-70ff8000 ---p 00000000 00:00 0
70ff8000-717f8000 rw-p 00000000 00:00 0
717f8000-717f9000 ---p 00000000 00:00 0
717f9000-71ff9000 rw-p 00000000 00:00 0
71ff9000-71ffa000 ---p 00000000 00:00 0
71ffa000-727fa000 rw-p 00000000 00:00 0
727fa000-727fb000 ---p 00000000 00:00 0
727fb000-72ffb000 rw-p 00000000 00:00 0
72ffb000-72ffc000 ---p 00000000 00:00 0
72ffc000-737fc000 rw-p 00000000 00:00 0
737fc000-737fd000 ---p 00000000 00:00 0
737fd000-73ffd000 rw-p 00000000 00:00 0
73ffd000-73ffe000 ---p 00000000 00:00 0
73ffe000-747fe000 rw-p 00000000 00:00 0
747fe000-747ff000 ---p 00000000 00:00 0
747ff000-74fff000 rw-p 00000000 00:00 0
74fff000-75000000 ---p 00000000 00:00 0
75000000-75800000 rw-p 00000000 00:00 0
75800000-75821000 rw-p 00000000 00:00 0
75821000-75900000 ---p 00000000 00:00 0
75976000-75998000 rw-s 00000000 00:06 2369 /dev/log_vg
75a00000-75a21000 rw-p 00000000 00:00 0
75a21000-75b00000 ---p 00000000 00:00 0
75b84000-75b85000 ---p 00000000 00:00 0
75b85000-75b89000 rw-p 00000000 00:00 0
75b89000-75b8a000 ---p 00000000 00:00 0
75b8a000-75b8e000 rw-p 00000000 00:00 0
75b8e000-75b8f000 ---p 00000000 00:00 0
75b8f000-75b93000 rw-p 00000000 00:00 0
75b93000-75b94000 ---p 00000000 00:00 0
75b94000-75b98000 rw-p 00000000 00:00 0
75b98000-75b99000 ---p 00000000 00:00 0
75b99000-76399000 rw-p 00000000 00:00 0
76399000-7639a000 ---p 00000000 00:00 0
7639a000-76b9a000 rw-p 00000000 00:00 0
76b9a000-76bb8000 r-xp 00000000 00:0c 621 /lib/libgcc_s.so.1
76bb8000-76bc7000 ---p 0001e000 00:0c 621 /lib/libgcc_s.so.1
76bc7000-76bc8000 r--p 0001d000 00:0c 621 /lib/libgcc_s.so.1
76bc8000-76bc9000 rw-p 0001e000 00:0c 621 /lib/libgcc_s.so.1
76bc9000-76cbf000 r-xp 00000000 00:0c 132 /usr/lib/libstdc++.so.6.0.25
76cbf000-76cce000 ---p 000f6000 00:0c 132 /usr/lib/libstdc++.so.6.0.25
76cce000-76cd3000 r--p 000f5000 00:0c 132 /usr/lib/libstdc++.so.6.0.25
76cd3000-76cd6000 rw-p 000fa000 00:0c 132 /usr/lib/libstdc++.so.6.0.25
76cd6000-76cd7000 rw-p 00000000 00:00 0
76cd7000-76d33000 r-xp 00000000 00:0c 624 /lib/libm-2.30.so
76d33000-76d42000 ---p 0005c000 00:0c 624 /lib/libm-2.30.so
76d42000-76d43000 r--p 0005b000 00:0c 624 /lib/libm-2.30.so
76d43000-76d44000 rw-p 0005c000 00:0c 624 /lib/libm-2.30.so
76d44000-76e70000 r-xp 00000000 00:0c 617 /lib/libc-2.30.so
76e70000-76e80000 ---p 0012c000 00:0c 617 /lib/libc-2.30.so
76e80000-76e82000 r--p 0012c000 00:0c 617 /lib/libc-2.30.so
76e82000-76e83000 rw-p 0012e000 00:0c 617 /lib/libc-2.30.so
76e83000-76e86000 rw-p 00000000 00:00 0
76e86000-76e87000 r--p 76eb9000 00:0c 217 /usr/bin/cam_app
76e87000-76ea7000 r-xp 00000000 00:0c 625 /lib/ld-2.30.so
76ea7000-76eb7000 ---p 00000000 00:00 0
76eb7000-76eb8000 r--p 00020000 00:0c 625 /lib/ld-2.30.so
76eb8000-76eb9000 rw-p 00021000 00:0c 625 /lib/ld-2.30.so
76eb9000-76ebb000 rw-s 03b7f000 00:06 2374 /dev/nvtmpp
76ebb000-76ebd000 rw-s 03b7f000 00:06 2374 /dev/nvtmpp
76ebd000-76ebe000 rw-s 00000000 00:05 0 /SYSV474f4c48 (deleted)
76ebe000-76ec0000 rw-p 00000000 00:00 0
76ec0000-76ed7000 r-xp 00000000 00:0c 626 /lib/libpthread-2.30.so
76ed7000-76ee6000 ---p 00017000 00:0c 626 /lib/libpthread-2.30.so
76ee6000-76ee7000 r--p 00016000 00:0c 626 /lib/libpthread-2.30.so
76ee7000-76ee8000 rw-p 00017000 00:0c 626 /lib/libpthread-2.30.so
76ee8000-76eea000 rw-p 00000000 00:00 0
76eea000-76ef0000 r-xp 00000000 00:0c 611 /lib/librt-2.30.so
76ef0000-76eff000 ---p 00006000 00:0c 611 /lib/librt-2.30.so
76eff000-76f00000 r--p 00005000 00:0c 611 /lib/librt-2.30.so
76f00000-76f01000 rw-p 00006000 00:0c 611 /lib/librt-2.30.so
76f01000-76f03000 rw-p 00000000 00:00 0
7eb52000-7eb73000 rw-p 00000000 00:00 0 [stack]
7ed8e000-7ed8f000 r-xp 00000000 00:00 0 [sigpage]
总结
其实,这种分析方法是最为简单的一种,有时候分析问题的时候,还需要依赖到具体代码文件,使用到objdump的工具,也是一种手段。
什么时候使用arm-xxx-xxx-xxx-objdump,通常是我们没有App.dbug文件的时候,这时候,我们根据PC寄存器地址,无法addr2line到具体的代码的时候,又没有其他的手段进行分析,可以根据PC或者LR的寄存器地址,找到App编译时候的对应的文件,反汇编该文件,然后利用函数的lr地址-函数基地址=偏移地址,计算具体的代码行,并根据对应的汇编代码,进行分析
相关文章:
arm linux应用程序crash分析一般方法
目录: 前言一、定位问题的基本方法论1.1 生产环境下系统崩溃的日志信息示例 二、 分析这类什么都没有的app crash的一般方法论:附录:附录1 pmap -p 进程PID 查看进程的内存分配情况附录2 cat /proc/pid/maps 总结 前言 linux的应用程序app开…...
Web安全防护技术解决方案
1、防止爆破 限制请求ip访问次数,超过设定访问次数后,拒绝访问或锁定N分钟后可再次请求 2、调用短信验证码时 加入验证码采用防爆破策略 3、上传后的文件防止被猜出爬取 保存在物理磁盘可进行加密防护文件不能存储在站点目录,防止通过ur…...

流畅的 Python 第二版(GPT 重译)(十一)
第二十章:并发执行器 抨击线程的人通常是系统程序员,他们心中有着典型应用程序员终其一生都不会遇到的用例。[…] 在 99%的用例中,应用程序员可能会遇到的情况是,生成一堆独立线程并将结果收集到队列中的简单模式就是他们需要了解…...

Blender 3D建模要点
3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1、碰撞形状与视觉形状 像立方体和球体这样的简单形状&a…...

网络安全实训Day8
写在前面 网络工程终于讲完了。这星期到了网络安全技术部分。 网络安全实训-网络安全技术 网络安全概述 信息安全:所有保障计算机硬件、系统、软件、数据不因有意或无意的行为导致的服务中断、数据损坏或丢失等安全事件的保障技术 网络安全:基于计算机…...

GB28181 —— 5、C++编写GB28181设备端,完成将USB摄像头视频实时转发至GB28181服务并可播放(附源码)
被测试的USB摄像头 效果 源码说明 主要功能模拟设备端,完成注册、注销、心跳等,同时当服务端下发指令播放视频时 设备端实时读取USB摄像头视频并通过OpenCV处理后实时转ps格式后封包rtp进行推送给服务端播放。 源码 /****@remark: pes头的封装,里面的具体数据的填写已经占…...

Git工具的详细使用
一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…...

【prometheus-operator】k8s监控redis
1、准备exporter https://github.com/oliver006/redis_exporter oliver006-redis_exporter-amd64.tar # 安装镜像 docker load -i oliver006-redis_exporter-amd64.tar # 上传镜像 docker tag oliver006/redis_exporter ip/monitor/redis_exporter:latest docker push ip/mo…...

外包干了4年,技术退步明显.......
先说一下自己的情况,大专生,19年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...
xbackup 备份MySQL数据库脚本
#!/bin/bash ## 方法一:将回车符(\r)替换为换行符(\n) 替换不可见字符 报错问题:shell脚本执行错误 $‘\r‘:command not found ## sed -i s/\r// xtrabackup.sh ## 备份计划任务 ## ## 每天凌晨1:30一次全量备份 ## 每天间隔1小时一次增量备份 ## 30 1 * * * backup…...
npm常用命令详解
npm(Node Package Manager)是Node.js的包管理器,它提供了大量的命令来安装、管理、发布Node.js模块和包。以下是npm常用命令的详解及示例: 1. 查看npm版本 命令:npm -v 示例:npm -v 将输出当前安装的npm版…...

IPV6协议之RIPNG
目录 前言: 一、RIPNG与RIP的区别 二、如何配置RIPNG 如何解决RIPNG环路问题呢? 控制RIPNG的选路 1、修改RIPNG默认优先级 2.配置接口附加开销值从而干涉RIPNG的选路 RIPNG拓展配置 1.RIPNG的认证 配置RIPNG进程下的IPsec认证: 配…...

JVM垃圾收集器你会选择吗?
目录 一、Serial收集器 二、ParNew收集器 三、Paralle Scavenge 四、Serial Old 五、Parallel Old 六、CMS收集器 6.1 CMS对处理器资源非常敏感 6.2 CMS容易出现浮动垃圾 6.3 产生内存碎片 七、G1 收集器 八、如何选择合适的垃圾收集器 JVM 垃圾收集器是Java虚…...
游戏防沉迷系统相关内容
网站地址:网络游戏防沉迷实名认证系统 PHP代码: 创建对应文件,在需要的位置get传参请求即可,具体参数参考 网络游戏防沉迷实名认证系统接口对接技术规范v2.0 1、上传信息 <?php $url "https://wlc.nppa.gov.cn/test…...

每日OJ题_牛客_JD1 年终奖(动态规划)
目录 牛客_JD1 年终奖 解析代码 牛客_JD1 年终奖 年终奖_牛客题霸_牛客网 解析代码 #include <vector> class Bonus { public: int getMost(vector<vector<int> > board) {int m board.size(), n board[0].size();vector<vector<int>> dp(m…...

深度学习 tablent表格识别实践记录
下载代码:https://github.com/asagar60/TableNet-pytorch 下载模型:https://drive.usercontent.google.com/download?id13eDDMHbxHaeBbkIsQ7RSgyaf6DSx9io1&exportdownload&confirmt&uuid1bf2e85f-5a4f-4ce8-976c-395d865a3c37 原理&#…...

深度学习 线性神经网络(线性回归 从零开始实现)
介绍: 在线性神经网络中,线性回归是一种常见的任务,用于预测一个连续的数值输出。其目标是根据输入特征来拟合一个线性函数,使得预测值与真实值之间的误差最小化。 线性回归的数学表达式为: y w1x1 w2x2 ... wnxn …...

HBase在表操作--显示中文
启动HBase后,Master和RegionServer两个服务器,分别对应进程为HMaster和HRegionServe。(可通过jps查看) 1.进入表操作 hbase shell 2.查看当前库中存在的表 list 3.查看表中数据(注:学习期间可用&#…...

基于BusyBox的imx6ull移植sqlite3到ARM板子上
1.官网下载源码 https://www.sqlite.org/download.html 下载源码解压到本地的linux环境下 2.解压并创建install文件夹 3.使用命令行配置 在解压的文件夹下打开终端,然后输入以下内容,其中arm-linux-gnueabihf是自己的交叉编译器【自己替换】 ./config…...

连续子数组的最大和
问题描述: 输入一个整型数组,数组里有正数也有负数。求连续子数组中的最大和为多少。 举例: 数组:arry{1 , 2 ,-5 , 4 , 1 ,-2} 输出:5,数组中连续的位置相加最大值为5, 41 方法…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...