我正在开发IoT Linux设备。运行我的申请时存在段故障。我需要一些方法来解决这个问题。
我尝试过的方法:
1.核心转储
ulimit -c unlimited;unlimit -f unlimited;核心会创造,但也许芯片的内存不够,所以核心总是被修剪。我无法使用 gdb 来获取回溯。
2.DMESG | grep 段错误
这个 linux 系统不会在"demsg"中保存崩溃
3./var/log/messages
这个 linux 系统不会在"/var/log/messages"中保存崩溃
您有什么解决段故障的建议吗?谢谢。
你可以使用像Valgrind这样的工具。当我们试图查找在数组边界之外写入的数据时,它对我们有很大帮助。它适用于检查内存泄漏、边界外情况和分段错误。实际上,我们只是用它来检查我们所有的C/C++程序,并发现了许多未检测到的错误。
注意:不要忘记使用调试信息编译程序(例如 gcc 编译器的 '-g' 开关),以便在 Valgrind 中获得更多人类可读的消息。查看此快速入门指南。
核心转储可能很大,但根据我的经验,它们包含大量的零,因此可以轻松压缩。使用/proc/sys/kernel/core_pattern 文件,你可以让内核通过 gzip 通过管道转储,这样它占用更少的空间(在核心生成期间压缩核心文件)。
另一种选择是尝试 -fsanitize 系列的 gcc 选项。更具体地说,-fsanitize=地址和-fsanitize=undefined。如果这样做,应用程序在崩溃时将打印大量有用的信息(通常包括发生崩溃的实际文件和行号)。哦,不要忘记将相应的共享库复制到目标,否则动态链接器将在尝试运行检测的应用程序时引发错误。