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

一次Android App NDK崩溃问题的分析及解决

文章目录

  • 小结
  • NDK崩溃的问题
    • 通过logcat查看崩溃日志
    • 提取`tombstone`的记录
  • 通过ndk-stack来输出日志
    • 取得的日志
  • 分析并解决
    • 分析
    • 使用add2line定位具体报错的行数
    • 解决
  • 参考

小结

最近碰一次Android App NDK崩溃的问题,这个NE(Native Exception)是从NDK层xxx.so库文件里抛出来的,进行了tombstone的日志分析,定位分析并解决了问题。

NDK崩溃的问题

相比于Java上层的崩溃问题的解决,NDK层xxx.so库文件里抛出异常比较难定位及解决。 最重要的步骤是提取崩溃日志。

通过logcat查看崩溃日志

手机连接电脑,可以在Android Studio里直接查看Logcat的日志:

...(省略)                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
2023-03-07 09:25:45.323 29167-29167 DEBUG                   pid-29167                            A  pid: 26758, tid: 26758, name: .aa.bb.cc.dd  >>> sg.aa.bb.cc.dd <<<
2023-03-07 09:25:45.329 29167-29167 DEBUG                   pid-29167                            A        #03 pc 00000000001199e0  /data/app/~~RW3C1fUQ0X24VpdWWeRdqg==/sg.aa.bb.cc.dd-4IaZ9lJY132Qxf-Jxajm3w==/base.apk!libJni.so (offset 0xa57000) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-07 09:25:45.329 29167-29167 DEBUG                   pid-29167                            A        #04 pc 00000000001197c8  /data/app/~~RW3C1fUQ0X24VpdWWeRdqg==/sg.aa.bb.cc.dd-4IaZ9lJY132Qxf-Jxajm3w==/base.apk!libJni.so (offset 0xa57000) (CSystem::aaaaa(char*, char*)+972) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-07 09:25:45.329 29167-29167 DEBUG                   pid-29167                            A        #05 pc 0000000000091b1c  /data/app/~~RW3C1fUQ0X24VpdWWeRdqg==/sg.aa.bb.cc.dd-4IaZ9lJY132Qxf-Jxajm3w==/base.apk!libJni.so (offset 0xa57000) (Java_aa.bb.cc.dd_jniqta_Process+2124) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-07 09:25:45.329 29167-29167 DEBUG                   pid-29167                            A        #06 pc 0000000000070b98  /data/app/~~RW3C1fUQ0X24VpdWWeRdqg==/sg.aa.bb.cc.dd-4IaZ9lJY132Qxf-Jxajm3w==/oat/arm64/base.odex (deleted)...(省略)		

提取tombstone的记录

通过指令adb bugreport提取tombstone的日志。

C:\Users\John\AppData\Local\Android\Sdk\platform-tools>adb bugreport
/data/user_de/0/com.android.shell/files/bugreports/dumpstate-2023-03-10-00-09-22.zip: 1 file pulled, 0 skipped. 26.7 MB/s (10556968 bytes in 0.377s)
Bug report copied to C:\Users\John\AppData\Local\Android\Sdk\platform-tools\dumpstate-2023-03-10-00-09-22.zip

dumpstate-2023-03-10-00-09-22.zip\FS\data\tombstones这个目录下有10个tombstone日志,是在程序崩溃时生成的。

通过ndk-stack来输出日志

以下是通过logcat的输出,再通过ndk-stack来输出崩溃日志。

C:\Users\John\AppData\Local\Android\Sdk\platform-tools>adb shell logcat | C:\Users\John\AppData\Local\Android\Sdk\ndk\25.1.8937393\ndk-stack -sym C:\John_Development\library_jni\debug\jni\arm64-v8a\libJni.so

或者通过ndk-stack来分析tombstone的记录

=================
C:\Users\John\AppData\Local\Android\Sdk\platform-tools>C:\Users\John\AppData\Local\Android\Sdk\ndk\25.1.8937393\ndk-stack -sym C:\John_Development\library_jni\debug\jni\arm64-v8a\libJni.so -dump C:\John_Development\tombstone_00
********** Crash dump: **********
...(省略)

取得的日志

以下是取得的日志,但是不管是哪种办法取得的崩溃日志,都不能具体到程序的导致崩溃的那一行。

查看日志,SIGABRT (6) 是指通过c函数abort()发送,为assert()使用。日志中有一个关键字比较重要:
Abort message: 'FORTIFY: vsprintf: prevented 173-byte write into 30-byte buffer'

似乎是写入某一段内存里写入到边界外了,173个字节要写入一个30个字节的缓存区。

...(省略)
2023-03-09 23:20:22.958  6426-6426  ScrollView              pid-6426                             D  initGoToTop
2023-03-09 23:20:22.987  6426-6426  libc                    pid-6426                             A  FORTIFY: vsprintf: prevented 173-byte write into 30-byte buffer
2023-03-09 23:20:22.988  6426-6426  libc                    pid-6426                             A  Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 6426 (.aa.bb.cc.dd), pid 6426 (.aa.bb.cc.dd)
2023-03-09 23:20:23.051  4172-4227  SensorManager           pid-4172                             D  TYPE_LIGHT (5): 9.000000
2023-03-09 23:20:23.061  7176-7176  crash_dump64            pid-7176                             I  obtaining output fd from tombstoned, type: kDebuggerdTombstone
2023-03-09 23:20:23.062  3708-3708  tombstoned              pid-3708                             I  received crash request for pid 6426
2023-03-09 23:20:23.064  7176-7176  crash_dump64            pid-7176                             I  performing dump of process 6426 (target tid = 6426)
2023-03-09 23:20:23.076  7176-7176  DEBUG                   pid-7176                             A  *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2023-03-09 23:20:23.076  7176-7176  DEBUG                   pid-7176                             A  Build fingerprint: 'samsung/aaa/aaa:11/RP1A.200720.012/aaa:user/release-keys'
2023-03-09 23:20:23.076  7176-7176  DEBUG                   pid-7176                             A  Revision: '2'
2023-03-09 23:20:23.076  7176-7176  DEBUG                   pid-7176                             A  ABI: 'arm64'
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A  Timestamp: 2023-03-09 23:20:23+0800
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A  pid: 6426, tid: 6426, name: .aa.bb.cc.dd  >>> sg.aa.bb.cc.dd <<<
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A  uid: 10270
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A  signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A  Abort message: 'FORTIFY: vsprintf: prevented 173-byte write into 30-byte buffer'
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x0  0000000000000000  x1  000000000000191a  x2  0000000000000006  x3  0000007fd3050530
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x4  0000000000000000  x5  0000000000000000  x6  0000000000000000  x7  0000000000000040
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x8  00000000000000f0  x9  6105dba6615d8073  x10 0000000000000000  x11 ffffffc0fffffbdf
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x12 0000000000000001  x13 000000006409f936  x14 003a9ebdec035bec  x15 00004092cc9cc37a
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x16 00000070e064e948  x17 00000070e062d2d0  x18 00000070e1fee000  x19 000000000000191a
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x20 000000000000191a  x21 00000000ffffffff  x22 00000070e1584000  x23 0000006fc04a3000
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x24 00000000a88031a0  x25 00000070e1584000  x26 0000000000000069  x27 0000000000000002
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      x28 0000000000000000  x29 0000007fd30505b0
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A      lr  00000070e05e0ca4  sp  0000007fd3050510  pc  00000070e05e0cd0  pst 0000000000000000
2023-03-09 23:20:23.251  4172-4227  SensorManager           pid-4172                             D  TYPE_LIGHT (5): 10.000000
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A  backtrace:
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #00 pc 0000000000089cd0  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 698b6aef520f034a9d40736d477f7a96)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #01 pc 00000000000b2360  /apex/com.android.runtime/lib64/bionic/libc.so (__fortify_fatal(char const*, ...)+124) (BuildId: 698b6aef520f034a9d40736d477f7a96)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #02 pc 00000000000b2f9c  /apex/com.android.runtime/lib64/bionic/libc.so (__vsprintf_chk+144) (BuildId: 698b6aef520f034a9d40736d477f7a96)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #03 pc 00000000001199e0  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/base.apk!libJni.so (offset 0xa57000) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #04 pc 00000000001197c8  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/base.apk!libJni.so (offset 0xa57000) (CSystem::aaaaa(char*, char*)+972) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #05 pc 0000000000091b1c  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/base.apk!libJni.so (offset 0xa57000) (Java_aa.bb.cc.dd_jniqta_Process+2124) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #06 pc 000000000009cb98  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/oat/arm64/base.odex (art_jni_trampoline+152)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #07 pc 0000000000134564  /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 88f26013f87f4da3613557f39f57fd6a)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #08 pc 00000000001a9a78  /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+200) (BuildId: 88f26013f87f4da3613557f39f57fd6a)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #09 pc 000000000032129c  /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+376) (BuildId: 88f26013f87f4da3613557f39f57fd6a)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #10 pc 00000000003175c8  /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+996) (BuildId: 88f26013f87f4da3613557f39f57fd6a)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #11 pc 000000000068cd1c  /apex/com.android.art/lib64/libart.so (MterpInvokeVirtualQuick+672) (BuildId: 88f26013f87f4da3613557f39f57fd6a)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #12 pc 0000000000132594  /apex/com.android.art/lib64/libart.so (mterp_op_invoke_virtual_quick+20) (BuildId: 88f26013f87f4da3613557f39f57fd6a)...(省略)

