为啥我的代码会崩溃?
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 代码会使我的浏览器崩溃?