【问题标题】:Printing certain variables in gdb causes execution to resume在 gdb 中打印某些变量会导致执行恢复
【发布时间】:2012-08-14 15:38:33
【问题描述】:

十年来我一直在使用 gdb,但从未遇到过这个特殊问题。我升级到 gdb 7.4,问题依旧。

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

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

【问题讨论】:

    标签: gdb


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您知道这一点给我留下了深刻的印象,感谢您的帮助。我将所有智能指针转换为标准指针,并且不再遇到许多问题,但我会记住这一点。
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多