如何在C中观看变量

时间:2018-07-11 05:54:34

标签: c

我有差不多16000行(C代码)的代码库,在其中我执行不同的操作(在Raspberry Pi上)。每次操作后,我将更新dc的值。 dc最初为0,如果由于某些错误我的控制器失去了与笔记本电脑的连接,它将变为1。

我需要随时调用一个函数。1.我听说JavaScript中有一个名为Object.prototype.watch()unwatch()的函数。基本上,它的作用是监视变量,并且只要其值更改,它就会调用函数。我的dc值更改时,我需要实现类似的函数或语句或任何调用该函数的东西。

每次更新dc之后,我都不能使用if-else,因为它不是一种很好的编码方式,如果我使用if-else会很多。

4 个答案:

答案 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函数,该函数将调用一些回调。