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

时间:2009-10-15 14:32:29

标签: c++ gdb memory-management segmentation-fault

我正在调试一个应用程序,并且它在一个几乎不可能确定哪个实例导致段错误的位置发生段错误。

我认为如果我能够解析创建对象的位置,我将知道哪个实例导致了问题并解决了错误。

为了能够检索这些信息,gdb(或其他一些应用程序)当然必须覆盖默认的malloc / new / new []实现,但使用它来检测我的应用程序就没问题。

有人可能会争辩说,我可以在段之前在段上放置一个断点并从那里进入对象,但问题是这是一个中央消息调度程序循环,它处理很多

3 个答案:

答案 0 :(得分:3)

因此,在发生段错误时,你有了对象,但是你不知道创建这些对象的许多代码中的哪一个创建了它,对吧?

我会检测所有这些对象创建位,并让它们将创建的每个对象的地址记录到文件中,同时记录文件和行号(__LINE__和__FILE__预定义的宏可以帮助简化这一过程)

然后在调试器下运行应用程序,让它捕获段错误并在日志中查找违规对象的地址以找出它的创建位置。然后去掉下一层洋葱。

答案 1 :(得分:1)

您是否尝试过使用内存调试库(例如dmalloc)。其中许多已经在新的等工具和记录分配的地方。有些比gdb更容易从gdb访问。

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

答案 2 :(得分:0)

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

问候。