208,821
社区成员




问题有点抽象,我描述一下。
目前在写一个小工具,用于帮助分析代码的脉络。
方式是在一些关键函数的第一行插入一行代码,这行代码用于获取当前的调用栈,并用合适的方式打印出来。
比如我的测试代码是这样的:
1 main()
2 a()
3 a1()
4 a11()
5 a12()
6 a2()
7 b()
我在函数a, a1, a12, a2, b分别做这行插入
也希望我的log能打出类似的格式来,帮我分析代码。
我的代码目前在Java, c#和c++上跑,未来可能会支持更多语言
但是我在实现c#端的时候发现问题
我无法完全准确知道我当前在哪里
比如a函数,它取到的frame是main, a
a1呢 它取到的main, a, a1
那么问题来了,我在a1的时候只希望在打印信息后追加a1, 也就是行号是3的位置
但是它并不知道main和a是它的下层栈,c#有个hash描述每个frame,但是不幸的是,a1里取到的a的那帧frame跟a里取到的不一样
别的语言我还没有具体看,但是c#我必须支持
那么问题来了,有什么办法能够推理出谁是谁的父栈,爷爷栈么
这样才能清晰的打印出父子关系。
ps 我目前简答的用了长度比较的方式来推算栈的回溯
比比长度,来扔掉不用的项,大致可用,但是我知道有两个明确的问题还没有解决
1 我的代码在不同的exe,dll使用,不是所有的调用都有统一的根节点,例如我写的那个main
2 还可能涉及线程的切换,让我的粗暴方法问题更多。
有哪位能有思路解决这个问题么 谢谢
学习了,好资料