代码之家  ›  专栏  ›  技术社区  ›  anorm

如何使用gdb找出对象的位置?

  •  0
  • anorm  · 技术社区  · 16 年前

    我正在调试一个应用程序,它在一个几乎不可能确定是哪个实例导致了segfault的位置上发生故障。

    我想,如果我能够解决创建对象的位置,我将知道是哪个实例导致了问题并解决了这个bug。

    为了能够检索这些信息,gdb(或其他一些应用程序)当然必须重写默认的malloc/new/new[]实现,但是用它来检测我的应用程序是可以的。

    有人可能会说,我可以把一个断点放在一条线的前面,然后从那里进入对象,但问题是这是一个中央消息调度程序循环,它处理 很多 对于不同的消息,我无法设置断点条件,以捕获我的行为不正常的对象。

    3 回复  |  直到 16 年前
        1
  •  1
  •   atomice    16 年前

    是否尝试使用内存调试库(例如dmalloc)。其中许多已经是新工具等,并记录了分配的位置。不过,有些从gdb访问比其他更容易。

    此产品具有内存调试功能,可以按您的需要进行以下操作: http://www.allinea.com/index.php?page=48

        2
  •  3
  •   divegeek    16 年前

    所以,在segfault发生的地方,你有对象,但是你不知道创建这些对象的代码片段中的哪一部分创建了它,对吗?

    我会检测所有这些对象创建位,并让它们将创建的每个对象的地址以及文件和行号(预先定义的宏可以帮助实现这一点)记录到一个文件中。

    然后在调试器下运行该应用程序,让它捕获segfault,并在日志中查找有问题的对象的地址,以找出它是在哪里创建的。然后剥下一层洋葱皮。

        3
  •  0
  •   user193272    16 年前

    当segfault发生时,我首先尝试在gdb中使用backtrace命令。如果这不能给我一个很好的线索,我会下一步尝试使用Valgrind检查是否有内存泄漏发生。根据我的经验,这两个步骤通常足以缩小范围,在大多数常见情况下找到问题所在。

    当做。