皮皮网
皮皮网

【源码安装sip】【源码搭建centos】【虎牙插件源码】recovery源码适配

来源:activex控件源码 发表时间:2024-11-25 10:50:01

1.recoveryԴ?源码?????
2.如何处理好Golang中的panic与recover
3.Recovery安卓手机刷机工具V5028最新中文版Recovery安卓手机刷机工具V5028最新中文版功能简介
4.翻译:XDA论坛教程:如何手动编译TWRP Recovery

recovery源码适配

recoveryԴ??????

       哈喽,大家好,适配我是源码asong,今天与大家来聊一聊go语言中的适配"throw、try.....catch{ }"。源码如果你之前是适配源码安装sip一名java程序员,我相信你一定吐槽过go语言错误处理方式,源码但是适配这篇文章不是来讨论好坏的,我们本文的源码重点是带着大家看一看panic与recover是如何实现的。上一文我们讲解了defer是适配如何实现的,但是源码没有讲解与defer紧密相连的recover,想搞懂panic与recover的适配实现也没那么简单,就放到这一篇来讲解了。源码废话不多说,适配直接开整。源码

       Go 语言中panic 关键字主要用于主动抛出异常,类似 java 等语言中的 throw 关键字。panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer;

       Go 语言中recover 关键字主要用于捕获异常,让程序回到正常状态,类似 java 等语言中的 try ... catch 。recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;

       recover只能在defer中使用这个在标准库的注释中已经写明白了,我们可以看一下:

       这里有一个要注意的点就是recover必须要要在defer函数中使用,否则无法阻止panic。最好的验证方法是先写两个例子:

       运行我们会发现example2()方法的panic是没有被recover住的,导致整个程序直接crash了。这里大家肯定会有疑问,为什么直接写recover()就不能阻止panic了呢。我们在 详解defer实现机制(附上三道面试题,我不信你们都能做对)讲解了defer实现原理,一个重要的知识点**defer将语句放入到栈中时,也会将相关的值拷贝同时入栈。**所以defer recover()这种写法在放入defer栈中时就已经被执行过了,panic是发生在之后,所以根本无法阻止住panic。源码搭建centos

       通过运行结果可以看出panic不会影响defer函数的使用,所以他是安全的。

       这里我开了两个协程,一个协程会发生panic,导致程序崩溃,但是只会执行自己所在Goroutine的延迟函数,所以正好验证了多个 Goroutine 之间没有太多的关联,一个 Goroutine 在 panic 时也不应该执行其他 Goroutine 的延迟函数。

       其实我们在实际项目开发中,经常会遇到panic问题, Go 的 runtime 代码中很多地方都调用了 panic 函数,对于不了解 Go 底层实现的新人来说,这无疑是挖了一堆深坑。我们在实际生产环境中总会出现panic,但是我们的程序仍能正常运行,这是因为我们的框架已经做了recover,他已经为我们兜住底,比如gin,我们看一看他是怎么做的。

       我们先来写个简单的代码,看看他的汇编调用:执行go tool compile -N -l -S main.go就可以看到对应的汇编码了,我们截取部分片段分析:

       上面重点部分就是画红线的三处,第一步调用runtime.deferprocStack创建defer对象,这一步大家可能会有疑惑,我上一文忘记讲个这个了,这里先简单概括一下,defer总共有三种模型,编译一个函数里只会有一种defer模式。在讲defer实现机制时,我们一起看过defer的结构,其中有一个字段就是_panic,是触发defer的作用,我们来看看的panic的结构:

       简单介绍一下上面的字段:

       上面的pc、sp、goexit我们单独讲一下,runtime包中有一个Goexit方法,Goext能够终止调用它的虎牙插件源码goroutine,其他的goroutine是不受影响的,goexit也会在终止goroutine之前运行所有延迟调用函数,Goexit不是一个panic,所以这些延迟函数中的任何recover调用都将返回nil。如果我们在主函数中调用了Goexit会终止该goroutine但不会返回func main。由于func main没有返回,因此程序将继续执行其他gorountine,直到所有其他goroutine退出,程序才会crash。

       下面就开始我们的重点吧~。

       在讲defer实现机制时,我们一起看过defer的结构,其中有一个字段就是_panic,是触发defer的作用,我们来看看的panic的结构:简单介绍一下上面的字段:上面的pc、sp、goexit我们单独讲一下,runtime包中有一个Goexit方法,Goext能够终止调用它的goroutine,其他的goroutine是不受影响的,goexit也会在终止goroutine之前运行所有延迟调用函数,Goexit不是一个panic,所以这些延迟函数中的任何recover调用都将返回nil。如果我们在主函数中调用了Goexit会终止该goroutine但不会返回func main。由于func main没有返回,因此程序将继续执行其他gorountine,直到所有其他goroutine退出,程序才会crash。写个简单的例子:运行上面的例子你就会发现,即使在主goroutine中调用了runtime.Goexit,其他goroutine是没有任何影响的。所以结构中的pc、sp、goexit三个字段都是为了修复runtime.Goexit,这三个字段就是为了保证该函数的一定会生效,因为如果在defer中发生panic,那么goexit函数就会被取消,gjson源码解析所以才有了这三个字段做保护。看这个例子:

       英语好的可以看一看这个: github.com/golang/go/is...,这就是上面的一个例子,这里就不过多解释了,了解就好。

       接下来我们再来看一看gopanic方法。

       gopanic的代码有点长,我们一点一点来分析:

       根据不同的类型判断当前发生panic错误,这里没什么多说的,接着往下看。

       上面的代码都是截段,这些部分都是为了判断当前defer是否可以使用开发编码模式,具体怎么操作的就不展开了。

       在第三部分进行defer内联优化选择时会执行调用延迟函数(reflectcall就是这个作用),也就是会调用runtime.gorecover把recoverd = true,具体这个函数的操作留在下面讲,因为runtime.gorecover函数并不包含恢复程序的逻辑,程序的恢复是在gopanic中执行的。先看一下代码:

       这段代码有点长,主要就是分为两部分:

       第一部分主要是这个判断if gp._panic != nil && gp._panic.goexit && gp._panic.aborted { ... },正常recover是会绕过Goexit的,所以为了解决这个,添加了这个判断,这样就可以保证Goexit也会被recover住,这里是通过从runtime._panic中取出了程序计数器pc和栈指针sp并且调用runtime.recovery函数触发goroutine的调度,调度之前会准备好 sp、pc 以及函数的返回值。

       第二部分主要是做panic的recover,这也与上面的流程基本差不多,他是从runtime._defer中取出了程序计数器pc和栈指针sp并调用recovery函数触发Goroutine,跳转到recovery函数是通过runtime.call进行的,我们看一下其源码(src/runtime/asm_amd.s 行):

       因为go语言中的runtime环境是有自己的堆栈和goroutine,recovery函数也是在runtime环境执行的,所以要调度到m->g0来执行recovery函数,我们在看一下recovery函数:

       在recovery 函数中,利用 g 中的两个状态码回溯栈指针 sp 并恢复程序计数器 pc 到调度器中,并调用 gogo 重新调度 g ,siteserver全部源码 goroutine 继续执行,recovery在调度过程中会将函数的返回值设置为1。这个有什么作用呢? 在deferproc函数中找到了答案:

       当延迟函数中recover了一个panic时,就会返回1,当 runtime.deferproc 函数的返回值是 1 时,编译器生成的代码会直接跳转到调用方函数返回之前并执行 runtime.deferreturn,跳转到runtime.deferturn函数之后,程序就已经从panic恢复了正常的逻辑。

       在这里runtime.fatalpanic实现了无法被恢复的程序崩溃,它在中止程序之前会通过 runtime.printpanics 打印出全部的 panic 消息以及调用时传入的参数。

       这就是这个逻辑流程,累死我了。。。。

       结尾给大家发一个小福利,哈哈,这个福利就是如果避免出现panic,要注意这些:这几个是比较典型的,还有很多会发生panic的地方,交给你们自行学习吧~。

       好啦,这篇文章就到这里啦,素质三连(分享、点赞、在看)都是笔者持续创作更多优质内容的动力!

