现在有个程序,代码比较多,而且又不是很熟悉代码(之前写的,过了很久了),现在发现程式运行时会弹出一个异常,调试进去之后,它停在某句代码,比如p->a这句代码,这个时侯指针p的值的无效的,我分析之后发现p的使用上没有问题,赋值啊什么的都没有问题,最大的可能性就是在程序的其他地方越界存取了,把p的值给改了,也就是说应该是其他地方导致这里出错的,而我又不知道到底是什么地方越界存取导致的,程序里有很多地方都用到内存的分配,要怎么办啊,有什么好的调试方法吗,我就快疯了!
调试欢乐多
如果不可调试的话,那就只能用SEH来让程序崩溃前些dump文件,然后用windbg来分析崩溃前程序的调用堆栈了
如果还不行,那你只有向上帝祈祷,希望程序能够运行的久一点了
typedef struct list *List;struct list {
void *x;
List link;
};List append(void *x, List list) {
List p; p = (List)allocate(sizeof(*p));
if (list) {
p->link = list->link;
list->link = p;
} else
p->link = p;
p->x = x;
return p;
}
是这么用的:
List l = NULL;
l = append(x,l);
上面的代码很清楚了,通过这种方法调用可以确保它一定是循环链表,但是某次异常时居然发现该链表不是循环链表了,最后一个节点的link域为NULL,但是程序中没有任何一个地方是将link域赋值为NULL的,所以我可以确定一定是其他地方导致的.
还有每次异常停止的代码都不一样,这个很头疼,如果每次异常时,导致异常的语句都是同一句,那还好办,现在都不知道要在哪里设断点,因为不知道会在哪里异常?
那就尝试下 用 Visual leak detected 来看看能否检测出来,而且你的出错的地方,每次都不一定相同,这个比较纠结。。