Android ANR 实例分析

什么是ANR?

以下四个条件都可以造成ANR发生:

  • InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
  • BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒。
  • Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
  • ContentProvider Timeout :ContentProvider的publish在10s内没进行完。
    https://www.jianshu.com/p/388166988cef

实例分析

我们测试过程中跑monkey测试的时候,发生了ANR,LOG非常多。但是分析原因的时候还是非常考验思路。
需要三个文件

  • traces.txt traces状态
  • threath.txt 这个是最后的进程状态
  • logcat日志
    日志链接,想分析的自行下载
    链接:https://pan.baidu.com/s/1i0Lf2luKbbEwXMATKErI8w
    提取码:wutm

1.搜索ANR in这个关键字

12-27 01:18:59.865   562   591 E ActivityManager: ANR in com.android.music
12-27 01:18:59.865   562   591 E ActivityManager: PID: 5563
12-27 01:18:59.865   562   591 E ActivityManager: Reason: Broadcast of Intent { act=android.intent.action.MEDIA_BUTTON flg=0x10 cmp=com.android.music/.MediaButtonIntentReceiver (has extras) }
12-27 01:18:59.865   562   591 E ActivityManager: Load: 0.0 / 0.0 / 0.0
12-27 01:18:59.865   562   591 E ActivityManager: CPU usage from 5870ms to 375ms ago (2018-12-27 01:18:53.949 to 2018-12-27 01:18:59.444):
12-27 01:18:59.865   562   591 E ActivityManager:   105% 562/system_server: 103% user + 2.1% kernel / faults: 435 minor
12-27 01:18:59.865   562   591 E ActivityManager:   100% 30/kconsole: 0% user + 100% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   3.6% 204/healthd: 0.5% user + 3% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   2.3% 164/ueventd: 1.2% user + 1% kernel / faults: 1 minor
12-27 01:18:59.865   562   591 E ActivityManager:   2.3% 186/logd: 1% user + 1.2% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   2% 235/log-watch: 1% user + 0.9% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.9% 132/irq/78-0-006a: 0% user + 0.9% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.9% 5579/kworker/1:1: 0% user + 0.9% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.7% 230/netd: 0.3% user + 0.3% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.5% 1125/com.android.phone: 0.3% user + 0.1% kernel / faults: 8 minor
12-27 01:18:59.865   562   591 E ActivityManager:   0.1% 287/logcatext: 0% user + 0% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.1% 5112/com.android.commands.monkey: 0.1% user + 0% kernel / faults: 5 minor
12-27 01:18:59.865   562   591 E ActivityManager:   0.1% 7/rcu_preempt: 0% user + 0.1% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0% 24/ksoftirqd/3: 0% user + 0% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.1% 194/vold: 0% user + 0.1% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.1% 205/displayd: 0.1% user + 0% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0% 209/servicemanager: 0% user + 0% kernel
12-27 01:18:59.865   562   591 E ActivityManager:   0.1% 210/surfaceflinger: 0% user + 0.1% kernel
12-27 01:18:59.865   562   591 E ActivityManager: 54% TOTAL: 27% user + 27% kernel
12-27 01:18:59.865   562   591 E ActivityManager: CPU usage from 50244340ms to 50244340ms ago (1970-01-01 02:00:00.000 to 1970-01-01 02:00:00.000) with 0% awake:
12-27 01:18:59.865   562   591 E ActivityManager: 0% TOTAL: 0% user + 0% kernel
12-27 01:18:59.865     0     0 W KERNEL  : [50232.754404] healthd: battery l=66 v=4082 t=30.9 h=2 st=2 chg=
12-27 01:18:59.990   562   594 W BatteryStatsService: Timeout reading modem stats
12-27 01:18:59.998  1125  1125 D RILJ    : [9781]> RIL_REQUEST_GET_ACTIVITY_INFO [SUB0]
12-27 01:18:59.999  1125  1125 D RilRequest: [9781]< RIL_REQUEST_GET_ACTIVITY_INFO error: com.android.internal.telephony.CommandException: RADIO_NOT_AVAILABLE ret=
12-27 01:18:59.999  1125  1125 E PhoneInterfaceManager: [PhoneIntfMgr] queryModemActivityInfo: Empty response
12-27 01:18:59.999  1125  1522 E JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 276)
12-27 01:18:59.999   562   594 E BatteryStatsService: no controller energy info supplied
12-27 01:18:59.999   562   594 E BatteryStatsService: no controller energy info supplied
12-27 01:19:00.000     0     0 W KERNEL  : [50232.884468] healthd: battery l=66 v=4082 t=30.9 h=2 st=2 chg=a
12-27 01:19:00.059   562  8694 ? 