如何处理好Golang中的panic与recover

       Go 语言以其高性能和高并发特性而闻名,特别是其提供的 http 包使得即使是初学者也能轻松编写 http 服务程序。

       然而,每个优势背后都隐藏着风险。新手若不慎踏入这些陷阱,很容易遇到问题。《Go 语言踩坑记》系列将以此为主题,分享作者在实际开发中遇到的坑以及解决方法,其中首篇将介绍 panic 与 recover 的处理。

       panic 与 recover 的概念源于英语中的“恐慌”和“恢复”,在 Go 语言中分别代表引发严重错误和从错误中恢复。Go 语言的 panic 关键字用于主动抛出异常,类似于 Java 中的 throw 关键字,而 recover 关键字则用于捕获异常,使程序回归正常状态,类似 Java 中的 try...catch。

       作者拥有 6 年的 Linux 系统C语言开发经验。C 语言没有异常捕获机制,没有 try...catch,也没有 panic 和 recover。但本质上,异常处理与 if error then return 的区别主要在于函数调用栈的深度。在 C 语言中,通过 setjump 和 longjump 实现长距离跳转,从而中断正常的执行流。

       panic 和 recover 源码位于 Go 源码的 src/runtime/panic.go,分别为 gopanic 和 gorecover 函数。panic 函数内部主要流程包括切到 m->g0,因为 Go 的 runtime 环境有自己的堆栈和 goroutine,而 recovery 是在 runtime 环境下执行的,所以需要先调度到 m->g0 来执行 recovery 函数。

       panic 和 recover 的使用场景包括主动触发异常、业务代码中的资源初始化错误处理等。然而,Go 的 runtime 代码中很多地方都调用了 panic 函数,对于不了解 Go 底层实现的新手来说,这可能是一大挑战。

       此外,Go 标准库中存在更多使用 panic 的场景,大家可以在源码中搜索 panic(以避免在后续使用标准库函数时踩坑。

Recovery安卓手机刷机工具V最新中文版Recovery安卓手机刷机工具V最新中文版功能简介

       大家好,关于Recovery(安卓手机刷机工具) V5.0.2.8 最新中文版,Recovery(安卓手机刷机工具) V5.0.2.8 最新中文版功能简介这个很多人还不知道,现在让我们一起来看看吧!

       Recovery是一款非常实用的安卓手机刷机工具,该款工具基于cwm5.0.2.8recovery源码移植汉化版打造,专为喜欢刷机的用户量身打造,如果你的手机因为刷机失败而变砖的话,那么就可以通过进入Recovery模式来解决问题。

       小编精选:安卓手机刷机软件

特色介绍

       1、基于cwm5.0.2.8recovery源码移植完整汉化;

       2、完美支持ADB命令;

       3、刷机更加方便,只需要zip格式的ROM包放到内存卡即可刷;

       4、备份和恢复系统;

       5、修复权限;

       6、Recovery界面清晰;

       7、修正挂载U盘模式。

注意事项

       需要 SOFF机器方能刷入

       SD卡格式化成fat格式,将下载文件放到内存卡,手机进入hboot模式,会自动识别根据英文提示刷入,进入hboot模式方法:

       按住音量下不放手同时按下开机键即可

       机器必须是S-OFF;

       一张MicroSD卡,TF卡,用电脑把它格式化成FAT,前提你的SD卡不是FAT的

       若你是ENG-OFF,那么以下两种刷Recovery方式都适合你的机器;若你的机器是SHIP-OFF,那么你的机器只适合第一种方式

使用说明

       1、第一种方法recovery-clockwor版本的:

       解压提取PGIMG.zip直接放在储存卡上,完全关机后按住音量向下进入HBOOT

       会提示系统升级,选音量+开始升级。升级完成就OK了..进系统之后删除sd卡上面的zip

       2、recovery中文版安装recovery方法:

       1.确认正确安装手机驱动

       2.关闭手机使手机处于关机状态下

       3.同时按住音量减小键+开关机键一段时间,双手按紧不松。

       4.开机以后,屏幕停留在华为LOGO屏幕

       5.把手机通过USB数据线和电脑连接

       6.双击下载的 刷入中文版4.0.1.5REC 文件 ,要解压缩

       3、关机进入recovery

       进入方法:

       手机关机状态按住音量上键+电源键进入recovery。可以操作刷机,备份。等等

       recovery中,音量上下键/菜单、主页键上下移动,电源键/搜索键为确认,返回键为返回上一级菜单

       更新日志

       1、版本:5.0.2.8,最新版

       2、加入了高级备份功能,想备份什么备份什么

       3、支持关机充电

       4、全中文,便于理解

       5、可以使用U盘功能

       6、支持屏幕虚拟按键,延长实体键寿命

       7,修正关机充电功能和刷机冲突的bug,通刷所有ROM,并且不会有问题

猜你喜欢

       uandroidtool 3.破解版:UAndroidTool 是一款功能强大的刷机工具箱应用,它支持市面上大多数的主流机型,它拥有手机解锁、黑屏救砖刷机、修复IMEI、修改全网通等功能,可以帮助你的手机进行解锁。  uandroid刷机工具破解版:uandroid刷机工具破解版是一款功能强大的手机专业刷机软件。该软件为用户带来刷机功能,我们只需要把手机连接到软件,下载相关的固件到软件就可以立即升级你的手机系统,从而解决手机系统问题。  安卓手机线刷软件:线刷宝是一个简单粗暴的手机线刷工具,它操作简单,只需将手机连接电脑即可实现只能一键线刷,这个安卓手机线刷软件集合多种手机rom包,是你手机刷成砖机后解救必备的神器。  uandroid4.0破解版:uandroid4.0破解版是一款非常专业的安卓手机刷机工具。它的功能十分强大,支持市面上主流的安卓机型,实现手机解锁、黑屏救砖刷机、修复IMEI、修改全网通等功能,让你无需担心手机刷机问题。  uandroid 3.破解版:UAndroid是专为手机维修人员推出的一款手机刷机软件,不仅可以帮助用户对手机进行一键刷机,还可以帮助用户实现手机解锁、黑屏救砖刷机、修复IMEI、修改全网通等功能,能够帮助用户很好的解决手机使用过程中出现的各种问题。

翻译:XDA论坛教程:如何手动编译TWRP Recovery

       这是一个关于手动编译TWRP Recovery的教程,对于TWRP 3.x源代码开放后,你有机会根据自己的设备进行定制。但请注意,这需要一定的Linux基础和AOSP构建流程知识。

       目前支持编译的版本包括Omni 6.0、7.1、8.1、9.0、CM .0、.1、.1以及LineageOS .0。推荐使用Omni 9.0,除非你的设备有超级分区。

       如果你使用的是CM或LineageOS,TWRP需要放置在特定的文件夹(LineageOS/bootable/recovery-twrp)并设置RECOVERY_VARIANT。源代码可以在相关链接中找到,但请注意链接地址可能已更新。

       编译时,建议使用轻量级构建清单,它适用于大多数情况,但可能需要额外的repo。在编译前,确保更改任何FLAGS(构建标志)会清除或执行'make clobber',以确保更改生效。

       找到与你设备对应的BoardConfig.mk文件(通常在devices/制造商/代号文件夹),你需要配置相应的架构和平台设置,尤其是TW_THEME,它决定你的设备显示的主题。现在有五种主题选项,根据你的屏幕分辨率选择合适的。

       除了分辨率,还有其他如RECOVERY_SDCARD_ON_DATA、BOARD_HAS_NO_REAL_SDCARD等标志,根据你的设备需求进行设置。例如,RECOVERY_SDCARD_ON_DATA可改变设备的文件存储方式。

       关于fstab,TWRP 2.5及以上版本支持新特性,自动处理大多数分区。但如果是较旧版本,需要创建TWRP.fstab文件,以保持与其他恢复选项的兼容性。

       在TWRP中,你可以为每个分区添加标志,如removable、storage、settingsstorage等,这些标志影响分区的行为和显示方式。例如,Galaxy S4的TWRP fstab示例显示了如何使用标志。

       最后,如果你完成了编译并想让TWRP官方支持你的设备,你需要提供必要的信息,但请注意,我们不会为此提供奖励,但你可以通过XDA分享你的成果。此外,你还可以在Android模拟器上测试TWRP,这有利于开发和调试。

       请在编译过程中遵循指南,如有任何问题,可以访问#twrp在Freenode上寻求帮助,或者在XDA论坛分享你的成功经验。

相关栏目:知识