跟踪源码技巧+阅读源码工具Sourcetrail

news2025/5/26 12:58:23

基于Eclipse IDE

1、Quick Type Hierarchy 快速查看类继承体系 ( 快捷键:Ctrl + T)
在这里插入图片描述
查看类很多人可能都知道,可源码阅读的时候更多用来查看方法体系更重要,可以方便快速的定位到方法的实现类。如:
在这里插入图片描述
此时如果想查看getBean()方法如何实现,可能会让你失望。结果如下
在这里插入图片描述
进入到了BeanFactory的接口定义方法,什么也没有。

此时我们直接在getBean上 Ctrl+T :

在这里插入图片描述
可以看到其实现的子类,点击子类进去即可。此方法还适用于框架中非常常见的模板方法模式,在抽象类中定义的模板方法,用这招轻松找到实现类。

当然还有详细的Open Type Hierarchy
在这里插入图片描述
会在左侧视图里面展示更好的Type View:
在这里插入图片描述

2、Open Call Hierachy 打开调用层级(快捷键:Ctrl+Alt+H)
在这里插入图片描述
掌握它,可以轻松游走于各种方法调用之间。
Open Call Hierachy 查看结果如下,调用关系清晰明朗,可以直接定位到调用的地方
在这里插入图片描述
3、Debug 断点的灵活使用

断点调式时,心中必须很清楚F5、F6、F7、F8的作用,不然要么迷失于源码之中,要么什么都没看清就走完了。

重新啰嗦一下它们的作用:

F5 Step Into,单步进入。进入到某个方法里面;

F6 Step Over,单步结束。一行一行的执行代码,入门时很多人只会一行一行走;

F7 Step Return,跳出方法。进入到某个方法里面时,如果发现这个方法没有你想看的东西,或者已经看到了你想看的,直接F7,跳出到方法外。

F8 Resume,继续往下执行。往下执行,遇到下一个断点时再停下来,没有则一直运行完。

调试时我们可能会经常遇到loadClass的情况:
在这里插入图片描述
在40行想进入ClassPathXmlApplicationContext构造方法,F5不料进入了类加载:
在这里插入图片描述
熟悉类加载的同学会很熟悉,不熟悉类加载机制的也不要慌,这是说明你调试的类第一次被加载,这时候我们F7跳出类加载,回到40行。
在这里插入图片描述
这个时候再按F5会真正进入ClassPathXmlApplicationContext构造方法。

当我们断点跟踪Spring这种源码的时候,一定要有节奏,以优先找到整体脉络为准,不要一直的F5进入每一行细看,F5下去,几天都走不完Spring。能熟练在Spring这种框架中F5、F6、F7、F8,就离弄懂他不远了。

Dubug的时候还应该注意debug视图的线程栈:
在这里插入图片描述
这个视图能够让你在走得比较深的时候,可以一眼看出自己怎么进来的,当前位于什么方法里等信息,还可以点击对应的代码行数进入查看。

总结,这是我使用IDE跟踪源码的几个小技巧,尤其是第二点,是很实用的

========================================================

收费工具Source Insight、Understand

Sourcetrail开源工具

一、下载安装

在这里插入图片描述
接下来就是download,在GitHub的release页面选择自己系统对应的发布版本下载安装:

在这里插入图片描述

安装好后,运行程序,会出现这样的界面:

在这里插入图片描述

二、应用

选择“New Project”,在随后的界面中填写好项目名称和项目路径:
在这里插入图片描述

填好后点击下方的Add Source Group按钮,用以添加代码。
——在Sourcetrail中允许我们在同一个项目中添加多个来源的代码,甚至允许各个代码分组的语言互不相同,这些代码分组即为各个Source Group

只需要查看一个代码库的内容,因此我们也只需要添加一个Source Group即可,如下图依次点击:
在这里插入图片描述
在继续输入新的信息前,打开你的命令行工具(Windows系统:Win+R,输入cmd然后回车;Linux下不赘述),输入where python(Windows)或which python3(Linux),即可看到当前环境的Python安装路径,记下这个路径,我们需要用它来解析Python代码。
然后在新的界面中,需要填写Python环境的字段填入刚刚我们查到的Python所在目录(即去除最后一个斜杠及之后的内容)。

