我在用那个可以代替Winsock控件的CSocketMaster类编写一个程序,好不容易解决了支持中文和支持外网的问题,结果又出现一个头疼的问题:在VB的IDE中调试时完全正常,但是编译为exe运行时出现错误被windows的数据执行保护(DEP)关闭--先是弹出DEP的窗口,点确定后我的应用程序弹出那个著名的“遇到问题需要关闭”的窗口,点确定后程序退出,没有更详细的错误信息,估计是对限制的内存执行了写操作。由于调试时正常,所以我现在连什么地方出错的都不知道,我尝试在运行时把可能出错的过程名称写入log文件以供分析,但是根本写不进去,可能是这些过程之间的执行时间间隔太小的原因。大家给想想办法,这样的错误应该怎么来调试啊?

解决方案 »

  1.   

    还不确定是什么问题,怪就怪在调试时正常,而编译后每次运行都出错。
    那个类模块太长了,看起来都很吃力,调试就更没有头绪了,现在我正把执行到的类中每个sub和function都print到窗体上,看看到底能执行到哪一步再说,唉!这可是个体力活啊-_-!!
      

  2.   

    设置vb菜单tools/options 在general中选中break on all errors试一试,另外不知道你打了vb的sp6没有,那也有关系。
      

  3.   

    谢谢,设置发生所有错误时中断也不行,因为我的代码在IDE里面调试时根本不出现任何错误,另外我用的VB6也已经打完sp6补丁。
    现在已经知道是在调用完类的connect方法以后马上出现了这个错误,应该就是这个connect的问题,因为我是在一个timer中调用connect的,调用完以后一段时间内根本没有其他操作,但是通过我print出来的东西来看,这个connect已经执行完了,不知道具体是那个语句导致了这个错误。
      

  4.   

    最新进展:用这个类模块另写了一个测试程序,只保留关键代码,执行同样的connect操作,编译后却怎么也不出现那个错误了,看来是我的程序中其他东西与这个类模块有冲突,明天再慢慢调试吧,睡觉去了。
      

  5.   

    IDE里面调试时根本不出现任何错误,正是有可能是因为未设置“发生所有错误时中断”。
      

  6.   

    DEP的话,是CPU的禁止执行功能......这功能会把某部分的内存设置为不可执行,因此对于注入或溢出的内存块,是无法执行的.那个类模块我也有,不过我的程序正常.你试一下把CPU的DEP功能设置为"仅为关键程序启用"看看我打开这个功能时,连CS都不能打......而且这个类模块里使用了内嵌汇编技术,估计在受限的操作范围以内.
      

  7.   


    我当前的DEP设置就是"仅为基本windows程序和服务启用DEP”,而且今早晨我又在办公室的机子上试验了一下,完全相同的系统版本和DEP设置,连杀毒软件也是相同的,竟然不出现错误了,这两台机子最明显的差别就是配置,我家里内存是2G的,而办公室的是256M的,难道是这个原因?
      

  8.   

    我的系统版本是XP sp3,DEP设置里面仅有“仅为基本windows程序和服务启用DEP”和“为除下列程序之外的所有程序和服务启用DEP”两项啊,老马说的"仅为关键程序启用"是不是就是第一项?还是另外的系统版本中有"仅为关键程序启用"这么一项啊?
      

  9.   

    DEP 设置中选“为除下列选定程序之外的所有程序和服务启用DEP”,然后将你的 exe 添加到列表中。
      

  10.   

    哪位懂汇编的朋友给看看,红色的就是出错的指令:00172CD1  nop              
    00172CD2  jae         00172CCE 
    00172CD5  xchg        eax,ebx 
    00172CD6  jae         00172C93 
    00172CD9  nop              
    00172CDA  jae         00172CCA 
    00172CDD  jbe         00172D43 
    00172CDF  jae         00172C65 
    00172CE1  cwde             
    00172CE2  jae         00172CF0 
    00172CE5  xchg        eax,ecx 
    00172CE6  jae         00172CF4 
    00172CE9  xchg        eax,ecx 
    00172CEA  jae         00172C87 
    00172CED  xchg        eax,esp 
    00172CEE  jae         00172CE3 
    00172CF1  xchg        eax,esp 
    00172CF2  jae         00172D4D 
    00172CF5  xchg        eax,esp 
    00172CF6  jae         00172CF9 
    00172CF9  add         byte ptr [eax],al 
    00172CFB  add         byte ptr [ebx],dh 
    00172CFD  xchg        eax,ebp 
    00172CFE  jae         00172CB1 
    00172D01  xchg        eax,edx 
    00172D02  jae         00172CEE 
    00172D05  xchg        eax,esi 
    00172D06  jae         00172D2B 
    00172D09  xchg        eax,edi 
    00172D0A  jae         00172D12 
    00172D0D  xchg        eax,ebx 
    00172D0E  jae         00172D29 
    00172D11  add         byte ptr [esi],dl 
    00172D13  add         byte ptr [ecx+eax],ah 
    00172D16  or          al,byte ptr [eax] 
    00172D18  pop         eax            
    00172D19  push        eax  
    00172D1A  push        eax  
    00172D1B  push        ebp  
    00172D1C  mov         ebp,esp 
    00172D1E  push        edi  
    00172D1F  push        ebx  
    00172D20  push        ecx  
    00172D21  push        edx  
    00172D22  xor         eax,eax 
    00172D24  jmp         00172D34 
    00172D26  call        01172D2B 
    00172D2B  cmp         eax,2 
    00172D2E  je          00172D52 
      

  11.   

    对了,不如你试下我这里这个版本的,是封装为一个与WINSOCK控件一模一样的自定义控件了,应该比较方便吧.MAIL给我....HOHO.
      

  12.   

    当时eax的值是2147348480
    ,谢谢老马!
      

  13.   

    2147348480是7FFDF000,你在进程挂起时用冰刃看看这段内存里都是些什么东西另,MAIL已发出,请查收~~
      

  14.   

    谢谢老马的代码,你发给我的代码中类模块和那个辅助模块跟我现在用的是一样的,但是在调试你的代码时出现问题,缺少声明,我把你注释掉的那些API声明全部恢复以后也不行,有个明明已经声明过的api_GetModuleHandle也提示找不到,因此自定义控件也添加不到窗体上去,而且我不大希望带上一个自定义控件,所以也就没再继续调试。
    你说的用冰刃查看内存,我看不懂啊-_-!!
    不过既然我那个简单的测试程序编译后没问题,说明这个类模块本身应该没什么问题,但是可以肯定问题就出在这个类模块身上,因为换成winsock控件后问题就没有了,所以最大的可能是这个类模块跟我的应用程序中的某些东西有冲突,我再用排除法一点点减少代码试试看。
      

  15.   

    NND,终于找到原因了,真是不可思议,竟然是工程属性中产品名称、公司名称、版权、描述等这些东西的问题,我随便改了一下,编译后就没任何问题了。为了再次证明确实是这个原因,我恢复了原来的工程信息,编译运行后同样的问题又出现了,哈哈!
    虽然找到了原因,但是打死我也弄不明白这跟那个执行connect方法造成内存写错误有什么联系,VB6真TMD会捉弄人,简直不按路来啊!
    谢谢大家的关注和帮助,结贴!
      

  16.   

    哇哈哈,我忘了我的API全部都用类库声明了~~~那样的话可以在大量调用API时省些开销.不好意思:)