追踪任务(构建一个函数图)。

 

假设我们有一些代码(函数、类等)。

任务是创建一个调用栈。但不只是一个线性的--作为一棵树

其中,树形节点将是函数的入口,分支将是当前函数节点对以下函数的调用。

例如,有这样一种功能结构。

void Main() {  A(); B(); }

void A() { /*вошли в А*/ a(); b(); c(); }
void B() { /*Вошли в B*/ a(); b(); c(); }

void a() { /*Вошли в а */ }
void b() { /*Вошли в b */ }
void c() { /*Вошли в c */ }

结果会是这样的


义务性条件。

你可以在现有的代码函数中 添加一个 函数来安排追踪--就在"{"后面。
不要以任何方式改变源函数的输入参数或其结果或内部代码。

需要这个条件是为了不对代码进行大的修改,而只是在所有现有的代码函数中插入一个相同的跟踪函数(例如,我们将其命名为_TRACE_IN_)。为了获得源代码的所有传递,并建立调用树。


我很高兴听到任何想法或变体。
无论我怎么转,我都会遇到一个恶性循环,当我不得不调用不是一个而是两个函数来形成这样一棵树时。但我可能只需要一个。:)

 

所以,你想做一个程序来检测源的算法。

我以前在Asm中破解别人的程序时,自己也做过类似的事情,但我不明白你的做法...

为什么要用树的形式?

或者,也许我不明白。

 
FLET:

也就是说,你想做一个检测源码算法的程序。
,我在用Asm破解别人的程序时,也为自己做了类似的事情,但我不明白你的做法...
为什么作为一棵树?
还是什么,我不明白。


我并没有考虑 "打破 "的问题。但你说对了。这是为了建立一个合理的代码结构。

也就是说,我的任务--当我打开一个工作代码(我自己的或别人的,或者,例如,从MT5的标准交付)--在一个单独的窗口中,我得到整个堆栈的调用函数 作为一个树。也就是说,在根部--函数start(),从那里往上走,超过....。

我很久以前就已经实施了这棵树。它有对函数所花时间的分析(用于分析代码质量),对函数的调用次数,变量值的追踪等等。我还实现了显示这棵树的三个选项--如截图上所示,以及圆形和线形图。但我做这些都是为了小事。

我面临的主要任务是填充树状结构本身。

我需要一个想法,如何使用一个函数(也可能是几个任务,但主要是它们在一个行中), 添加到源代码函数中,以建立截图上的这样一个结构。

 
sergeev:

我需要一个想法,如何 建立一个像屏幕上的结构,只用一个函数, 添加到代码函数的开头。

一个想法 提供不可能的证明就可以了?
 
MetaDriver:
一个想法 提供不可能的证明就可以了?

将....但只是在讨论了3页的选项之后 :))

复杂的实现,额外的变量,全局的使用,或任何东西,都接受。)

 
sergeev:

将....但只是在讨论了3页的选项之后 :))
兰。等待第四页;-)
 
sergeev:

这是值得的....但只是在讨论了3页的变体之后 :))


因此,任务归结为用3页的文字来填补这个话题?:),好的,我们开始吧;)

1. 处理字符串:输入函数,添加函数名称,删除函数退出,日志/跟踪永久输出完整的字符串作为一个线性列表。

start(输入)-func1(输入)-func2(输入)

start(进入)-func1(进入)-func2(退出)

...

这种做法,我认为是在浪费时间

2.手动计算代码中的函数数量,这个数字将是一个编号系统,即在10个函数的代码中=基数10,在3个函数的代码中=基数3,使用布尔代数,或者也许更容易使用矩阵,进行排除操作或包括在一个函数的输入/输出中

大致如此,但话说回来,我认为--值得这么麻烦吗? 要做的工作很多。

 

IgorM:

因此,任务被缩减为用3页的文字来填充主题?:), 好了,我们开始吧;)

嘿,没那么热!!!我们在这里每一页都在计算:)

1. 与字符串打交道:输入一个函数,添加一个函数名称,退出该函数,删除它。

它不符合条件。你只需要一个 电话--在进入时。这在出口上是不现实的。一个函数中可以有几个退出点。但只有一个输入。因此,"增加 "必须只在输入端。
 
sergeev:

嘿嘿,没那么热!!!我们这里每一页都是有数的:)

太晚了,你的愿望被你说出来了;)

关于这一点--他们仍然需要与矩阵/多维数组打交道--那么就会有一个你的跟踪的数学模型,而你将如何处理函数的输入/输出事件是另一个问题。

 
IgorM:

晚了,你的愿望是由你来表达的;)

你总是可以埋下一根树枝。而这并不是一个愿望。

对于这一点--我认为你仍然需要与矩阵/多维数组打交道--那么你的跟踪就会有一个数学模型,你将如何处理来自函数的输入/输出事件是另一个问题。

我一点也不明白。你能用手指解释一下矩阵在这里的作用吗?

我们的想法是把这些函数放到一个图中(用白话说就是一棵树)。但要按照清晰的时间顺序来调用和识别调用的内容。一个相同的函数可以从startinit 中调用。这就是我们需要解决的问题。

(我是在MQL5上开发的,因此我用类来做图。)

 
sergeev:

图(白话文的树)。

树是图的一个特例。