添加断点会改变程序行为

问题描述 投票:0回答:2

我正在使用的一些代码有一个奇怪的问题: 据我所知并且据我检查,代码中没有任何组件依赖于任何随机的东西,例如系统时间等。 然而,只需在代码中添加断点,程序的行为就会发生变化。它没有做任何错误,只是行为不同(在代码中通过某个值选择多个对象,所有这些对象都是 0 - 它只是在添加断点时选择一个值为 0 的不同对象) 。 不幸的是,不可能发布任何代码,因为代码太多了。

什么会导致这种行为?

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

c++ eclipse breakpoints
2个回答
0
投票

如果您不是在 Windows 上运行,请考虑使用 Valgrind - 这些是受支持的平台Memcheck 工具将运行您的程序(速度较慢),查看每个内存引用以跟踪未初始化变量的使用。

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

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

0
投票

这是一个 gdb 错误。我已经在 gcc 上提交了申请 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117647),他们要求我转到 sourceware.org。 同时他们提到了两个相关问题https://sourceware.org/PR28999https://sourceware.org/PR26325,但截至今天2024/11/18 gdb 15.2仍然没有解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.