分析并解决

分析

注意这三行:

...(省略)
2023-03-09 23:20:22.987  6426-6426  libc                    pid-6426                             A  FORTIFY: vsprintf: prevented 173-byte write into 30-byte buffer
2023-03-09 23:20:22.988  6426-6426  libc                    pid-6426                             A  Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 6426 (.aa.bb.cc.dd), pid 6426 (.aa.bb.cc.dd)
...(省略)
2023-03-09 23:20:23.077  7176-7176  DEBUG                   pid-7176                             A  Abort message: 'FORTIFY: vsprintf: prevented 173-byte write into 30-byte buffer'
...(省略)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #03 pc 00000000001199e0  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/base.apk!libJni.so (offset 0xa57000) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #04 pc 00000000001197c8  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/base.apk!libJni.so (offset 0xa57000) (CSystem::aaaaa(char*, char*)+972) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
2023-03-09 23:20:23.348  7176-7176  DEBUG                   pid-7176                             A        #05 pc 0000000000091b1c  /data/app/~~l8Fk9UOg3WqEsbf_8ul2pg==/sg.aa.bb.cc.dd-c3ewrrLy2U1YDGg7VQZPnA==/base.apk!libJni.so (offset 0xa57000) (Java_aa.bb.cc.dd_jniqta_Process+2124) (BuildId: 4cf43bec77672ebce12c16cca6693b03939d28da)
...(省略)

以上有三个信息,

  • 173个字节要写入一个30个字节的缓存区,写入数据过界。
  • signal 6 (SIGABRT) 信号6发生产生崩溃。
  • 在libJni.so中发生问题,具体位置待定。

使用add2line定位具体报错的行数

以下是通过llvm-addr2line.exe来定位具体出错的是哪一行:

C:\Users\John\AppData\Local\Android\Sdk\platform-tools>C:\Users\John\AppData\Local\Android\Sdk\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-addr2line.exe -f -C -e C:\John_Development\libJni.so 00000000001199e0
sprintf(char*, char const* pass_object_size1, ...)
C:/Users/John/AppData/Local/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/bits/fortify/stdio.h:74C:\Users\John\AppData\Local\Android\Sdk\platform-tools>C:\Users\John\AppData\Local\Android\Sdk\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-addr2line.exe -f -C -e C:\John_Development\libJni.so 00000000001197c8
CSystem::aaaaa(char*, char*)
D:/src/aaaaa.cpp:110C:\Users\John\AppData\Local\Android\Sdk\platform-tools>C:\Users\John\AppData\Local\Android\Sdk\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-addr2line.exe -f -C -e C:\John_Development\libJni.so 0000000000091b1c
Java_aa.bb.cc.dd_jniqta_Process
D:/src/bbbbb.cpp:468C:\Users\John\AppData\Local\Android\Sdk\platform-tools>

解决

具体出错的是sprintf(str, "%.2fMB(%.2f%%)", double_a, double_b);这一行,由于sprintf(…)不进行边界检查,写操作溢出边界,173个字节要写入一个30个字节的缓存区, 并导致程序崩溃。使用更为安全的snprintf(…)方法进行格式化,可以解决问题。

