Android中如何手动制造logcat各等级日志(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)

文章目录

    • 1、logcat与log工具
    • 2、通过log生成logcat日志
      • 2.1、logcat日志等级
      • 2.2、log指令说明
      • 2.3、log生成日志指令
    • 3、制作日志生成shell脚本
    • 4、增加日志生成控制
    • 5、附录

1、logcat与log工具

logcat:是Android操作系统中用于记录和查看系统日志的工具。它是Android开发和调试的重要工具之一,能够通过logcat定位诊断系统故障或应用程序的问题。

log:在android中默认集成的一个生成日志的工具,可以通过log指令来生成我们想要的各类logcat日志来方便测试。

2、通过log生成logcat日志

通过adb工具进入到android控制台:

# emulator-5554为设备名
adb -s emulator-5554 shell

2.1、logcat日志等级

执行logcat –help查看指令说明,可以看到有日志等级,包括六种可以打印的类型(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)。另外一种S(Silent)表示静默,即上面所有类型的日志均不输出。

image-20240727164728108

具体类型说明如下:从上往下等级逐渐升高

  • VERBOSE:最低级别,用于详细的调试信息。
  • DEBUG:用于调试信息,通常在开发过程中使用。
  • INFO:用于普通信息,例如应用程序的运行状态。
  • WARNING:用于警告信息,表明潜在的问题。
  • ERROR:用于错误信息,表示应用程序或系统发生了错误。
  • FATAL:用于表示严重的错误,通常伴随应用程序崩溃。

2.2、log指令说明

执行log --help查看log说明内容:

image-20240727165325663

  • -p:默认打印INFO级别的日志,可以使用-p参数来修改日志级别
  • -t:使用给定标签代替默认的‘log’内容

使用示例:

log -p v -t "syslog_test" "ivi----Log level of : VERBOSE"

image-20240727170501263

执行完之后,执行logcat指令打印,即可得到我们指定的日志内容:

logcat | grep "syslog_test"

image-20240727170647459

脚本说明:

定义日志等级为Verbose,指定日志TAG标签为“syslog_test”——系统日志测试,并输出具体的消息内容为“ivi----Log level of : VERBOSE”

log指令使用起来很简单也很方便。那么参照这个用法,可以生成不同等级不同TAG标签的内容。下面给出不同等级的适用实例。

2.3、log生成日志指令

我们先设置一个时间变量TIME,格式化为“年-月-日 时:分:秒”方便检查时间,后续加入到日志的打印中去:

TIME=`date +'%Y-%m-%d %H:%M:%S'`
  • 生成VERBOSE,标签TAG为“LOG-TEST-1”:
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
  • 生成DEBUG等级,标签TAG为“LOG-TEST-2”:
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
  • 生成INFO等级,标签TAG为“LOG-TEST-3”:
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
  • 生成WARNING等级,标签TAG为“LOG-TEST-4”:
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
  • 生成ERROR等级,标签TAG为“LOG-TEST-5”:
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
  • 生成FATAL等级,标签TAG为“LOG-TEST-6”:
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."

Tips:上面的-p后接的参数,对应与log --help中的说明:

image-20240727172415329

3、制作日志生成shell脚本

在我们知道如何通过log生成单条不同等级和标签的用例后,那么我们接下来要通过这些指令,进行批量造日志了。在shell中使用循环语句来控制日志生成指令:

  • 一组日志生成语句,包含下面这些:
TIME=`date +'%Y-%m-%d %H:%M:%S'`
log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."
log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."
log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."
log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."
log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."
log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."
  • shell中的循环控制是这样:
while [condition]
do[sentence]
done

加入日志生成,其中再加入时延控制,usleep 200000间隔200毫秒1组:

TIME=`date +'%Y-%m-%d %H:%M:%S'`
while true
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000
done

在Android6.0之后,可以通过集成的toybox工具集来使用vi工具,接下来使用vi来创建shell脚本:

# android控制面板执行
toybox vi /data/genlog.sh

