gdb: 不说啥了
valgrind: 运行时内存检查工具,强烈推荐,可以检测:内存泄露,内存越界,死锁。
我最常用它检查断错误。很多段错误都是由于内存越界引起的,但出现断错误的地方一般不是越界的地方,而是越界蔓延的结果,所以用gdb很难检查出来。用valgrind检查,它会在越界的时候给出错误信息,典型的如:
上面的代码,我们可以看出在ginio::utils::CrawlerString::CrawlerString(unsigned) (CrawlerString.cc:23)这里发生了写越界!接下来仔细检查下代码逻辑,就很容易定位到错误了。在这个例子里,CrawlerString这样实现的:
在这里bzero函数是没必要的,而且在size < sizeof(chaine)的时候还会写越界,因为只分配了size个字节的内存却要写大于它的内存。。。。