1.放弃 console.log 吧!读懂懂源用 Debugger 你能读懂各种源码
2.一文读懂,网源硬核 Apache DolphinScheduler3.0 源码解析
3.一文读懂cuda代码编译流程
4.想自己做网站从哪方面学起?
5.买了源代码接下来怎么做?
放弃 console.log 吧!码看码用 Debugger 你能读懂各种源码
很多同学不清楚为什么要使用debugger进行调试,读懂懂源难道console.log不行吗?
即使学会了使用debugger,网源还是码看码wxv源码怎么获取有很多代码看不懂,如何调试复杂的读懂懂源源码呢?
这篇文章将为你讲解为什么要使用这些调试工具:console.log vs Debugger。
相信绝大多数同学都会使用console.log进行调试,网源将想查看的码看码变量值打印在控制台。
这种方法可以满足基本需求,读懂懂源但遇到对象打印时就无法胜任了。网源
比如,码看码我想查看webpack源码中的读懂懂源compilation对象的值,我尝试打印了一下:
但你会发现,网源当对象的码看码值也是对象时,它不会展开,而是打印一个[Object] [Array]这样的字符串。
更严重的是,打印的内容过长会超过缓冲区的大小,在terminal中显示不全:
而使用debugger来运行,在这里设置一个断点查看,就没有这些问题了:
有些同学可能会说,那打印一个简单的值时使用console.log还是很方便的。
比如这样:
真的吗?
那还不如使用logpoint:
代码执行到这里就会打印:
而且没有污染代码,使用console.log的话,调试完成后这个console也不得不删除掉。
而logpoint不需要,它就是一个断点的设置,不在代码中。
当然,repotool源码最重要的是debugger调试可以看到调用栈和作用域!
首先是调用栈,它就是代码的执行路线。
比如这个App的函数组件,你可以看到渲染这个函数组件会经历workLoop、beginWork、renderWithHooks等流程:
你可以点击调用栈的每一帧,查看都执行了什么逻辑,用到了什么数据。比如可以看到这个函数组件的fiber节点:
再就是作用域,点击每一个栈帧就可以看到每个函数的作用域中的变量:
使用debugger可以看到代码的执行路径,每一步的作用域信息。而你使用console.log呢?
只能看到那个变量的值而已。
得到的信息量差距不是一点半点,调试时间长了,别人会对代码的运行流程越来越清晰,而你使用console.log呢?还是老样子,因为你看不到代码执行路径。
所以,不管是调试库的源码还是业务代码,不管是调试Node.js还是网页,都推荐使用debugger打断点,别再用console.log了,即使想打印日志,也可以使用LogPoint。
而且在排查问题的时候,使用debugger的话可以加一个异常断点,代码跑到抛异常的地方就会断住:
可以看到调用栈来理清出错前都走了哪些代码,可以通过作用域来看到每一个变量的private源码值。
有了这些,排查错误就变得轻松多了!
而你使用console.log呢?
什么也没有,只能自己猜。
Performance
前面说debugger调试可以看到一条代码的执行路径,但是代码的执行路径往往比较曲折。
比如那个React会对每个fiber节点做处理,每个节点都会调用beginWork。处理完之后又会处理下一个节点,再次调用beginWork:
就像你走了一条小路,然后回到大路之后又走了另一条小路,使用debugger只能看到当前这条小路的执行路径,看不到其他小路的路径:
这时候就可以结合Performance工具了,使用Performance工具看到代码执行的全貌,然后用debugger来深入每一条代码执行路径的细节。
SourceMap
sourcemap非常重要,因为我们执行的都是编译打包后的代码,基本是不可读的,调试这种代码也没有什么意义,而sourcemap就可以让我们直接调试最初的源码。
比如vue,关联了sourcemap之后,我们能直接调试ts源码:
nest.js也是:
不使用sourcemap的话,想搞懂源码,但你调试的是编译后的代码,怎么读懂呢?
读懂一行
前面说的debugger、Performance、SourceMap只是调试代码的工具,那会了调试工具,小站源码依然读不懂代码怎么办呢?
我觉得这是不可能的。
为什么这么说呢?
就拿react源码来说:
switch case能读懂吧。三目运算符能读懂吧。函数调用能读懂吧。
每一行代码都能读懂,而全部的代码不就是由这一行行代码组成的么?
加上我们可以单步执行来知道代码执行路径。
为啥每行代码都能读懂,连起来就读不懂了呢?
那应该是代码太多了,而你花的时间不够而已。
先要读懂一行,一个函数,读懂一个小功能的实现流程,慢慢积累,之后了解的越来越多之后,你能读懂的代码就会越多。
总结
这篇文章讲了为什么要使用调试工具,如何读懂复杂代码。
console.log的弊端太多了,大对象打印不全,会超过terminal缓冲区,对象属性不能展开等等,不建议大家使用。即使要打印也可以使用LogPoint。
使用debugger可以看到调用栈,也就是代码的执行路径,每个栈帧的作用域,可以知道代码从开始运行到现在都经历了什么,而console.log只能知道某个变量的值。
此外,veracrypt 源码报错的时候也可以通过异常断点来梳理代码执行路径来排查报错原因。
但debugger只能看到一条执行路径,可以使用Performance录制代码执行的全流程,然后再结合debugger来深入其中一条路径的执行细节。
此外,只有调试最初的源码才有意义,不然调试编译后的代码会少很多信息。可以通过SourceMap来关联到源码,不管是Vue、React的源码还是Nest.js、Babel等的源码。
会了调试之后,就能调试各种代码了,不存在看不懂的源码,因为每一行代码都是基础的语法,都是能看懂的,如果看不懂,只可能是代码太多了,你需要更多的耐心去读一行行代码、一个个函数、理清一个个功能的实现,慢慢积累就好了。
掌握基于debugger、Performance、SourceMap等调试代码之后,各种网页和Node.js代码都能调试,各种源码都能读懂!
一文读懂,硬核 Apache DolphinScheduler3.0 源码解析
这篇文章深入解析了硬核Apache DolphinScheduler 3.0的源码设计和策略,让我们一窥其背后的分布式系统架构和容错机制。首先,DolphinScheduler采用去中心化设计,通过Master/Worker角色注册到Zookeeper,实现无中心的集群管理。API接口提供丰富的调度操作,MasterServer负责任务分发和监控,而WorkerServer负责任务执行和日志服务。
容错机制是系统的关键,包括服务宕机容错和任务重试。服务宕机时,MasterServer通过ZooKeeper的Watcher机制进行容错处理,重新提交任务。任务失败则会根据配置进行重试,直至达到最大次数或成功。远程日志访问通过RPC实现,保持系统的轻量化特性。
源码分析部分详细介绍了工程模块、配置文件、API接口以及Quartz框架的运用。Master的启动流程涉及Quartz的调度逻辑,Worker则负责执行任务并接收Master的命令。Master与Worker之间通过Netty进行RPC通信,实现了负载均衡和任务分发。
加入社区讨论,作者鼓励大家参与DolphinScheduler的开源社区,通过贡献代码、文档或提出问题来共同提升平台。无论是新手还是经验丰富的开发者,开源世界都欢迎你的参与,为中国的开源事业贡献力量。
一文读懂cuda代码编译流程
cuda代码编译流程详解
在仅需在服务器上本地编译GPU程序且不考虑跨平台兼容性和程序大小时,使用默认的nvcc命令即可。但若要考虑程序的可移植性和编译后的文件大小,就需要深入理解nvcc编译指令。本文将逐步解析.cu源代码如何转化为可执行文件,揭示GPU与CPU之间的交互。 以名为simple_add.cu的简单示例程序为例,我们可以通过命令nvcc simple_add.cu -o simple_add编译生成可执行程序。另外,为了保存编译过程,可以使用mkdir simple_add_tmp && nvcc simple_add.cu -o simple_add -keep -keep-dir=./simple_add_tmp,这会将中间文件保存在simple_add_tmp目录中。 打开目录,可以看到一系列文件,它们与官方编译流程图相对应,包括编译过程的详细记录和生成的临时文件。例如,通过nvcc simple_add.cu -o simple_add -keep -keep-dir=./simple_add_tmp -dryrun命令,可以获取生成每个文件的详细指令。 在编译过程中,CUDA代码主要处理CUDA kernel的定义和调用,比如__global__ void add(int *a, int *b, int *c, int n)和add<<>>>();。非kernel部分是标准的C++代码。首先,nvcc会将CUDA代码分解到simple_add.cudafe1.cpp中,然后处理kernel的调用,如通过__cudaPushCallConfiguration存储参数,调用`add`函数,该函数最终由`__device_stub__Z3addPiS_S_i`等辅助函数执行。 CPU编译时,会处理kernel的overhead,也就是kernel的启动开销。在simple_add.cudafe1.stub.c文件中,可以看到`__cudaLaunch`函数被调用,这代表了CUDA运行时如何查找并执行kernel。 对于GPU编译,.cudafe1.gpu文件包含了CUDA kernel的源代码,经过cicc编译成ptx,再通过ptxas生成cubin,最终整合成fatbin,形成GPU可执行的二进制文件。这些二进制内容存储在可执行文件的.nv_fatbin部分,可以通过工具如`cuobjdump -h`查看。 GPU程序版本管理很重要,不同的GPU架构(如compute_、V等)需要不同的编译选项。理解这些版本对应关系,可以帮助我们选择正确的编译参数,平衡程序大小和性能需求。 在实际编译时,如选择compute_,可能有三种生成方式。为了支持多种GPU,需要考虑多个版本的ptx和cubin代码,并确保nvcc支持的编译选项与当前环境兼容。 总结来说,理解CUDA代码编译过程涉及从源代码到二进制文件的转换,以及如何根据不同GPU版本进行优化。在打包和发布时,需根据实际需求平衡兼容性和性能,这需要对编译选项有深入的理解。想自己做网站从哪方面学起?
1.首先要有兴趣和热情,没有这两样基本上都是虎头蛇尾。
2.先学一下html语言,不用学太深,了解知道一些常用的控制语言,能读懂就行了。这个不学,你根本搞不懂网页上那些英文代码。
3.再学一下天学会asp语言,理解数据库工作原理,也是了解一下。这个不学会,你根本没法修改人家现成的源代码。
4.到网页源代码网站下载一个你需要的网站源代码,进行修改,然后上传到你的空间,并进行修改调试。
5.加入几个网站制作QQ群,有不会的问题现场提问。
6.就是要坚持做下去,最少要做到三天打鱼,两天晒网,要是你开始天天搞,到后来,一个月都不管理一次,你的网站就垃圾了。
7.网站推广,到各大网址站去登记,到各个交换链,友情链站去链结。
8.还有什么不清楚的地方,就联系我,发消息给我,我们一同研究。
买了源代码接下来怎么做?
如果有源码。所有出名的源码。官方网站都会有使用教程。直接看使用教程就行了。那么简单的事情。只要是纯棉的程序源代码。网上都是很多教程的。不出名的就不要使用了。如果面向国内的客户,一定要做网站备案,这样才正规些。