键入i后,输入上面的命令内容,粘贴内容之后输入Esc+:键,之后敲入wq保存并退出编辑。

# 检查创建的脚本
cat /data/genlog.sh

赋予执行权限:

chmod +x genlog.sh

执行/data/genlog.sh开始生成日志,logcat | grep "LOG-TEST"可以看到能够正常批量生成日志:

image-20240729152708049

也可以通过PC本地创建文本文件,再改为bash文件,使用adb push方式进行上传,使用这种方式需要注意下面两个编码问题:

  • 1、我们通过Windows文本编辑器创建的文本内容,其格式默认为CR LF格式,在android设备中使用的unix编码,需要将编码转换为LF格式,否则在执行while、if等语句时会报错:

image-20240729152949367

出现异常时,会报下面的syntax error: unmatched错误:

image-20240729153226333

  • 2、制表符需要转换为空格,虽然不影响运行,但建议转换为空格执行:

image-20240729153355925

4、增加日志生成控制

当我们想在运行时自由选择生成日志的级别,我们可以通过命令行参数传递进行日志级别控制:

脚本基本结构,通过while或if语句控制条件,之后通过传递的shell参数来判断执行哪一段语句。

1、参数传递:使用$n表示第n个参数,其中$0为文件名,$1开始才是接的第一个参数

# 简单示例
# test.sh文件内容
echo "filename is : $0";
echo "the arg1 is : $1";
# 运行
./test.sh key1

image-20240729160345253

参考:https://www.runoob.com/linux/linux-shell-passing-arguments.html

2、补全while条件:

定义日志等级对应数值1-6,另外加所有日志的生成场景,分别对应如下:

1 -- VERBOSE
2 -- DEBUG
3 -- INFO
4 -- WARNING
5 -- ERROR
6 -- FATAL
all -- 生成所有级别日志

修改while条件语句:

