修复C++中的分段错误

Elp*_*rto 72 c++ debugging segmentation-fault

我正在为Windows和Unix编写一个跨平台的C++程序.在Window端,代码将编译并执行没有问题.在Unix方面,它会编译然而当我尝试运行它时,我得到一个分段错误.我最初的预感是指针存在问题.

找到并修复分段错误错误的好方法是什么?

Svi*_*ack 107

  1. 编译您的应用程序-g,然后您将在二进制文件中有调试符号.

  2. 使用gdb打开GDB控制台.

  3. file在控制台中使用并传递应用程序的二进制文件.

  4. 使用run并传入应用程序需要启动的任何参数.

  5. 做一些导致分段错误的事情.

  6. 键入btgdb控制台得到的堆栈跟踪分割故障.

  • 启用调试构建类型。一种方法是`cmake -DCMAKE_BUILD_TYPE=Debug`。 (4认同)

pal*_*ogt 31

有时崩溃本身并不是问题的真正原因 - 也许记忆在早些时候被粉碎,但腐败显示需要一段时间.查看valgrind,它有很多指针问题检查(包括数组边界检查).它会告诉你问题的起始位置,而不仅仅是发生崩溃的行.


log*_*og0 16

在问题出现之前,尽量避免使用它:

  • 尽可能多地编译和运行代码.找到故障部件会更容易.
  • 尝试封装低级/容易出错的例程,以便您很少需要直接使用内存(注意程序的模型化)
  • 维护一个测试套件.概述当前正在工作的东西,什么不再工作等,将帮助您找出问题所在(Boost测试是一种可能的解决方案,我不自己使用它,但文档可以帮助理解什么样的必须显示信息).

使用适当的工具进行调试.在Unix上:

  • GDB可以告诉您编程崩溃的位置,并让您了解在什么情况下.
  • Valgrind将帮助您检测许多与内存相关的错误.
  • 使用GCC你也可以使用mudflap与GCC和Clang你可以使用Address/Memory Sanitizer.它可以检测到Valgrind没有的一些错误,并且性能损失更轻.

最后我会推荐通常的事情.程序的可读性,可维护性,清晰性和整洁程度越高,调试就越容易.


whe*_*ies 6

在 Unix 上,您可以valgrind用来查找问题。它免费且功能强大。如果你更愿意自己做,你可以重载newanddelete操作符来设置一个配置,0xDEADBEEF在每个新对象之前和之后都有 1 个字节。然后跟踪每次迭代发生的情况。这可能无法捕获所有内容(您甚至不能保证触及这些字节),但它过去在 Windows 平台上对我有用。