其他的需要注意的就是“要建立索引的文件/目录”,这个字段就是添加我们真正要阅读的Python源码路径。字段左下角有一个“+”号,点击即可增加一个源码路径:
点击右下角“Create”,再点击“Start”:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结果解析:
在这里插入图片描述
可以看到,Sourcetrail将解析结果按“文件”、“模块”等大致分了类。
我们点击最关心的“函数(Function)”来体验一下:
在这里插入图片描述
在左边,Sourcetrail为我们生成了形象的调用图;在右边,Sourcetrail列出了当前焦点函数的代码及其相应调用。

无论在左边操作还是在右边操作,都会带来界面的同步变化。

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

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

相关文章

Mendelay-文献管理软件使用教程

Mendelay-文献管理软件 注册账号 注册账号 打开官网,注册个人账号 通过邮箱就可以注册账号啦,这是登录后的页面,并下载Mendeley客户端。 安装好客户端,打开软件首先登录以上注册的账号,则可进入客户端首页。

《安富莱嵌入式周报》第322期:自制10KV电子负载,史上最详细的电池系列资料,创意洞洞板任意互联,开源USB分析仪,英特尔雷电5, QNX功能安全免费课程

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1M8411q7dw/ 《安富莱嵌入式周报》第322期:自制10K…

nvue文件中@click.stop失效

在nvue文件中在子元素使用click.stop失效,父元素的事件触发了 在uniapp开发中nvue文件是跟vue文件是不一样的,就比如click.stop阻止点击事件继续传播就失效了,这时我们需要在子元素事件中添加条件编译,这样就会解决这个问题 // …

图论第三天|130. 被围绕的区域、417. 太平洋大西洋水流问题、827. 最大人工岛

130. 被围绕的区域 文档讲解 :代码随想录 - 130. 被围绕的区域 状态:开始学习。 思路: 步骤一: 深搜或者广搜将地图周边的 ‘O’ 全部改成 ’A’,如图所示: 步骤二: 再遍历地图,将 …

记录一次使用网云穿实现内网穿透操作

记录一次使用网云穿实现内网穿透操作 摘要 这段时间也很少写博客了,一方面工作表较忙,一方面觉得有些东西在百度上都能找到,甚至比我自己记录的详细,有些笔记也就没打, 这次记录笔记主要是觉得这个 网云穿 很好用,分享给大家. 1 什么是内网穿透? 内网穿透也叫内网映射&#xf…

zookeeper最基础教程

文章目录 一、简介1、工作机制2、特点3、数据结构4、应用场景5、选举机制 二、软件安装1、单机版安装2、集群安装3、配置参数解读(zoo.cfg)4、ZK集群启动脚本 三、命令行操作1、语法2、使用3、节点相关4、监听器原理5、节点删除与查看 三、写数据流程 一、简介 1、工作机制 官…

输电线路故障数据集(单相接地故障、两相接地故障、两相间短路故障、三相间短路故障)

1.数据集介绍 将故障区分为具体的不同类型:单相短路故障、两相接地短路故障、两相相间故障、三相相间短路故障。每类有1300行数据左右,这里随意举出每种类别的两个样本进行展示。 GCBAIaIbIcVaVbVc1001-151.2918124-9.67745156385.800162260.400749853…

Hadoop设置固定ip无效的解决办法

今天配置Hadoop的时候,执行vi /etc/sysconfig/network-scripts/ifcfg-ens33修改网络配置文件后,一切正常,但重启后IP改变了,并且在修改以及重启网络连接数次后,IP依旧不按照我在ifcfg-ens33中配置的那样,检…

C++ - map 的 例题

前言 本博客在 一下文章关于 map 和 set 讲解之下,对 map 当中的 operator[] ()函数的功能运用,感受 map 功能强大。 349. 两个数组的交集 - 力扣(LeetCode) 给定两个数组 nums1 和 nums2 ,返回…

