2

十年来我一直在使用 gdb,但从未见过这个特殊问题。我升级到 gdb 7.4,问题仍然存在。

我正在 RHEL5 上调试 Cilk 多线程 C++ 应用程序。执行在段错误处停止。当我要求 gdb 打印某些变量的值(它们是 boost::intrusive_ptr 对模板化对象实例的引用)时,gdb 将打印正确的值,但也会在很短的时间内恢复所有线程上的执行。我怀疑它会恢复执行,因为我的更多调试打印语句滚动到终端(它不仅仅是清除缓冲区——我可以继续打印它并且它会继续恢复执行)。这种持续执行的短暂突增导致我正在跟踪的变量的值发生变化。至少可以说,这阻碍了调试。

我怀疑我有内存泄漏并且堆栈已损坏,但我已经在代码上运行了 valgrind(具有不同的初始条件)并且它显示我正在调试的主要子系统中没有内存泄漏,除了名义上的 Cilk - 内部泄漏。

4

1 回答 1

1

当我要求 gdb 打印某些变量的值(它们是对模板化对象实例的 boost::intrusive_ptr 引用)时,gdb 将打印正确的值,但也会在很短的时间内在所有线程上恢复执行。

我知道发生这种情况的唯一方法是,如果你有

  1. 类型 ( boost::intrusive_ptr) 和
  2. 那台漂亮的打印机回调到劣质(正在调试)进程。

您可以通过例如禁用所有漂亮的打印机disable pretty-printer。如果这有帮助,您可能应该找出确切的漂亮打印机正在执行此操作,并联系其作者。

于 2012-08-15T04:10:59.377 回答