LOGO
首页 网站广场 站长动态 活跃度榜 审核查询 逛逛好站 留言交流 提交申请 关于本站

站长动态

站长动态所展示的是已加入好站网成员站长文章
共同步 2381 篇博文
(每2小时更新一次)
姓王者
入驻第1年
信息技术基数实训-焊接爱心花灯
两个灯没亮,扣了两分:(1没必要的程序本来以为要写入程序什么的,发现带了电脑没用。焊-烙铁!真得小心一点,我对面的人不知道被烫了多少次🤣(虽然我右手中指也烫了一下😢),这个玩意看不敢乱戳,听老师说,之前的学长把连接线,甚至是...
姓王者
入驻第1年
初识Vue3,有趣
初识前端工程Vue3基础扎实老三件:html css javascript虽然不敢说熟练吧,但也算是基本掌握,但是我想如果构建前端页面的话,写这些似乎有点太过冗杂,看来前端工程化是必要的!Vue3是什么正如它官网介绍的:易学易用...
阿川
入驻第1年
一场说走就走的骑行
姓王者
入驻第1年
学了点js
语法挺有趣的源码来源于freecodecampconst character = "!"; const count = 10; const rows = []; let inverted = false; function p...
姓王者
入驻第1年
连不上网了?可能的DNS解决方法
有许多人在使用代理之后,发现连不上网络了,这是其中一种解决方法取消本地代理可能是windows的保护性策略,在上一次代理突然断链但无法重连时,windows自动代理到127在设置->网络和internet->代理 在这个界面把所...
姓王者
入驻第1年
神人有感:先礼礼礼礼礼礼后兵
ai总是那么幽默1下面的图片是AI的错误分析:(2什么矛盾贴吧疯狂刷帖我不清楚这位立巾是谁,只是见到他在贴吧控诉校园集市的一些人,我不清楚有什么深仇大怨,能够跨社区到贴吧来申诉,我依照惯例删帖,禁言,并且进行了警告! 11 22...
姓王者
入驻第1年
LeetCode:2. 两数相加
两数相加前置声明 LeetCode所有题目版权均归 LeetCode 和 力扣中国 所有
姓王者
入驻第1年
hexo压缩资源,优化访问
Hexo-all-minifier压缩资源,优化访问1对hexon不友好,如果你使用hexon或其他类似的本地编辑器,我建议你静默日志安装执行安装命令npm install hexo-all-minifier --save由于网...
姓王者
入驻第1年
hexo创建公益404界面
4044 让世界更美好什么是404界面以下来自百度百科404 not found,是HTTP对网页错误情况返回的一种状态码,当用户在浏览器中输入网址时,服务器会根据输入的地址判断是否有对应的网页信息,如果没有对应信息,说明用户输...
姓王者
入驻第1年
在hexo-next配置gitalk
如何在hexo-next配置gitalk评论你是否也想在你的博客里面添加这样的评论区? gitalk 那就快来看以下教程吧:)打开github,点击右...
姓王者
入驻第1年
为hexo-next建立静态说说
曾经考虑使用Artitalk,但由于网络原因以及github无法备案等原因,暂时放弃,转而使用静态方法写说说 123改改改新建essay.swig在 hexo/themes/next/layout/ 下创建 essay.swig...
姓王者
入驻第1年
探路:雨课堂的字体加密。
前两天用电脑网页打开雨课堂,遇到那种简答题,想着复制题干去问AI,但是粘贴出来的却是乱文,这是怎么回事呢,于是我开始了探究此文章仅供前端学习交流使用F12大法可以看到页面原文就是密文 1实际上每次刷新页面都会生成新的密文我想了想...
姓王者
入驻第1年
为Hexo博客提供订阅服务
Web-push的优势 与传统的邮件列表相比,Web push Notification 有这样几点不同: 使用邮件推送,只有打开邮件的人才能看到推送的内容。如果使用 Web push Notification,任何一个在使用浏览器的人都会看到推送的...
姓王者
入驻第1年
LeetCode:1. 两数之和
我不想O(n^2) :(前置声明 LeetCode所有题目版权均归 LeetCode 和 力扣中国 所有
姓王者
入驻第1年
为github主页设计美化介绍
readme你也想设计有趣的介绍页面吗,下面将会告诉你如何设计创建界面打开github,点击右上角的头像 选择your repositories 然后在右上角选择new 新的库名务必和你的github用户名保持一致。 状态选择p...
姓王者
入驻第1年
hexo创建一个友情链接页面
尽管hexo自带links功能,但是这样看起来单一无趣,那么为了改善友链,我们可以自定义一个页面创建新页面找到你的本地博客位置,输入 hexo new page 友情链接 你的本地博客目录就会出现blog\source\友情与链...
姓王者
入驻第1年
hexo-next在侧边栏添加IP信息
显示如下 tool使用第三方IP签名图此处感谢在线工具网站[![2](https://i.ibb.co/TqcTdQRg/whereip.png)](https://tool.lu/)别忘了站长的警告: ⚠️请勿将本页面作为ap...
姓王者
入驻第1年
第一次Pull requests :)
有趣自述虽然我是计算机学生,但是对github等平台工具使用不够熟练,但还好我没酿成删库的惨剧 我还是学会了一些方法,我曾经也想尝试理解别人的库,但是限于自己的实力(我看不懂),基本上都放弃了,不过这一次,难得我能看懂库里的文件...
姓王者
入驻第1年
给博客右上角添加github跳转图标
效果图xingwangzhe实现选择自己喜欢的图标访问GitHub Corners 复制你喜欢的图标的代码找到修改的位置然后将刚才复制的代码粘贴到 themes/next/layout/_layout.swig文件中
Debug
入驻第1年
使用 GOTRACEBACK 快速定位你的 Panic
近期迁移了一个 go 的项目至 k8s 机器上,发现机器不时会自动重启,当想看重启前日志的时候,Goroutine 运行的状态全部都打印了出来,由于公司云平台查看行数限制,看到最后,还是没有想要看到的 panic 的关键堆栈信息。 前期,由于频繁的重启,怀疑是哪里出现了未捕获的 panic 导致的,于是在使用的第三方包 RocketMQ 和 Talos 等 SDK 包进行了生产消费初始化的 recover 并且对项目中 channel 的关键操作中也添加了 recover 捕获,但是并没有解决问题,还是时不时的出现重启。 在查找 Go 官方文档,发现可以设置这个环境变量 GOTRACEBACK 可以控制 panic 发生后堆栈跟踪的打印级别。 GOTRACEBACK Go 运行时使用该环境变量来决定在程序崩溃或出现未处理的 panic 时应该输出多少堆栈跟踪信息,它是在运行 Go 程序时通过环境变量传递给 Go 运行时的。 none 当程序崩溃时,不输出任何堆栈信息; single 仅显示导致崩溃,出现 panic 的 goroutine 的堆栈信息; all 显示所有的 goroutine 的堆栈信息; system 显示所有的 goroutine 的堆栈信息,包括运行时内部 goroutine 的信息; crash 显示所有的 goroutine 的堆栈信息,然后核心转储程序并退出; runtime package - runtime - Go Packages 源代码 基于 Go 1.20 版本 设置 GOTRACEBACK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //go:linkname setTraceback runtime/debug.SetTraceback func setTraceback(level string) { var t uint32 switch level { case "none": t = 0 case "single", "": t = 1 << tracebackShift case "all": t = 1<<tracebackShift | tracebackAll case "system": t = 2<<tracebackShift | tracebackAll case "crash": t = 2<<tracebackShift | tracebackAll | tracebackCrash default: t = tracebackAll if n, ok := atoi(level); ok && n == int(uint32(n)) { t |= uint32(n) << tracebackShift } } // when C owns the process, simply exit'ing the process on fatal errors // and panics is surprising. Be louder and abort instead. if islibrary || isarchive { t |= tracebackCrash } t |= traceback_env atomic.Store(&traceback_cache, t) } 获取 GOTRACEBACK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // Keep a cached value to make gotraceback fast,// since we call it on every call to gentraceback. // The cached value is a uint32 in which the low bits // are the "crash" and "all" settings and the remaining // bits are the traceback value (0 off, 1 on, 2 include system).const ( tracebackCrash = 1 << iota tracebackAll tracebackShift = iota ) var traceback_cache uint32 = 2 << tracebackShift var traceback_env uint32 // gotraceback returns the current traceback settings.// // If level is 0, suppress all tracebacks. // If level is 1, show tracebacks, but exclude runtime frames. // If level is 2, show tracebacks including runtime frames. // If all is set, print all goroutine stacks. Otherwise, print just the current goroutine. // If crash is set, crash (core dump, etc) after tracebacking.// //go:nosplit func gotraceback() (level int32, all, crash bool) { gp := getg() t := atomic.Load(&traceback_cache) crash = t&tracebackCrash != 0 all = gp.m.throwing >= throwTypeUser || t&tracebackAll != 0 if gp.m.traceback != 0 { level = int32(gp.m.traceback) } else if gp.m.throwing >= throwTypeRuntime { // Always include runtime frames in runtime throws unless // otherwise overridden by m.traceback. level = 2 } else { level = int32(t >> tracebackShift) } return } 基于 GOTRACEBACK 打印堆栈信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 // gp is the crashing g running on this M, but may be a user G, while getg() is // always g0. func dopanic_m(gp *g, pc, sp uintptr) bool { if gp.sig != 0 { signame := signame(gp.sig) if signame != "" { print("[signal ", signame) } else { print("[signal ", hex(gp.sig)) } print(" code=", hex(gp.sigcode0), " addr=", hex(gp.sigcode1), " pc=", hex(gp.sigpc), "]\n") } level, all, docrash := gotraceback() if level > 0 { if gp != gp.m.curg { all = true } if gp != gp.m.g0 { print("\n") goroutineheader(gp) traceback(pc, sp, 0, gp) } else if level >= 2 || gp.m.throwing >= throwTypeRuntime { print("\nruntime stack:\n") traceback(pc, sp, 0, gp) } if !didothers && all { didothers = true tracebackothers(gp) } } unlock(&paniclk) if panicking.Add(-1) != 0 { // Some other m is panicking too. // Let it print what it needs to print. // Wait forever without chewing up cpu. // It will exit when it's done. lock(&deadlock) lock(&deadlock) } printDebugLog() return docrash } 测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package main import ( "fmt" "os" "time") func main() { env := os.Getenv("GOTRACEBACK") fmt.Printf("GOTRACEBACK: %s\n", env) for i := 0; i < 3; i++ { go a() } go b() for i := 0; i < 3; i++ { go a() } time.Sleep(time.Second * 1) } func a() { time.Sleep(time.Millisecond * 1) fmt.Printf("aaaaaaa\n") } func b() { time.Sleep(time.Millisecond * 1) panic("b panic ......") } All 显示所有信息 可以看到,运行时所有的 Goroutine 信息都被打印了出来。 None 不输出任何信息 设置为 none 后,只会将运行信息打印出来,非用户打印信息不会抛出。 Single 只显示导致崩溃的 Goroutine 信息 这个设置参数也是默认的设置: 这里只会显示导致 panic 的 goroutine 的堆栈信息以及运行状态。 关注微信公众号,第一时间获取最新内容,让我们一起变得更强!Debug客栈:订阅本站· 文章归档· 我的项目· 友情链接· 我的使用· 飞湾计划· 摄影展集· 我的主页

© 2026 好站网HaoZhan.wang 1.5 版权所有

苏ICP备19065220号-4 萌ICP备20269980号 茶ICP备2026050346号 本站数据 版本历史 关于本站