Python —— 捕获异常

1、Python中常见的异常 & 捕获异常 1、常见异常 1、NameError: name a is not defined 2、IndexError: list index out of range 3、KeyError: nam 4、ValueError: invalid literal for int() with base 10: b 5、ZeroDivisionError: div…

day42

#include <iostream>using namespace std; template <typename T> class stu { private:T num[20];T head;T low; public:stu(){}stu(T h,T l):head(h),low(l){cout<<"有参构造"<<endl;}~stu(){cout<<"析构函数"<<end…

ELAS库计算双目视差图

ELAS源码下载&#xff1a;https://www.cvlibs.net/download.php?filelibelas.zip 代码结构目录 修改/src/main.cpp如下&#xff1a; /* Copyright 2011. All rights reserved. Institute of Measurement and Control Systems Karlsruhe Institute of Technology, GermanyThi…

三分钟学会一个新技能——使用Java操作Redis

目录 1、前置准备操作 1.1、为什么要进行前置准备操作 1.2、本地如何访问到云服务上Redis的6379端口号 1.3、配置步骤&#xff1a; 2、配置后本地主机如何操作 3、常用命令举例 3.1、通用命令举例 3.2、string相关命令举例 3.3、hash相关命令举例 3.4、list相关命令…

Pytorch从零开始实战03

Pytorch从零开始实战——天气识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——天气识别环境准备数据集模型选择模型训练数据可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1cu118&…

【Linux学习笔记】 - 常用指令学习及其验证(上)

前言&#xff1a;本文主要记录对Linux常用指令的使用验证。环境为阿里云服务器CentOS 7.9。关于环境如何搭建等问题&#xff0c;大家可到同平台等各大资源网进行搜索学习&#xff0c;本文不再赘述。 由于本人对Linux学习程度尚且较浅&#xff0c;本文仅介绍验证常用指令的常用…

Writesonic:博客和内容创作者的终极写作助手

【产品介绍】 产品名称 Writesonic 上线时间 成立于2020年 具体介绍 Writesonic是一个强大的人工智能写作助手&#xff0c;它使用自然语言处理&#xff08;NLP&#xff09;和机器学习算法来生成内容&#xff0c;这些内容不仅写得好&#xff0c;而且还为SEO和转…

MFC中嵌入显示opencv窗口

在MFC窗体中建立一个Picture Control控件,用于显示opencv窗口 在属性中设置图片控件的资源ID为IDC_PIC1 主要的思路: 使用GetWindowRect可以获取图片控件的区域 使用cv::resizeWindow可以设置opencv窗口的大小,适合图片控件的大小 使用cvGetWindowHandle函数可以获取到ope…

30天入门Python(基础篇)——第3天:【变量】与【输出】与【转义符】(万字解析,建议收藏)

文章目录 专栏导读作者有话说&#xff1a;上一节课补充(Pychaem界面认识)①编写代码区域②运行代码&#xff08;多种方法&#xff0c;随便选一种&#xff0c;开心就好&#xff09; 什么是变量&#xff08;变量的定义&#xff09;①较标准的回答(引用AI)②大白话解释图文并茂(我…

嵌入式Linux驱动开发(I2C专题)(一)

一、I2C协议 1.1、硬件连接 I2C在硬件上的接法如下所示&#xff0c;主控芯片引出两条线SCL,SDA线&#xff0c;在一条I2C总线上可以接很多I2C设备。 1.2、IIC传输数据的格式 1.2.1、写操作 流程如下&#xff1a; 主芯片要发出一个start信号然后发出一个设备地址(用来确定是…

Java作业-模拟扎金花

要求 实现扑克牌的创建、洗牌、发牌、大小对比&#xff0c;输出赢家牌。 前提条件 首先需要创建三个集合&#xff0c;用于存储牌面值、牌号与比较规则&#xff0c;再创建一个类作为牌。 其次还需要了解到一个工具类&#xff0c;就是Collections类&#xff0c;该类的所有方法…