现在有个程序,代码比较多,而且又不是很熟悉代码(之前写的,过了很久了),现在发现程式运行时会弹出一个异常,调试进去之后,它停在某句代码,比如p->a这句代码,这个时侯指针p的值的无效的,我分析之后发现p的使用上没有问题,赋值啊什么的都没有问题,最大的可能性就是在程序的其他地方越界存取了,把p的值给改了,也就是说应该是其他地方导致这里出错的,而我又不知道到底是什么地方越界存取导致的,程序里有很多地方都用到内存的分配,要怎么办啊,有什么好的调试方法吗,我就快疯了!

解决方案 »

  1.   

    如果可调试的话,那你让它崩掉后进入掉“调用堆栈”,看看调用结果
    如果不可调试的话,那就只能用SEH来让程序崩溃前些dump文件,然后用windbg来分析崩溃前程序的调用堆栈了
    如果还不行,那你只有向上帝祈祷,希望程序能够运行的久一点了
      

  2.   

    内存泄露的话,可以使用Visual leak detected来检查,或者直接使用_CrtDumpMemoryLeaks()
      

  3.   

    这么说吧我有个循环链表,每次调用append来添加新的节点,
    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的,所以我可以确定一定是其他地方导致的.
    还有每次异常停止的代码都不一样,这个很头疼,如果每次异常时,导致异常的语句都是同一句,那还好办,现在都不知道要在哪里设断点,因为不知道会在哪里异常?
      

  4.   


    那就尝试下 用 Visual leak detected 来看看能否检测出来,而且你的出错的地方,每次都不一定相同,这个比较纠结。。