然后这里可以看到ANR 的PID是5563
回到traces.txt 找一下这个 com.android.music
在这里插入图片描述

干他大爷的,发现没有找到~~~~~~

不着急,

我们刚才看那个日志的时候比较早,traces.txt可能会后面的日志冲掉了原因是

Wrote stack traces to '/data/anr/traces.txt'

这个是每次发生anr的时候,想traces文件写入数据的日志
我们找最后一次写入这个文件的日志位置

12-27 03:02:54.175     0     0 W KERNEL  : [56327.543907]   .cpu_load[0]                   : 84
12-27 03:02:54.178   562  1364 I Process : Sending signal. PID: 562 SIG: 3
12-27 03:02:54.179   562   567 I art     : Thread[2,tid=567,WaitingInMainSignalCatcherLoop,Thread*=0xa6d0c000,peer=0x12c010d0,"Signal Catcher"]: reacting to signal 3
12-27 03:02:54.179   562   567 I art     : 
12-27 03:02:54.180     0     0 W KERNEL  : [56327.543921]   .cpu_load[1]                   : 54
12-27 03:02:54.641   562   567 I art     : Wrote stack traces to '/data/anr/traces.txt'
12-27 03:02:54.641   562  1364 I Process : Sending signal. PID: 1125 SIG: 3
12-27 03:02:54.641  1125  1128 I art     : Thread[3,tid=1128,WaitingInMainSignalCatcherLoop,Thread*=0xa433fe00,peer=0x12c00670,"Signal Catcher"]: reacting to signal 3
12-27 03:02:54.641     0     0 W KERNEL  : [56327.543932]   .cpu_load[2]                   : 30
12-27 03:02:54.641  1125  1128 I art     : 
12-27 03:02:54.653     0     0 W KERNEL  : [56327.543945]   .cpu_load[3]                   : 16
12-27 03:02:54.693  1125  1128 I art     : Wrote stack traces to '/data/anr/traces.txt'
12-27 03:02:54.698     0     0 W KERNEL  : [56327.543958]   .cpu_load[4]                   : 9
12-27 03:02:54.698   193   193 W         : debuggerd: handling request: pid=210 uid=1000 gid=1003 tid=210
12-27 03:02:54.698     0     0 W KERNEL  : [56327.543972]   .yld_count                     : 570694
12-27 03:02:54.791   193   193 W         : debuggerd: resuming target 210
12-27 03:02:54.791     0     0 W KERNEL  : [56327.543986]   .sched_count                   : 127372328
12-27 03:02:54.792   193   193 W         : debuggerd: handling request: pid=221 uid=1041 gid=1005 tid=221
12-27 03:02:54.792     0     0 W KERNEL  : [56327.544001]   .sched_goidle                  : 25588776
12-27 03:02:54.870   193   193 W         : debuggerd: resuming target 221
12-27 03:02:54.871     0     0 W KERNEL  : [56327.544014]   .avg_idle                      : 1000000
12-27 03:02:54.871   193   193 W         : debuggerd: handling request: pid=222 uid=1047 gid=1005 tid=222
12-27 03:02:54.871     0     0 W KERNEL  : [56327.544022]   .max_idle_balance_cost         : 500000
12-27 03:02:54.904   193   193 W         : debuggerd: resuming target 222
12-27 03:02:54.905     0     0 W KERNEL  : [56327.544030]   .ttwu_count                    : 68703282
12-27 03:02:54.905   193   193 W         : debuggerd: handling request: pid=223 uid=1019 gid=1019 tid=223
12-27 03:02:54.905     0     0 W KERNEL  : [56327.544037]   .ttwu_local                    : 31888109
12-27 03:02:54.917   193   193 W         : debuggerd: resuming target 223
12-27 03:02:54.917     0     0 W KERNEL  : [56327.544045] \x0acfs_rq[1]:/bg_non_interactive
12-27 03:02:54.917   193   193 W         : debuggerd: handling request: pid=226 uid=1046 gid=1006 tid=226
12-27 03:02:54.917     0     0 W KERNEL  : [56327.544057]   .exec_clock                    : 1419463.649513
12-27 03:02:54.968   193   193 W         : debuggerd: resuming target 226
12-27 03:02:54.968     0     0 W KERNEL  : [56327.544065]   .MIN_vruntime                  : 0.000001
12-27 03:02:54.968   193   193 W         : debuggerd: handling request: pid=227 uid=1013 gid=1031 tid=227
12-27 03:02:54.968     0     0 W KERNEL  : [56327.544072]   .min_vruntime                  : 10007865.678185
12-27 03:02:54.982   193   193 W         : debuggerd: resuming target 227