TIME=`date +'%Y-%m-%d %H:%M:%S'`
while [ "$1" == '1' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."usleep 200000
donewhile [ "$1" == '2' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."usleep 200000
donewhile [ "$1" == '3' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."usleep 200000
donewhile [ "$1" == '4' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."usleep 200000
donewhile [ "$1" == '5' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."usleep 200000
donewhile [ "$1" == '6' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000
donewhile [ "$1" == 'all' ]
doTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000
done

运行一下看看,能够成功的自由选择生成的级别了:

./genlog.sh 1生成Verbose等级日志:

image-20240729162142939

./genlog.sh all生成所有级别日志:

image-20240729162309734

./genlog.sh 3生成Info级别日志:

image-20240729162425242

至此已大工告成,上面的实现方法是将while语句与条件单独拆开进行判断,在shell中也可以使用if或case语句进行多条件判断,详见附录。

5、附录

  • IF多条件结构:
if [ condition1 ]; then# 当 condition1 为真时执行
elif [ condition2 ]; then# 当 condition2 为真时执行
else# 当所有条件都不为真时执行
fi

将前面的脚本使用if结构进行修改:

TIME=`date +'%Y-%m-%d %H:%M:%S'`if [ "$1" == '1' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."usleep 200000elif [ "$1" == '2' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."usleep 200000elif [ "$1" == '3' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."usleep 200000elif [ "$1" == '4' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."usleep 200000elif [ "$1" == '5' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."usleep 200000elif [ "$1" == '6' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000elif [ "$1" == 'all' ]; thenTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000elseTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000
fi

修改完成,上面是只能打印1次,加入无条件while循环语句:

TIME=`date +'%Y-%m-%d %H:%M:%S'`if [ "$1" == '1' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."usleep 200000doneelif [ "$1" == '2' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."usleep 200000doneelif [ "$1" == '3' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."usleep 200000doneelif [ "$1" == '4' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."usleep 200000doneelif [ "$1" == '5' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."usleep 200000doneelif [ "$1" == '6' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000doneelif [ "$1" == 'all' ]; thenwhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000doneelsewhile truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000done
fi

控制正常:

image-20240729164529373

image-20240729164820318

  • case多条件结构:
case variable inpattern1)# 当 variable 匹配 pattern1 时执行;;pattern2)# 当 variable 匹配 pattern2 时执行;;*)# 默认情况,当所有模式都不匹配时执行;;
esac

按照case结构进行修改:

TIME=`date +'%Y-%m-%d %H:%M:%S'`case "$1" in'1')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."usleep 200000done;;'2')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."usleep 200000done;;'3')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."usleep 200000done;;'4')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."usleep 200000done;;'5')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."usleep 200000done;;'6')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000done;;'all')while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000done;;*)while truedoTIME=`date +'%Y-%m-%d %H:%M:%S'`log -p v -t "LOG-TEST-1" "GEN LOG level is : VERBOSE------${TIME}."log -p d -t "LOG-TEST-2" "GEN LOG level is : DEBUG--------${TIME}."log -p i -t "LOG-TEST-3" "GEN LOG level is : INFO---------${TIME}."log -p w -t "LOG-TEST-4" "GEN LOG level is : WARNING------${TIME}."log -p e -t "LOG-TEST-5" "GEN LOG level is : ERROR--------${TIME}."log -p f -t "LOG-TEST-6" "GEN LOG level is : FATAL--------${TIME}."usleep 200000done;;
esac

image-20240729170708234

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

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

相关文章

如何在 VPS 上安装和使用 VirtualMin

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 关于 Virtualmin Virtualmin 是 Webmin 的一个模块,允许对(多个)虚拟专用服务器进行广泛的管理。您…

【华为OD机考】2024D卷最全真题【完全原创题解 | 详细考点分类 | 不断更新题目】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过) 文章目录 相关推荐阅读栈常规栈单调栈 队列(题目极少,几乎不考)哈希哈希集合哈希表 前缀和双指针同向双指针 贪…

七、SpringBoot日志

1. 得到日志对象 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; //打印日志…

C++程序使用开源zlib库对二进制字节流数据进行压缩和解压(附源码)

目录 1、概述 2、zlib开源库与开源zip.cpp和unzip.cpp的区别 3、发送端先调用compress压缩,再将数据发出去 4、接收端接收到数据,调用uncompress解压,解压后再使用 5、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.c…

c++-封装案例-设计学生类

类中的属性和行为统称为成员,属性:成员属性、成员变量;行为:成员函数,成员方法。

黛米·摩尔和她的孙女卢埃塔在这张飘逸的快照很亲密

卢埃塔和她的祖母黛米摩尔显然是最好的朋友,这张飘逸的快照证明了这一点。准备好“哇!” 7 月 26 日,摩尔分享了一张非常迷人的照片,照片上有她、她的两个女儿和她的孙女在她昂贵的后院。她在照片中配文说:“夏日&…

vue3-环境变量-JavaScript-axio-基础使用-lzstring-字符串压缩-python

文章目录 1.Vue3环境变量1.1.简介1.2.全局变量的引用1.3.package.json文件 2.axio2.1.promise2.2.安装2.3.配置2.3.1.全局 axios 默认值2.3.2.响应信息格式 2.4.Axios的拦截器2.4.1.请求拦截器2.4.2.响应拦截器2.4.3.移除拦截器2.4.4.自定义实例添加拦截器 3.lz-string3.1.java…

回溯

组合问题 LeetCode77 组合 class Solution { public:vector<vector<int>>res;vector<int>list;void dfs(int begin,int n,int k){if(list.size()k){res.push_back(list);return;}for(int ibegin;i<n;i){list.push_back(i);dfs(i1,n,k);list.pop_back();}…

(源码分析)springsecurity认证授权

了解 1. 结构总览 SpringSecurity所解决的问题就是安全访问控制&#xff0c;而安全访问控制功能其实就是对所有进入系统的请求进行拦截&#xff0c;校验每个请求是否能够访问它所期望的资源。 根据前边知识的学习&#xff0c;可以通过Filter或AoP等技术来实现&#xff0c;Spr…

天津仁爱学院2024级专升本新同学开学报到提示

亲爱的2024级新同学: 亲爱的仁爱新人&#xff0c;你准备好了吗&#xff1f;祝福之余&#xff0c;关于入学报到还有以下几点提示&#xff1a; 01报到时间 报到时间:2024年9月1日。报到时请携带录取通知书和准考证。因参军保留入学资格或因病及其他原因不能按时报到的同学&#x…

主图趋势交易九稳量化系统 期货指标公式大全 最准的期货指标源码 看期货涨跌最简单的方法文华财经指标公式源码

交易的动机必须来自于内心&#xff0c;一种解决问题的执着。在整个交易生涯的漫长岁月里&#xff0c;无法始终保持这种热忱。除非亲身体验&#xff0c;否则很难理解这种疯狂的热忱。这是一种高度的专注&#xff0c;其他一切好像都不存在&#xff0c;视野之内没有其他的东西。这…

利用Python进行高效数据分析实践

引言 在当今的数据驱动世界中&#xff0c;能够有效地处理和分析数据已成为许多行业的核心竞争力。Python作为一种强大的编程语言&#xff0c;因其简洁易读的语法以及丰富的第三方库支持&#xff0c;在数据科学领域受到了广泛的欢迎。本文将介绍如何使用Python进行高效的数据分…

探索 Milvus 存储系统:如何评估和优化 Milvus 存储性能

欢迎来到探索 Milvus 系列。Milvus 是一款支持水平扩展和具备出色性能的开源向量数据库。Milvus 的核心是其强大的存储系统&#xff0c;是数据持久化和存储的关键基础。该系统包括几个关键组成部分&#xff1a;元数据存储&#xff08;meta storage&#xff09;、消息存储&#…

苹果电脑怎么使用Windows软件 苹果笔记本怎么安装Windows mac怎么安装windows

最早的苹果电脑的概念是在1976年的时候由乔布斯提出来的&#xff0c;在1977年的时候发行的第一款个人电脑&#xff0c;也就是苹果笔记本电脑。苹果笔记本的操作系统是MAC OSmac OS是基于unix内核的系统&#xff0c;这个系统是专门为苹果电脑开发的。macOS比windows的视觉冲击大…

Synchronized的锁升级过程是怎样的?

文章目录 一、Synchronized的使用1、修饰实例方法2、修饰静态方法3、修饰代码块4、总结&#xff1a; 二、Monitor1、Java对象头1.1 32 位虚拟机的对象头1.2 64位虚拟机的对象头 2、Mark Word 结构3、Moniter4、Synchronized 字节码5、轻量级锁6、锁膨胀7、自旋优化8、偏向锁9、…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一&#xff1a;项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下&#xff0c;进行C网络开发的基本概念&#xff1a;TCP/IP socket通信&#xff0…

Java集合之HashMap的数据结构分析

总所周知&#xff0c;Java中键值对集合&#xff0c;我们最常用的就是HashMap&#xff0c;那么它的数据结构&#xff0c;以及如何存储键值对&#xff0c;包括为什么使用红黑树&#xff0c;链表等许多数据结构&#xff0c;下面我们一起学习交流 1.HashMap的数据结构&#xff1a;…

scratch二次开发:如何修改toolbox宽度

大家好&#xff0c;我是小黄。 使用场景&#xff1a;有时候我们开发图形化编程时&#xff0c;我们的积木块很长&#xff0c;导致一部分无法显示&#xff0c;我们想要把目录区域位置放大&#xff0c;比如下面红色方框区域位置&#xff0c;那么改如何实现这个过程呢&#xff1f;…

Qt,获取其他.exe文件的标准输出流的信息(printf/print的输出信息)

比如&#xff0c;通过Python编写爬虫软件功能是运行程序获取豆瓣电影排行榜信息&#xff0c;并通过print打印出来。将其打包成.exe,通过Qt来调用&#xff0c;并获取到.exe程序运行的结果 简单示例代码&#xff1a; // 创建 QProcess 对象QProcess process;// 连接信号槽以获取…