参考

CSDN: Android NDK Crash 定位分析
CSDN: Android NativeCrash 捕获与解析
CSDN: 使用 ndk-stack 寻找Android程序Crash的原因
Cnblogs: Android Tombstone 分析
CSDN:导出ANR、tombstones文件 - 无惧Permission denied  
CSDN: 使用addr2line 定位 FORTIFY: vsprintf: prevented write past end of buffer‘ 报错解决思路
CSDN: bug解决-内核C库写保护(FORTIFY: write: prevented read past end of buffer)
知乎: Android NDK Tombstone/Crash 分析
Native crash (Tombstone) in android AOSP

相关文章:

一次Android App NDK崩溃问题的分析及解决

文章目录小结NDK崩溃的问题通过logcat查看崩溃日志提取tombstone的记录通过ndk-stack来输出日志取得的日志分析并解决分析使用add2line定位具体报错的行数解决参考小结 最近碰一次Android App NDK崩溃的问题&#xff0c;这个NE&#xff08;Native Exception&#xff09;是从ND…...

因果图判定表法

因果图&判定表法 在了解了等价类和边界值比较适宜搭档的测试用例方法之后 接下来我们来了解另外一队就是因果图和判定表 因果图会产生判定表法 因果图法 等价类划分法和边界值分析方法都是着重考虑输入条件而不考虑输入条件的各种组合、输入条件之间的相互制约关系。例…...

Oracle 数据库相关信息清单列表

Oracle 数据库相关信息清单列表 一、设置Oracle安装目录 Oracle基目录(ORACLE_BASE):D:\databases\oracle\oracle_11g\app\Administrator 软件位置(ORACLE_HOME):D:\databases\oracle\oracle_11g\app\Administrator\product\11.2.0\dbhome_1 数据库文件位置:D:\databa…...

射频资料搜集--推荐几个网站和链接

https://picture.iczhiku.com/resource/eetop/wHKYFQlDTRRShCcc.pdfhttps://picture.iczhiku.com/resource/eetop/wHKYFQlDTRRShCcc.pdfVCO pulling的资料 模拟滤波器与电路设计手册 - 射频微波仿真 - RF技术社区 Practical RF Amplifier Design Using the Available Gain Pr…...

B1048 数字加密

decription 本题要求实现一种数字加密方法。首先固定一个加密用正整数 A&#xff0c;对任一正整数 B&#xff0c;将其每 1 位数字与 A 的对应位置上的数字进行以下运算&#xff1a;对奇数位&#xff0c;对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 …...

Qt使用FFmpeg播放视频

一、使用场景 因为项目中需要加载MP4播放开机视频&#xff0c;而我们的设备所使用的架构为arm架构&#xff0c;其中缺乏一些多媒体库。安装这些插件库比较麻烦&#xff0c;所以最终决定使用FFmpeg播放视频。 二、下载编译ffmpeg库 2.1 下载源码 源码下载路径&#xff1a;http…...

Win32 ListBox控件