Process : Sending signal. PID: 1125 SIG: 3
PID 1125 被发送了一个SIG3 然后我们查一下这个SIG 3
说明1125 被杀死了,信号值对应的数值如下

信号 值 处理动作 发出信号的原因 
---------------------------------------------------------------------- 
SIGHUP 1 A 终端挂起或者控制进程终止 
SIGINT 2 A 键盘中断(如break键被按下) 
SIGQUIT 3 C 键盘的退出键被按下 
SIGILL 4 C 非法指令 
SIGABRT 6 C 由abort(3)发出的退出指令 
SIGFPE 8 C 浮点异常 
SIGKILL 9 AEF Kill信号 
SIGSEGV 11 C 无效的内存引用 
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道 
SIGALRM 14 A 由alarm(2)发出的信号 
SIGTERM 15 A 终止信号 
SIGUSR1 30,10,16 A 用户自定义信号1 
SIGUSR2 31,12,17 A 用户自定义信号2 
SIGCHLD 20,17,18 B 子进程结束信号 
SIGCONT 19,18,25 进程继续(曾被停止的进程) 
SIGSTOP 17,19,23 DEF 终止进程 
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键 
SIGTTIN 21,21,26 D 后台进程企图从控制终端读 
SIGTTOU 22,22,27 D 后台进程企图从控制终端写 下面的信号没在POSIX.1中列出,而在SUSv2列出 信号 值 处理动作 发出信号的原因 

链接:www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html

然后我们继续搜下
在这里插入图片描述

从这个图片看到了,这个1125不断的被杀死,因为是系统进程,自己又无耻的启动,反复如此,就出现了上面的日志。

然后继续回到traces.txt里面分析

看thread.txt里面查看1125这个进程的名字是android.phone.

1125  1125 radio    20   0   0% S 1024340K  87388K  fg m.android.phone com.android.phone1125  1127 radio    29   9   0% S 1024340K  87388K  fg Jit thread pool com.android.phone1125  1128 radio    20   0   0% S 1024340K  87388K  fg Signal Catcher  com.android.phone1125  1129 radio    20   0   0% S 1024340K  87388K  fg JDWP            com.android.phone

然后在看thread.txt里面查看562这个进程的名字是system_server,如下图

562   562 system   18  -2   0% S 1851968K 408908K  fg system_server   system_server562   567 system   20   0   0% S 1851968K 408908K  fg Signal Catcher  system_server562   569 system   20   0   0% S 1851968K 408908K  fg ReferenceQueueD system_server562   570 system   20   0   0% S 1851968K 408908K  fg FinalizerDaemon system_server562   571 system   20   0   0% S 1851968K 408908K  fg FinalizerWatchd system_server562   572 system   20   0   0% S 1851968K 408908K  fg HeapTaskDaemon  system_server562   588 system   20   0   0% S 1851968K 408908K  fg Binder:562_1    system_server

然后再在traces.txt里面看

----- pid 562 at 2018-12-27 03:03:32 -----
Cmd line: system_server
Build fingerprint: 'Android/rk3288_pad/rk3288_pad:7.1.2/NHG47K/52:userdebug/test-keys'
ABI: 'arm'

这是system_server出现问题的时候记录下来的日志,然后继续往下看

