【问题标题】:Segmentation fault on method call方法调用的分段错误
【发布时间】:2012-11-10 21:50:29
【问题描述】:

我意识到调试器会有所帮助,但我目前对使用它有点缺乏了解。但我保证我会尽快开始学习它!因此,如果有人也知道一些关于我如何通过提示学习使用 gdb 的好书。非常感谢!谢谢。

【问题讨论】:

  • Imo 不用在 cli 上使用 gdb,默认情况下,获得你想要的东西更复杂,而且不太清楚。只需使用 eclipse 及其 GUI - 调试的学习曲线基本上为零。
  • 是的,这就是我想要的。但作为一个新程序员,我觉得在走捷径之前先学习会更有好处?
  • 请发布一个示例矢量文件(“Prj3 Config.txt”)
  • 好吧,您确实没有理由必须知道 CLI 命令是什么来打印变量或查看您当前正在单步执行的代码,或者如何单步执行它。重要的事情(step、next、return 之间的区别......)都是您可以从 IDE 轻松理解的高级构造。

标签: c++ segmentation-fault


【解决方案1】:

如果您使用的是 GCC,我强烈建议您使用 GDB。

我喜欢 Eclipse ...但我通常发现命令行更快、更有用。恕我直言...

无论如何:

1) 使用“-g”编译以允许调试,

2) 在 gdb 中运行你的程序,

3) 注意它崩溃的行#

4) 查看向后,看看是否有关于该行的内容您没有分配、您已经解除分配,或者很可能您使用错误的数组访问覆盖。

这里有几个关于 GDB 的简短教程:

'希望有帮助!

PS:

当您开始调试时,我建议您在“Nodes”构造函数和 ManipulateArray 构造函数中设置断点。

如果你没有命中断点......那么一个对象永远不会被创建......你可能发现了你的错误:)

【讨论】:

  • 你可以在 Eclipse 中做几乎所有你可以用 CLI 做的事情,你可以一目了然地获得所有漂亮的窗口和所有本地变量、全局变量等,你可以在 eclipse 中使用快捷方式也一样。对于初学者来说,我觉得真的要简单得多(例如,只需双击有趣的行与b class::func
  • 我强烈反对。由于很多不同的原因。包括让一切都在 Eclipse 中工作可能是一个糟糕的 PITA(尤其是对于“初学者”),而 gcc/gdb/make 通常更有可能“正常工作”。另一方面,Visual Studio/C++ 正好相反——在 Microsoft Land 中,MSVC IDE 通常是最好的起点。只要您不被卷入大量自动代码生成... :) 恕我直言...
  • @Voo:然后她必须学习如何在 Eclipse 中调试,然后还要学习高级 gdb 命令。为什么要浪费时间学习一门有限的语言?
  • @honk - 我完全同意。事实上,“gdb first”有很多充分的理由。恕我直言...
  • @honk 您认为大多数人实际使用的 gdb 中哪些高级命令在 eclipse 中不可用?而且,如果您只使用香草 gdb cli,您甚至无法与本地人一起获得窗口,查看您当前的代码等。对于初学者或其他任何人来说都不是很好。
【解决方案2】:

哇,这是一大堆代码。我不知道它的用途,但我可以看到一个问题

在您的Node 类中,您有一个由四个Node 指针组成的数组,称为attachedNode。在您的代码中,您绝不会将这些指针指向任何东西。但是您在 attachNewNode 方法中取消引用这些指针。那是一个段错误。

我不知道如何建议您解决该问题(或您可能遇到的任何其他问题,我认为有一些),因为我不太清楚代码应该做什么。

不过有一条建议。这段代码太大太复杂。先让一小部分工作,然后逐渐建立整个程序。缓慢而稳定的方法最终会让你更快地到达那里。

【讨论】:

  • 这就是我一直在做的。我边走边测试。到目前为止,这是我唯一的问题。
  • 好的,很高兴听到。然而,代码可能会更精致一些。例如,您阅读同一个文件数百次的方式并不好。由于 Node 部分显然是最复杂的部分,也许您可​​以尝试在 isolation 中进行处理,这样调试会更容易。然后当你让它自己运行时,你可以将它重新合并到主程序中。
  • 老实说,我认为您的代码原样可以。目前,“将所有内容都放在一个文件中”的好处可能超过了同时处理多个 .cpp 和多个 .h 文件所增加的复杂性。现在,只需解决当前问题:1)选择一个调试器,2)在“main()”和每个构造函数中设置断点,3)调试崩溃。我坚信某些东西没有被初始化。恕我直言...
  • @paulsm4,是的,Node 中的 attachedNode 指针。也许他们根本不应该是指针?很难说。
  • 感谢 paulsm4。我并不惊讶它不是很好。基本上我的老师说这是你关于一个新学科的项目,去做吧。所以我一直在学习。但是如果我现在重做它,我会更清楚地理解节点和指针。不会那么疯狂。
【解决方案3】:

快速浏览 void Node::attachNewNode(Node *newNode, int direction) {*newNode = *attachedNode[direction];} 看起来有问题。赋值应该是 attachNode[direction] = newNode; 您想在某个方向附加新节点。

【讨论】:

  • 好的,谢谢。这绝对是个大问题。但由于某种原因,我仍然遇到段错误。
  • 您的指针分配错误。所以当你说 *newNode = *someOtherThing 时,你的实际意思是 newNode = someOtherThing。给指针赋值。会说阅读指针并通过编写基本示例来感受它。
猜你喜欢
  • 2018-03-07
  • 2021-12-04
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多