【问题标题】:What's your method for finding the cause of a segfault?您找到段错误原因的方法是什么?
【发布时间】:2013-06-20 13:46:31
【问题描述】:

或者只是一般的调试,您喜欢如何查找代码中的错误。特别适用于 C/C++,但一般适用于所有语言。我一直在试图找出这个令人讨厌的段错误的原因,但我希望自己找到它,而不是在网上发布它。你对像我这样的学徒有什么建议吗?

【问题讨论】:

  • 使用调试器、断点调试代码、检查日志并尝试捕获错误也会有所帮助。
  • 使用调试器如gdb
  • 取决于您使用的开发环境。在 Linux 上,gdb 和 valgrind 是你的朋友。
  • 第一步,到目前为止,其他人没有提到,是(a)编译代码并将警告标志设置为非常严格(例如gcc -Wall -Wextra作为一个最小的起点),以及(b)确保没有警告。

标签: c++ c segmentation-fault


【解决方案1】:

使用诸如 gdb 之类的调试器并在出现段错误时打印回溯。它将显示崩溃的行号和文件。以此为起点。

为了更进一步,您可以重复该过程以确保它不是由于更早的其他错误而发生的随机故障,而是该行号的特定问题。

对于静态代码分析,您可以使用 klockworks 或 lint 等工具来显示代码中可能存在的问题。

对于动态分析,请使用 memwatch 等工具,它会在运行时监控您的内存分配。

我没有指出 valgrind,因为其他人已经提到过它,毫无疑问它是一个很棒的工具。

【讨论】:

    【解决方案2】:
    1. 用 GCC 的调试 flash 编译
    2. 用你的 exe 启动 gdb
    3. r(如果需要,可以使用参数)
    4. bt

    此解决方案通常允许识别段错误及其原因。

    【讨论】:

      【解决方案3】:

      尝试将您的代码推向糟糕的情况。

      如果您正在编写解析器,请将 BMP、JPG、随机文本扔给它,然后看看会发生什么。 如果你正在编写一个 RPC 协议服务器,用大量并发请求使其超载,向其中写入垃圾,在不知不觉中断开客户端......

      一开始不要狡猾,尽可能地抛出,然后尝试欺骗你的代码。

      【讨论】:

        【解决方案4】:

        我通常在调试器中运行...通常有足够的线索可以继续追踪...调用堆栈、变量的当前状态等。如果堆栈被丢弃或堆损坏,则可能是更加困难。如果我有一个可重复的场景,我会在 valgrind (Linux) 中运行它,它会检查所有内容并经常查明问题。

        【讨论】:

        • 值得注意的是,虽然 valgrind 非常棒(并且是我的首选工具之一),但它不会捕获堆栈/堆损坏,因此会遗漏一些非常棘手的错误。它还可以在 OS X 上运行(10.8 之前 - 它在 10.8 上存在问题)。
        【解决方案5】:

        如果您在一个花哨的 IDE 中尝试熟悉断点,您可以使用它们来查看在发生段错误之前您对代码的了解程度。如果您没有该选项,最简单的方法是一次注释掉部分代码,直到您发现有问题为止。

        我发现注释掉方法对于在小型作业大小的 C 问题中查找段错误非常有效。

        【讨论】:

          【解决方案6】:

          RMS 为finding a segfault using gdb 做了一个很好的教程。

          短版:

          $ gcc -g -O0 -o program program.c # -O0 makes debugging easier
          $ gdb ./program
          > run # Tell gdb to start running the thing
          ...segfault happens
          > bt # Get a stack trace from where it segfaulted
          

          【讨论】:

            猜你喜欢
            • 2013-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-11
            • 1970-01-01
            相关资源
            最近更新 更多