"main" prio=5 tid=1 Native| group="main" sCount=1 dsCount=0 obj=0x73d514a0 self=0xae105400| sysTid=562 nice=-2 cgrp=default sched=0/0 handle=0xb0eb2534| state=S schedstat=( 265574536000 322529001630 703903 ) utm=21655 stm=4901 core=1 HZ=100| stack=0xbe0b4000-0xbe0b6000 stackSize=8MB| held mutexes=native: #00 pc 00017418  /system/lib/libc.so (syscall+28)native: #01 pc 00046eab  /system/lib/libc.so (_ZL24__pthread_cond_timedwaitP23pthread_cond_internal_tP15pthread_mutex_tbPK8timespec+102)native: #02 pc 000846d7  /system/lib/libmedia.so (_ZN7android11MediaPlayer7prepareEv+82)native: #03 pc 0002b683  /system/lib/libmedia_jni.so (???)native: #04 pc 00a5780f  /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_media_MediaPlayer__1prepare__+74)at android.media.MediaPlayer._prepare(Native method)at android.media.MediaPlayer.prepare(MediaPlayer.java:1365)at android.media.Ringtone.setUri(Ringtone.java:298)at android.media.Ringtone.setAudioAttributes(Ringtone.java:134)at android.media.Ringtone.setStreamType(Ringtone.java:105)at com.android.server.power.Notifier.playWirelessChargingStartedSound(Notifier.java:702)at com.android.server.power.Notifier.-wrap0(Notifier.java:-1)at com.android.server.power.Notifier$NotifierHandler.handleMessage(Notifier.java:728)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:154)at com.android.server.SystemServer.run(SystemServer.java:358)at com.android.server.SystemServer.main(SystemServer.java:225)at java.lang.reflect.Method.invoke!(Native method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)

这是出现问题的栈指针和函数调用的情况,可以看到是
at android.media.MediaPlayer._prepare(Native method)
at android.media.MediaPlayer.prepare(MediaPlayer.java:1365)
这里出现了问题,具体原因需要根据日志去分析了

总结梳理一下流程

在这里插入图片描述
1125 这个是com.android.phone 是android 拨打电话的进程
562 这个是android_server 系统进程
这两个在日志里面不断的相爱相杀了很多次,从traces.txt的原因上来看是MediaPlayer.prepare阻塞的原因,但是android_server正常没人惹他,他是不会发生这么多次崩溃的,所以最终导致的原因应该是com.android.phone调用了system_server的东西。

然后为什么com.android.phone会有问题呢?
继续摸索了一下日志

12-27 02:39:44.726  1125  1125 D RILJ    : [8577]> RIL_REQUEST_GET_ACTIVITY_INFO [SUB0]
12-27 02:39:44.727  1125  1125 D RilRequest: [8577]< RIL_REQUEST_GET_ACTIVITY_INFO error: com.android.internal.telephony.CommandException: RADIO_NOT_AVAILABLE ret=
12-27 02:39:44.727  1125  1125 E PhoneInterfaceManager: [PhoneIntfMgr] queryModemActivityInfo: Empty response
12-27 02:39:44.732   562   594 E BatteryStatsService: modem info is invalid: ModemActivityInfo{ mTimestamp=0 mSleepTimeMs=0 mIdleTimeMs=0 mTxTimeMs[]=[0, 0, 0, 0, 0] mRxTimeMs=0 mEnergyUsed=0}
12-27 02:39:44.735   562   594 E BatteryStatsService: no controller energy info supplied
12-27 02:39:44.735   562   594 E BatteryStatsService: no controller energy info supplied
12-27 02:39:44.736  1125  1125 D RILJ    : [8578]> RIL_REQUEST_GET_ACTIVITY_INFO [SUB0]
12-27 02:39:44.736  1125  1125 D RilRequest: [8578]< RIL_REQUEST_GET_ACTIVITY_INFO error: com.android.internal.telephony.CommandException: RADIO_NOT_AVAILABLE ret=
12-27 02:39:44.736  1125  1125 E PhoneInterfaceManager: [PhoneIntfMgr] queryModemActivityInfo: Empty response
12-27 02:39:44.741   562   594 E BatteryStatsService: modem info is invalid: ModemActivityInfo{ mTimestamp=0 mSleepTimeMs=0 mIdleTimeMs=0 mTxTimeMs[]=[0, 0, 0, 0, 0] mRxTimeMs=0 mEnergyUsed=0}
12-27 02:39:44.745   562   594 E BatteryStatsService: no controller energy info supplied
12-27 02:39:44.745   562   594 E BatteryStatsService: no controller energy info supplied

1125 调用了modem相关的东西,也就是在monkey测试过程中拨打了电话和,但是因为我们是平板项目,硬件上根本是没有modem的,原声的系统是也是去掉了这个apk的,我们是为了做暗码组合键功能才调出来的。

实际分析如上,如果有不正确的,请留言指正,谢谢

欢迎关注微信公众号-嵌入式Linux

觉得不错,请帮忙转发,点赞,您的每一次支持,我都将铭记于心

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

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

相关文章

【GIT 基础篇六】分支管理(创建与合并)

