【发布时间】:2012-03-25 19:01:26
【问题描述】:
被下面的问题迷惑了:如何在保持“静态”标签的优势的同时还能现场调试生产代码?
一旦发生意外行为,就不会在客户现场发生,而且只会发生在客户现场。在许多情况下,选择执行调试可以节省大量精力并提供非常快速的响应。这样的调试通常涉及检查函数行为,这将我们带到“静态”定义中。
不能从调试 shell 调试静态函数,例如设置断点或执行它。 另一方面,将所有函数定义为 public 会导致代码结构和优化问题。
我知道诸如编译至少两种不同的构建,一种是静态的,另一种是没有的选项,但这很适合自动化测试,而不是最终发布的最终生产构建。
希望您能提供一些见解,主要是关于您如何解决(如果有的话)这个困境。或者将问题改写为:“什么更重要?”
关于“静态”在 C here 中的一个很好的讨论。
【问题讨论】:
-
你的意思是你不能在声明为
static的函数中设置断点?在 C 中,static函数只是普通函数,但不能从其他“翻译单元”调用。除非它们已经被优化掉,否则没有什么可以阻止它们的远程或本地调试。 -
您可以定义一个指向静态函数的全局指针,并使用它的值在静态函数上设置断点。您甚至可以将此指针设为
volatile,以防止编译器将其作为未使用的对象消除。 -
@JoachimPileborg 据我所知,静态函数不会进入符号表(即使使用编译器标记),因此无法调试(如断点)。
-
@Alex 有趣的方法,这是一个自我管理的符号表。如果我们要对所有源都这样做,我们需要模块(文件)将其功能注册到这样的实体。但据我所知,编译器可能会将这样的静态函数优化为内联,读取静态函数地址安全吗?
-
它肯定在我刚刚制作的(我承认很简单)测试程序的符号表中。您的目标和主机平台是什么?你的调试器呢?
标签: c debugging static embedded