Win32 ListBox控件 创建ListBox控件 创建窗口函数 HWND CrateWindowEx(DWORD dwExStyle , // 窗口的扩展风格,基本没用LPCTSTR lpClassName, // 已经注册的窗口类名称LPCTSTR lpWindowName, // 窗口标题栏的名字DWORD dwStyle, // 窗口的基本风格int x, // 左上角水平坐标int …...

最大值池化与均值池化比较分析

1 问题在深度学习的卷积网络过程中&#xff0c;神经网络有卷积层&#xff0c;池化层&#xff0c;全连接层。而池化层有最大值池化和均值池化两种情况&#xff0c;而我们组就在思考&#xff0c;最大值池化和均值池化有什么区别呢&#xff1f;两者的模型准确率是否有所不同&#…...

统计学 多元线性回归

文章目录统计学 多元线性回归多元线性回归模型拟合优度显著性检验线性关系检验回归系数检验多重共线性及其处理多重共线性的问题多重共线性的识别与处理变量选择利用回归方程进行预测哑变量回归统计学 多元线性回归 多元线性回归模型 多元线性回归模型&#xff1a;设因变量为…...

tar和gzip压缩和解压

打包和压缩的区别&#xff1a;打包&#xff1a;将多文件 封装在一起压缩&#xff1a;将多文件 封装在一起 通过特定的算法 将冗余的数据 进行删除tar默认是打包命令&#xff0c;如果想用tar进行压缩 必须加选项1、gzip格式压缩&#xff1a;tar zcvf 压缩包包名 文件1 文件2 文件…...

搭建Docker企业私有仓库

什么是仓库 仓库&#xff08;Repository&#xff09;是存储和分发 Docker 镜像的地方。镜像仓库类似于代码仓库&#xff0c;Docker Hub 的命名来自 GitHub&#xff0c;Github 是我们常用的代码存储和分发的地方。同样 Docker Hub 是用来提供 Docker 镜像存储和分发的地方。 谈…...

[NOIP2009 提高组] 最优贸易(C++,tarjan,topo,DP)

题目描述 $C 国有国有国有 n 个大城市和个大城市和个大城市和 m$ 条道路&#xff0c;每条道路连接这 nnn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mmm 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的…...

计算机网络:移动IP

移动IP相关概念 移动IP技术是移动结点&#xff08;计算机/服务器&#xff09;以固体的网络IP地址&#xff0c;实现跨越不同网段的漫游功能&#xff0c;并保证了基于网络IP的网络权限在漫游中不发生任何改变。移动结点&#xff1a;具有永久IP地址的设备。归属代理&#xff08;本…...

binutils工具集——GNU binutils工具集简介

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 GNU binutils是一个二进制工具集&#xff0c;主要包括&#xff1a; ld&#xff0c;GNU链接器。as&#xff0c;GNU汇编器。addr2line&#xff0c;把地址转化为文件名和行号。nm&#xff0c;列出目标文件的符…...

Golang编译选项(ldflags)有趣应用

本文介绍如何在构建时使用ldflags选项给Golang应用程序注入变量&#xff0c;用于给Go可执行文件增加版本标识或GIT提交摘要等信息。 应用程序的版本信息 我们首先查看Docker Cli 包含的提交信息&#xff1a; docker version 返回结果&#xff1a; Server: Docker Engine - Co…...

AIR32F103(十一) 在AIR32F103上移植微雪墨水屏驱动

目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告AIR32F103(二) Linux环境和LibOpenCM3项目模板AIR32F103(三) Linux环境基于标准外设库的项目模板AIR32F103(四) 27倍频216MHz,CoreMark跑分测试AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码AIR32F103(六) ADC,I2S…...

Uipath Excel 自动化基础系列文章

Uipath Excel 自动化基础系列文章已发布到CSDN,网址&#xff1a;https://blog.csdn.net/Marshaljun?typeblog (3月份会在CSDN博客发布Uipath Excel 实战课程及经验分享) Uipath Studio流程设计器介绍 https://blog.csdn.net/Marshaljun/article/details/128699022 Uipath St…...

神经网络优化器之随机梯度下降法的理解

随机梯度下降法&#xff08;SGD&#xff09;随机梯度下降方法&#xff0c;在每次更新时用1个样本&#xff0c;随机也就是说我们用样本中的一个例子来近似我所有的样本&#xff0c;由于计算得到的并不是准确的一个梯度&#xff0c;因而不是全局最优的。但是相比于批量梯度&#…...

记录一次WIN11开机在登录页面循环的问题

记录一次由于未进行win密码设置&#xff0c;导致开机后卡在登录界面无法登录进去的问题。最后完美解决了。 1. 背景 开机后&#xff0c;显示用户登录界面&#xff0c;但是和以往不同&#xff0c;没有了密码输入框&#xff0c;只有一个“登录”按钮孤零零地显示在屏幕中间&…...

始终从最不易改变的方面开始

在你刚开始新工作、转换职业或者是加入新项目时&#xff0c;始终从最不易改变的方面开始。 在工作中&#xff0c;这可能意味着与团队成员建立关系&#xff0c;了解公司的流程和文化&#xff0c;或者熟悉公司的产品或服务。 在一项新项目中&#xff0c;这可能意味着了解项目范…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...