我有差不多16000行(C代码)的代码库,在其中我执行不同的操作(在Raspberry Pi上)。每次操作后,我将更新dc
的值。 dc
最初为0,如果由于某些错误我的控制器失去了与笔记本电脑的连接,它将变为1。
我需要随时调用一个函数。1.我听说JavaScript中有一个名为Object.prototype.watch()
和unwatch()
的函数。基本上,它的作用是监视变量,并且只要其值更改,它就会调用函数。我的dc
值更改时,我需要实现类似的函数或语句或任何调用该函数的东西。
每次更新dc之后,我都不能使用if-else,因为它不是一种很好的编码方式,如果我使用if-else
会很多。
答案 0 :(得分:1)
没有这样的东西。口译或托管语言具有完全不同的规则。除了没有别的办法。
您可以将其包装到某种断言或函数中,但是除了在那个包装器中没有别的办法
答案 1 :(得分:1)
一个可悲的答案是:不,没有可靠的方法可以这种方式监视C中的变量。
根据代码的工作方式,有一些解决方法。
一种方法是隐藏变量(是的,我很难知道完全将内容隐藏在C中)。定义功能:
/data/db
另一种方法是编写一些监视器,该监视器定期检查变量。缺点是,如果确实需要每次更改此功能时都运行该函数,因为它不会捕获变量在两次检查之间发生更改和更改的事件。
答案 2 :(得分:0)
如果变量没有被任何指针引用,则您已经知道它的更新位置,因此可以使用visibleman的方法。不会像您预期的那样有array_reduce
个。只需创建一个这样的函数
if-else
,并使用此功能替换所有对dc的分配。您可以在任何文本编辑器的find / replace命令中或使用终端中查找/ sed的正则表达式轻松完成此操作
但是,在通常情况下,当您不清楚确切的时间点可以更新时,最简单的方法是使用单独的线程进行观看。您将通过使用计时器或检查值来进行某种轮询,然后休眠一段时间以免浪费CPU使用率。但是,除非您在每条指令后插入值检查,否则您将无法获得更改发生的确切位置,这会使您的应用多次减速。
您还可以运行gdb和attach it to your own process to watch之类的调试器。这样会更加灵活,但是您需要更多的内存。您还可以尝试一些调试库(如果有)
请参见Is is possible to set a gdb watchpoint programatically?
许多体系结构确实具有hardware watch points,因此调试器将在尝试进行软件监视(which is extremely slow)之前尝试用完它们。如果您了解该体系结构,也可以像这样手动设置调试寄存器,而不是运行成熟的调试器。当然,大多数情况下,您需要在特权模式下运行才能设置这些寄存器
在x86上,DR0-DR3中存储了3个断点,这些断点将在执行,数据写入,数据读/写和IO读/写时中断。我不知道ARM的情况,但seems to have 6 hardware breakpoints。如果要这样做,可以在ARM's documentation上进行检查。
答案 3 :(得分:0)
最直接的解决方案似乎是停止直接更改变量,并编写一个getter和setter函数,该函数将调用一些回调。