繁体   English   中英

将调试语句重定向到stderr时出现奇怪的情况

[英]Strange situation while redirecting debug statements to stderr

我陷入了困境。 我正在嵌入式设备(基于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)

但是,当我关闭这些调试语句时,该应用程序不会在任何地方崩溃。 我不明白为什么会这样。
据我的猜测,由于该设备没有自己的标准终端,因此打印这些调试消息会创建一个缓冲区,由于该缓冲区一段时间后它会崩溃,而另一方面,当我关闭调试语句时,它将正常工作。 请提出为什么可能会发生?

也许您的DEBUG_PRINT调用之一的参数之一导致fprintf的string-interpolator例程引用无效的内存? 例如,您的代码中的类似内容会使您的应用程序在fprintf()中崩溃:

const char * badPointer = (const char *) 0xDEADBEEF;  // deliberately pointing to invalid memory
DEBUG_PRINT("Crashing now!  %s\n", badPointer);

...要么是这样,否则系统的stdio或USB实现中可能存在导致崩溃的错误。

为了缩小范围,您可以尝试注释掉各种DEBUG_PRINT语句,直到崩溃消失为止(此时,您可以合理地怀疑它是引起崩溃的现在已注释掉的DEBUG_PRINT语句之一,然后回注释一下)直到弄清楚是谁的罪魁祸首)...或者如果您怀疑fprintf()中的错误,您可以像这样进行酷刑测试:

while(1) DEBUG_PRINT("I think I %s!\n", "can");

...,然后查看运行该程序是否可以提供预期的输出(字符串的无限输出)或崩溃。 如果崩溃,则表明程序外存在错误。

您是更改这些语句的唯一方法,还是要从调试过渡到发行版本? 从调试版本切换到发行版本将更改优化和内存填充等内容,因此可能是由于这些原因导致在非调试中崩溃。

如果您要更改的只是打开和关闭调试跟踪,我建议您非常仔细地检查所有格式参数(%s,%d等),并确保未将变量作为错误的类型传递。

如何在没有控制终端的情况下运行应用程序? 您可以尝试以下方法:

在连接了终端的情况下运行您的应用程序,但重定向了stderr

./yourapp 2>/dev/null

要么

./yourapp 2>somefile.log

看看它是否仍然崩溃。 如果要转储核心文件,请不要忘记执行ulimit -c unlimited。

如果您有一个基于busybox的用户空间,则可以尝试在循环缓冲区模式下使用syslogd,并通过调用syslog替换fprintf(stderr,...),然后查看它是否仍然崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM