【问题标题】:Adding breakpoints changes program behavior添加断点会改变程序行为
【发布时间】:2013-03-19 20:31:23
【问题描述】:

我正在使用的一些代码存在一个奇怪的问题: 据我所知,据我检查,代码中没有依赖任何随机的组件,例如系统时间等。 然而,只需在代码中添加一个断点并改变程序的行为就足够了。它没有做错任何事情,只是表现不同(在代码中要通过某个值选择几个对象,所有对象都为 0 - 它只是在添加断点时选择值为 0 的不同对象) . 不幸的是,无法发布任何代码,因为代码太多了。

什么可能导致这种行为?

编辑: 我在这个问题上花了更多时间:它似乎与断点本身无关 - 产生不同结果的“最简单”方法如下:从项目的不同 .cpp 文件启动调试过程时,输出已经不同了。当禁用“自动构建”时,这不再发生。我由此得出结论,即使代码没有变化,也会重建一些东西。 我还将范围缩小到实际导致不同行为的类:它是斐波那契堆的实现。

【问题讨论】:

  • 完全莫名其妙的行为通常(通常?)意味着您的某些代码具有未定义的行为,但是如果没有代码查看,就无法猜测到底是什么或在哪里。不过,我不会忽略它——奇怪但无害的行为并不总是无害的。
  • 是选择多个对象并以不同的顺序执行,还是选择多个对象之一并选择不同的对象。无论哪种方式,优化都是一个出色的候选者。
  • 它应该是从众多中选择一个并选择另一个。优化已停用。
  • 在调试器下运行与不在调试器下运行时,您是否看到了不同的行为?或者在调试器下运行与附加调试器之间的区别?
  • @StarPilot:我只尝试在调试器下运行。但我知道当从调试模式切换到运行模式以及打开优化时,行为也会发生变化,但是在尝试创建最简单的场景时,我将其缩小到在调试器(Eclipse 提供的调试器)中运行它并切换断点打开和关闭。

标签: c++ eclipse breakpoints


【解决方案1】:

如果您不在 Windows 上运行,请考虑使用 Valgrind - these are the supported platformsMemcheck 工具将运行您的程序(速度较慢),查看每个内存引用以跟踪未初始化变量的使用情况。

Memcheck 可以检测您的程序是否:

  • 访问不应访问的内存(尚未分配的区域、已释放的区域、堆块末尾的区域、堆栈的不可访问区域)。
  • 以危险的方式使用未初始化的值。
  • 内存泄漏。
  • 堆块的错误释放(双重释放、不匹配的释放)。
  • 将重叠的源和目标内存块传递给 memcpy() 和相关函数。

【讨论】:

  • 不幸的是,我使用的是 Windows,并且我已经使用内存检查工具进行了一些工作 - 它们确实显示了一些问题,但这些问题很可能是由程序中发生的大量重新分配引起的.
猜你喜欢
  • 2012-08-18
  • 2022-01-27
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多