【发布时间】:2012-01-02 19:11:39
【问题描述】:
我陷入了困境。我正在开发嵌入式设备(基于 linux OS 和 ARM 处理器,32 位)。它是一种触摸屏设备,具有许多外围设备,如智能卡读卡器、GPS、GPRS。我正在用 C 编码,当我重定向调试语句时,我的应用程序在一段时间后崩溃,如下所示。我有大约 300 个调试打印语句,我正在使用这个函数(如宏)打印。该设备也可以通过 USB 电缆连接到系统终端。当我在我的系统终端中打印这些调试语句时,应用程序不会在任何地方崩溃,但是当我不使用我的计算机终端并在设备中运行应用程序时,它会在一段时间后崩溃:
#ifdef DEBUG_TEST
#define DEBUG_TEST 1
#else
#define DEBUG_TEST 0
#endif
#define DEBUG_PRINT(fmt, ...) \
do { if (DEBUG_TEST) fprintf(stderr, fmt, ##__VA_ARGS__); } while (0)
但是当我关闭这些调试语句时,应用程序不会在任何地方崩溃。我不明白为什么会这样。
根据我的猜测,由于设备没有自己的标准终端,因此打印这些调试消息会创建一个缓冲区,因此一段时间后它会崩溃,而另一方面,当我关闭调试语句时,它工作正常.请提出为什么会发生这种情况?
【问题讨论】:
-
它究竟是如何崩溃的?段错误?被内核杀死?其他?
-
您可以选择在 GDB 下运行它,还是收集核心转储?
-
如果我不得不猜测,我会说调试语句不是问题,它们只是在引发heisenbug。
-
只有当我打开调试语句并仅在设备上运行它而不使用我的系统终端时才会崩溃(意味着没有将设备连接到我的系统)..因此我无法追踪在哪里以及为什么它崩溃了......
-
我个人的猜测是 stderr 实现内部的一些缓冲区溢出。至少,当它没有连接到某个设备时,我会使用 freopen() stderr 来写入文件。这应该可以避免问题或更好地指示发生崩溃的地方。