【问题标题】:Is there any methods to solve segment fault? [closed]有什么方法可以解决段错误吗? [关闭]
【发布时间】:2019-05-24 11:44:34
【问题描述】:

我正在开发一个 IoT linux 设备。运行我的申请时出现段错误。我需要一些方法来解决这个问题。


我尝试过的方法:

1.coredump

ulimit -c 无限;无限 -f 无限; core会创建,但是可能芯片的内存不够,所以core总是被截断。我无法使用 gdb 来获取回溯。

2.dmesg | grep 段错误

这个linux系统没有在“demsg”中保存崩溃

3./var/log/messages

这个linux系统没有在“/var/log/messages”中保存崩溃


您对解决段错误有什么建议吗?非常感谢。

【问题讨论】:

标签: c linux segmentation-fault


【解决方案1】:

Coredump 可能很大,但根据我的经验,它们包含大量的零,因此可以轻松压缩它们。使用 /proc/sys/kernel/core_pattern 文件,您可以让内核通过 gzip 管道转储,从而占用更少的空间 (compressing the core file during core generation)。

另一种选择是尝试 gcc 选项的 -fsanitize 系列。更具体地说 -fsanitize=address 和 -fsanitize=undefined。如果您这样做,您的应用程序将在崩溃时打印很多有用的信息(通常包括发生崩溃的实际文件和行号)。哦,别忘了将相应的共享库复制到您的目标,否则当您尝试运行已检测的应用程序时动态链接器会抛出错误。

【讨论】:

  • 我使用 -fsanitize 发现了问题。第一种管道 coredump 的方法在我的设备上不起作用。非常感谢。
【解决方案2】:

您可以使用 Valgrind 之类的工具。当我们试图查找写入超出数组范围的数据时,它帮助了我们很多。它适用于检查内存泄漏、越界情况和分段错误。其实我们后来只是用它检查了我们所有的C/C++程序,发现了很多未被发现的错误。

注意:不要忘记使用调试信息(例如 gcc 编译器的“-g”开关)编译您的程序,以便在 Valgrind 中获得更多人类可读的消息。检查this quick start guide

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多