上篇我们整理了如何创建远程仓库&#xff0c;以及如何将本地文件上传至远程仓库&#xff0c;仓库创建好了&#xff0c;我们接下来就要准备开发了&#xff0c;对于使用git而言&#xff0c;通常的习惯就是一人一个分支&#xff0c;等测试无误再合并&#xff1b;又或者根据需求创建…

git 命令汇总

瞎扯 最近有几个留言想让写下git的内容&#xff0c;git是一个工具&#xff0c;主要是用来管理码农的代码的&#xff0c;理由很简单&#xff0c;码农写的代码太多&#xff0c;自己都不知道可能哪里出现了Crash。Linux也是因为git的出现&#xff0c;可以让世界上越来越多的人维护…

我的最佳队友之K8无线蓝牙键盘深度使用测评( Keychron K8 )

K8 无线蓝牙键盘深度使用测评&#xff08; Keychron K8 &#xff09;——500 元左右最适配 Mac 电脑的机械键盘 0.键盘参数&#xff1a; 首先我们在实际测评之前&#xff0c;看下这个键盘的具体参数&#xff0c;心里有个大致的了解~ 87键 国产佳达隆G轴 可选茶轴/红轴/青轴 蓝…

你见过哪些操蛋的代码?

NO.1#define TRUE FALSE //Happy debugging suckers快乐的去调试你的代码吧&#xff0c;哈哈NO.2#define NULL (::rand() % 2) // would be quite nice aswell嗯&#xff0c;这个代码也很不错NO.3#define if( if(!卧槽&#xff0c;这个代码更加叼&#xff0c;哈哈&#xff…

后序线索树怎样画图_算法新解刘新宇(二)二叉搜索树:数据结构中的“hello world”...

二叉搜索树BST定义&#xff1a;基于广义二叉树&#xff0c;一颗二叉树定义&#xff1a;或者为空 或者包含三部分&#xff1a;一个值&#xff0c;一个左分支和一个右分支。这两个分支也都是二叉树分支。一颗二叉搜索树是满足下面条件的二叉树&#xff1a;所有左分支的值都小于本…

Android 亮屏速度分析总结

前面聊的 最近在调试项目的亮屏速度&#xff0c;我们希望在按下power键后到亮屏这个时间能达到500MS以内&#xff0c;在Rockchip 3399和3288上面的时间都不能达到要求&#xff0c;因此引发了一系列的调试之路。 计算按下power键到亮屏的时间 Android 唤醒时间统计 刚开始的时…

英语学习中总结的阅读、段落匹配、选词填空技巧

1 阅读题 一般五道题都是围绕主旨来问的&#xff0c;所以后四个问题也能帮助第一题的解答&#xff0c;找共有词~~~串起来 文章一般都是新旧观点的碰撞&#xff0c;所以有时候他问的是旧观点&#xff0c;要看清楚他问的是新观点还是旧观点&#xff0c;这是个陷阱~ 2 段落匹配 反…

sql 账号查询一个表查询权限_一个查询语句引发的问题以及巨型表相关操作探索与思考...

背景&#xff1a;关于这个标题想了试了好几个总觉得欠那么点意思。大致情况是&#xff0c;在某服务支持中&#xff0c;1张大表4.5T左右&#xff0c;该表也是分区表。其中一个执行频繁的SQL写法有很大问题&#xff0c;导致巨表全量扫描&#xff0c;造成IO负载很大&#xff0c;业…

Android 亮屏速度分析

前面聊的最近在调试项目的亮屏速度&#xff0c;我们希望在按下power键后到亮屏这个时间能达到500MS以内&#xff0c;在Rockchip 3399和3288上面的时间都不能达到要求&#xff0c;因此引发了一系列的调试之路。计算按下power键到亮屏的时间Android 唤醒时间统计刚开始的时候&…

container_of实例

1 前面说的 container_of 在linux内核代码里面使用非常多&#xff0c;对于喜欢linux编程的同学来说&#xff0c;对这个函数要非常清楚他的使用方法&#xff0c;而且还要知道他的原理&#xff0c;这对以后看内核代码&#xff0c;写内核驱动的帮助都非常大&#xff0c;当然&…

Git 分布式版本控制工具 03Git常用命令:Git全局设置+本地与远程仓库操作获取Git仓库+标签操作+忽略名单+工作区、暂存区、版本库+分支操作+暂时保存

Git常用命令目录4 Git常用命令4.1 Git全局设置4.2 获取Git仓库4.2.1 在本地初始化Git仓库4.2.2 从远程仓库克隆4.3 常见的概念&#xff1a;工作区、暂存区、版本库4.4 常见的概念&#xff1a;Git工作区中文件的状态4.5 本地仓库操作4.5.1 git status4.5.2 git add4.5.3 git res…

