设置 WatchPoint 你可以在你的程序中,对你所想监控的程序设置一些 WatchPoint ,以方便于你对程序进行调试,或更容易找出问题的原因。就像我前面说, Purify 可以找到你的内存泄露,但其不能找到内存泄露的原因,你可以通过设置 WatchPoint 来" name="description" />
你可以在你的程序中,对你所想监控的程序设置一些WatchPoint,以方便于你对程序进行调试,或更容易找出问题的原因。就像我前面说,Purify可以找到你的内存泄露,但其不能找到内存泄露的原因,你可以通过设置WatchPoint来跟踪一块内存,以找到在程序执行过程中该内存的访问情况。
Purify的WatchPoint可以产生下例消息:
l WPR(被WatchPoint的内存读)
l WPW(被WatchPoint的内存写)
l WPM(被WatchPoint的内存分配)
l WPF(被WatchPoint的内存释放)
l WPN(来到被WatchPoint的内存的Scope)
l WPX(离开被WatchPoint的内存的Scope)
一旦你设置好了一个WatchPoint,Purify会自动报告上述这些信息,以告诉你内存的存取情况。很方便你调试程序。
WatchPoint一般是在调试程序时跟踪一块内存时候使用的,你也可以用其跟踪一些系统级的全局变量,如:errno。一旦errno被写了,马上会报告一个WPW消息,展开后,你能看到函数的堆栈情况,以及是在哪个系统调用后出现了错误。这个使用很方便我们找到一些非内存方面的问题。
大家可能会有一种感觉,那就是在一般的调试器中,如GDB中也有WatchPoint的设置(对GDB的使用请参考我的文章《用GDB调试程序》),那么,在调试器中的WatchPoint和Purify的有什么不同?下面是一些GDB中的WatchPoint不足的地方:
1) GDB中的WatchPoint用于单步跟踪中。
2) GDB中的WatchPoint只能在其内存的Scope中,离开了Scope,WatchPoint会被删除。
3) 在GDB中设置一个4字节的内存WatchPoint,会让程序的运行效率下降1000个数量级。
Purify中的WatchPoint有效地克服了这些问题,它在全局范围内监控所有内存的使用,并且,其速度上大大地快于GDB等一系列的调试器。
有两种方式可以让我们设置Purify的WatchPoint,一种是在程序中使用WatchPoint的API函数,一种是直接在调试器中使用(如:GDB),下面我介绍一下这两种用法: