创作思路
当我从idea获取一个栈时,我想着如何把它格式打印
当我获得两个栈时,我可以单独打印,但是会有很多重复,切不好结合分析
当我结合两个栈时,我想着能结合无数的栈,结合是精髓,机械地结合毫无意义,一定要有机的结合,最终的理想是把整个项目的脉络全部显示出来,构建一张“全栈”地图
地图太大了,得有搜索能力,栈该如何搜索呢,我定义起点和终点,地图残片一旦拼凑起来就不应该有缝隙,你可以把起点和终点分别设在两个残片上,前提是逻辑上能到达
要想功能强大,必须支持多个终点和起点,多个起点和终点取交集会是怎样的结果呢?说实话,我没编码之前,我都想不出会是什么样子。为了显眼,得给终点打上标记
开始遇到递归时,是想设置一个最大递归层数,后来设置多少层都不满意,还是得设别出递归,打上标记
遇到重写也能正确打上标记
目前发现唯一缺陷,是由于copy的栈没有参数信息,不能正确识别重载
实现的功能
利用clion上debug过程中copy的栈信息作为输入,通过python3.9格式化打印,并分析栈。支持以下功能:
1.格式化打印栈
2.有机结合多个栈
3.可以通过设置多个起点和终点来过滤栈
4.能够正确识别递归和重写
5.支持简洁和复杂打印风格,用户可扩展打印风格
6.目前支持java和c,用户可扩展其他语言
效果展示
在springboot启动过程中的关键处源码打上断点,打印效果如下:
00-> refresh
01-> refresh
02-> refresh
03-> invokeBeanFactoryPostProcessors
04-> invokeBeanFactoryPostProcessors //beanfatory后置处理
05-> getBeanNamesForType
06-> doGetBeanNamesForType
07-> isTypeMatch
08-> getSingleton //三级缓存解决循环依赖
09-> getObject【重写】
10-> lambda$doGetBean$0
11-> createBean
12-> doCreateBean
13-> createBeanInstance //创建bean实例
13-> populateBean //属性赋值
13-> initializeBean
14-> invokeAwareMethods //执行Aware方法
14-> applyBeanPostProcessorsBeforeInitialization //bean初始化前执行后置处理器
14-> invokeInitMethods
15-> afterPropertiesSet
16-> get
17-> getBean
18-> getBean
19-> doGetBean
20-> getSingleton 【已在level 8打印】 //三级缓存解决循环依赖
19-> doGetBean 【已在level 19打印】
14-> applyBeanPostProcessorsAfterInitialization //bean初始化后执行后置方法
13-> registerDisposableBeanIfNecessary //注册DisposableBean
09-> getObject【重写】
10-> lambda$doGetBean$0 【已在level 10打印】
05-> invokeBeanDefinitionRegistryPostProcessors
03-> registerBeanPostProcessors
04-> registerBeanPostProcessors
05-> getBean 【已在level 18打印】
03-> finishBeanFactoryInitialization
04-> preInstantiateSingletons
05-> getBean 【已在level 18打印】
代码实现
python代码
spacePerLevel: int = 4
with open('stack_record.txt', 'r', encoding='utf-8') as file:
content = file.read()
# print(content)
def preProcessing(line: str) -> str:
if line.strip().startswith('//') or line.strip() == '':
return ''
if language == 'c':
return line
elif language == 'java':
me: str = line.split(':')[0].strip()
lineNum: str = line.split(':')[1].strip().split(',')[0].strip()
file: str = line.split(',')[1].strip().split(' ')[0].strip()
comment: str = ''
if line.find('//') != -1:
comment = '//' + line.split('//')[1].strip()
return me + ' ' + file + ':' + lineNum + comment
else:
print('暂时只支持c和java格式的栈')
exit(0)
lineList: list[str]