静态与非静态函数 - 调试嵌入式系统上下文

Edw*_*rdH 7 c embedded debugging static

我对以下问题感到困惑:如何保持"静态"标签的优势,但仍然能够在现场调试生产代码?

一旦发生意外行为发生在客户站点,并且仅在那里发生.在许多情况下,可以选择执行调试可以节省大量精力并提供非常快速的响应.这样的调试通常涉及检查函数行为,这使我们进入"静态"定义.

无法从调试shell调试静态函数,例如放置断点或执行它.另一方面,将所有函数定义为public会导致代码结构和优化悲伤.

我知道有一些选项,比如编译至少两个不同的版本,一个是静态的,一个是没有,但是这很适合自动化测试,而不是最终的生产版本.

我们会从您这里获得一些见解,主要是关于您如何解决(如果有的话)这种困境.或者将问题改为:" 什么更重要? "

这里对C中"静态"的讨论很好.

tor*_*rek 1

一些调试器可以调试“静态”函数。不过,有时静态函数会在调用站点处进行线性扩展,这使得调试器的工作变得困难,并且一些调试器会放弃。

\n\n

(调用站点的内联扩展实际上并不是特定于“静态”的属性,只是编译器更有可能这样做,因为它们“了解更多”关于函数\xe2\x80\x94的信息,具体来说,名称在当前翻译单元之外不可见,因此如果函数的所有调用都内联扩展,则可以完全省略该函数的代码。)

\n\n

使用宏曾经很常见:

\n\n
#ifndef STATIC\n#  define STATIC static\n#endif\n...\nSTATIC void somefunc() { ... }\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后将宏变为“无”以进行调试构建。这工作得很好,但最好找到一个足够智能的调试器来处理静态函数,即使它们是内联扩展的。

\n