为啥我的代码会崩溃?

Posted

技术标签:

【中文标题】为啥我的代码会崩溃?【英文标题】:Why does my code crash?为什么我的代码会崩溃? 【发布时间】:2015-11-19 11:54:11 【问题描述】:

这是一个相当笼统的问题。

如果您有一个包含很多行代码的程序,比如说 C++。在编译期间一切运行良好,没有警告没有错误。但是在执行程序的过程中突然冻结,导致崩溃。

如果您几乎没有任何可能发生这种情况的信息(可能是循环,可能是指针,可能是错误的初始化,可能是......),如何解决这个问题。

是否有任何技术或分析器可以跟踪程序执行的当前行?

【问题讨论】:

瞧!您刚刚向全世界询问了调试器。 你怎么知道debugging标签的使用方法却没听说过调试? 如果堆栈溢出自动将“调试”标签放在那里,那么它就是图灵测试的候选者。如果没有,那么您的问题就是反问。 我投票决定将此问题作为题外话结束,因为答案包含在问题中。 看,在gdb下运行就行了。 (关闭编译器优化。)如果它挂起的时间足够长,只需在它挂起时按 Ctrl-C,看看它在做什么。如果在您执行此操作之前它崩溃了,gdb 会告诉您它崩溃的位置。或者,您可以单步执行程序,在每个语句处确保它正在做正确的事情。当它崩溃时,你会知道在哪里。这就是程序员所做的。 【参考方案1】:

你的问题太宽泛了,没有通用的答案。一般来说,bug 是你的(起初不要怀疑编译器或实现有错,几乎总是错了,而不是系统!)。

首先,请仔细阅读Halting Problem 和Undecidable Problem。

然后,在你的代码中对undefined behavior (UB) 格外小心(并非所有代码都给出segmentation faults,请参阅this)。 C++ (& C) 代码可以有很多。一些语言(Haskell、Scheme、Common Lisp....)更明确,UB 更少。

具体来说,

在编译器中启用所有警告和调试信息,因此如果使用 GCC(或同样使用 Clang/LLVM),请使用 g++ -Wall -Wextra -g 进行编译。有时你会很乐意使用一些消毒剂,例如使用some -fsanitize= 标志编译。

了解如何使用调试器(例如gdb),以及valgrind

更多地了解 C++,因为它是一门难学的语言。

了解并遵守编码规则和指南(例如rule of 5)。

好奇并学习许多其他语言和概念(请阅读SICP并学习Scheme)。

您需要ten years 来学习编程,所以请耐心等待。

PS。我有偏见的建议是在你的笔记本电脑上安装 Linux。

【讨论】:

这还不够。你需要理解 C++ 和你的程序的语义,这真的很难。你也应该使用gdb 我对它并不陌生,我只需要更接近问题的根源

以上是关于为啥我的代码会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 angularjs ui-router 代码会使我的浏览器崩溃?

为啥这个检查代理有效性的代码会崩溃?

当我在 Swift 中从音乐库中选择歌曲时,为啥我的应用程序会崩溃?

为啥我在退出我的 Activity 时会崩溃?

为啥我的应用在使用 cloudkit 时会崩溃?

为啥我的 iOS 应用程序在收到推送通知时会崩溃?