我用 Delphi7 编写了一个软件,现在这个软件运行几天后退出时,会出现“KERNEL32.DLL 中导致无效页错误”,在调试状态,会进入到不是我的源程序里面,都是一些汇编代码?请问在这种情况下,改如何判断在哪里出错了?

解决方案 »

  1.   

    详细错误是:
    "在 015f:bff881b8 的模块
     KERNEL32.DLL 中导致无效页错误。
    Registers:
    EAX=c0030120 CS=015f EIP=bff881b8 EFLGS=00010216
    EBX=095fff58 SS=0167 ESP=094fffac EBP=09500018
    ECX=095001cc DS=0167 ESI=81749fdc FS=2b37
    EDX=bff768d5 ES=0167 EDI=095001f4 GS=0000
    Bytes at CS:EIP:
    53 56 57 8b 30 83 7d 10 01 8b 4e 38 89 4d f8 75 
    Stack dump:"可是用编译 .map 文件后没有 bff881b8 附近的代码。
      

  2.   

    可能是退出时调用API出错,释放内存出错,可能是你的程序在运行过程中的某些操作已导致内存空间混乱
      

  3.   

    那该如何查找呢?我知道VC里面可以通过编译 .map文件的方式查找,可是DELPHI下该如何查找此类错误呢?另外:我的程序也不是说每次都会出错,而是运行比较长的一段时间后会此错。
      

  4.   

    不是内存泄漏。是动态卸载dll时出现问题。
      

  5.   

    是内存泄漏,我遇见过,主要是由于程序中有一些内存没有及时释放造成的,而在Windows系统中,一个进程在销毁时,要释放掉所有内存的,所以这时就导致了上面的错误,请楼主好好找找吧,我上次找了一个星期
      

  6.   

    我这边是这样的:程序在Win2K、WinXP、Win2003上执行均没有问题;在Win98下如果连续执行几天后,程序退出时有时会出现此问题。我仔细检查了程序退出代码,后来发现是程序退出时调用 FreeLibrary 时引起,按说也就是这个dll在退出时有问题,可是我这个dll功能极其简单,根本不存在内存泄漏的问题。现在我在程序退出时把 FreeLibrary 语句删除(由操作系统帮我释放dll)后,没有再出现这个问题。 我也百思不得其解。另外我的程序是在 Win2K 上编译的。