matlab dir函数_MATLAB自动管理文件

MATLAB自动管理文件1. MATLAB中路径设置(1)cd:用于切换当前工作目录示例&#xff1a;将当前工作目录切换到D:\Documents\MATLAB\Matlab test\study下。代码:cd (D:\Documents\MATLAB\Matlab test\study)(2)path:用于对搜索路径的操作示例&#xff1a;先查看当前所有的文件路径&…

Git 分布式版本控制工具 04Gitcode案例:多人协作开发流程+创建仓库+拉取操作+克隆仓库+拉取远程仓库中最新的版本+修改拉取的本地代码

文章目录5. Gitcode5.1 多人协作开发流程5.2 创建仓库5.3 拉取操作5.3.1 克隆仓库5.3.2 拉取远程仓库中最新的版本5.4 修改拉取的本地代码5.5 解决冲突5.6 跨团队协作5. Gitcode 在版本控制系统中&#xff0c;大约90%的操作都是在本地仓库中进行的&#xff1a;暂存&#xff0c…

rabbitmq如何保证消息不被重复消费_如何保证消息不被重复消费

一. 重复消息为什么会出现消息重复&#xff1f;消息重复的原因有两个&#xff1a;1.生产时消息重复&#xff0c;2.消费时消息重复。1.1 生产时消息重复由于生产者发送消息给MQ&#xff0c;在MQ确认的时候出现了网络波动&#xff0c;生产者没有收到确认&#xff0c;实际上MQ已经…

Git 分布式版本控制工具 06在IDEA中使用Git:获取Git仓库+本地仓库操作+远程仓库操作+创建/查看/切换/推送/合并分支操作

在IDEA中使用Git7. 在IDEA中使用Git7.1 在IDEA中配置Git7.2 获取Git仓库7.2.1 本地初始化仓库7.2.2 从远程仓库克隆7.3 Git忽略文件7.4 本地仓库操作7.4.1 将文件加入暂存区7.4.2 将暂存区文件提交到版本库7.4.3 查看日志7.5 远程仓库操作7.5.1 查看远程仓库7.5.2 添加远程仓库…

linux 内核宏container_of剖析

1、前面说的我在好几年前读linux 驱动代码的时候看到这个宏&#xff0c;百度了好久&#xff0c;知道怎么用了&#xff0c;但是对实现过程和原理还是一知半解。container_of宏 在linux内核代码里面使用次数非常非常多&#xff0c;对于喜欢linux编程的同学来说&#xff0c;了解其…

目录树 删除 数据结构_数据结构:B树和B+树的插入、删除图文详解

B树1.1B树的定义B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数&#xff0c;阶数表示了一个结点最多有多少个孩子结点&#xff0c;一般用字母m表示阶数。当m取2时&#xff0c;就是我们常见的二叉搜索树。一颗m阶的B树定义如下&#xff1a;1)每个结点最…

MMdetection框架速成系列 第01部分:学习路线图与步骤+优先学习的两个目标检测模型代码+loss计算流程+遇到问题如何求助+Anaconda3下的安装教程(mmdet+mmdet3d)

mmdetection 学习目录1 mmdetection 学习建议1.1 mmdetection 学习的第一件事1.2 mmdetection学习路线图1.2.1 优先看的两个库1.2.2 阅读代码1.2.3 代码学习步骤1.2.4 建议优先学习的两个目标检测模型代码1.2.5 loss计算流程的攻坚克难1.3 遇到问题如何求助2 Anaconda3下的安装…

机器人循迹小车资料

前言 我记得在大学的时候&#xff0c;参加电子比赛&#xff0c;我们有一个题目是平衡小车项目&#xff0c;那个对基础要求还是比较高的&#xff0c;总结了一些平衡车机器的资料&#xff0c;希望对大家有帮助。 正文 关注公众号&#xff0c;回复【机器人资料】获取

单片机实现环形队列_稀疏数组和队列(二)

队列的介绍队列以一种先入先出(FIFO)的线性表&#xff0c;还有一种先入后出的线性表(FILO)叫做栈。教科书上有明确的定义与描述。类似于现实中排队时的队列(队尾进&#xff0c;队头出)&#xff0c;队列只在线性表两端进行操作&#xff0c;插入元素的一端称为表尾&#xff0c;删…