我的程序有时候会异常,但是在我本机运行却没有遇到过,我编译的时候是已经使用了静态编译,异常的时候报错我的内存地址也不是应用程序的,而是什么“0x1000D284指令引用的内存0x0000004不可写”。程序是使用的VC6加sql 2005 数据库做的,这个问题困扰我很久了,那位高人能给个好的高效查错解决方案?

解决方案 »

  1.   

    感觉不是本身程序中的代码错误,而是调用windows底层的某些库导致的错误。
      

  2.   

    把你工程产生map文件那个复选项选中,会产生出一个.map的文件,再根据你报错的地址去定位你的程序异常所在的行。如何根据map文件定位行可以上网查。
      

  3.   

    我工程生成了map文件,但是那个地址根本就不是程序里面代码的地址啊。
      

  4.   

    用 vs运行debug 模式,然后等他报错,然后仔细看调用堆栈
      

  5.   

    用 vs2003 以上版本有远程调试,其实 VC6 好像也有,不过没用过,可能不好用,
    vs2003 是可以的,百度 "vs2003 远程调试",
      

  6.   

    我工程生成了dump文件,报错的地址不是我程序的啊,是另外一个库
    大侠些救救我:002>  !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Exception Analysis                                   *
    *                                                                             *
    *******************************************************************************
    FAULTING_IP: 
    DJAcsAPI+d284
    1000d284 894a04           mov     [edx+0x4],ecxEXCEPTION_RECORD:  ffffffff -- (.exr ffffffffffffffff)
    ExceptionAddress: 1000d284 (AcsAPI+0x0000d284)
       ExceptionCode: c0000005 (Access violation)
      ExceptionFlags: 00000000
    NumberParameters: 2
       Parameter[0]: 00000001
       Parameter[1]: 00000004
    Attempt to write to address 00000004DEFAULT_BUCKET_ID:  APPLICATION_FAULTPROCESS_NAME:  Plus.exeWRITE_ADDRESS:  00000004 BUGCHECK_STR:  ACCESS_VIOLATIONLAST_CONTROL_TRANSFER:  from 1000b946 to 1000d284STACK_TEXT:  
    WARNING: Stack unwind information not available. Following frames may be wrong.
    0177fefc 1000b946 00971f68 0000003f 014a0300 AcsAPI+0xd284
    00000098 00000000 00000000 00000000 00000000 AcsAPI+0xb946
    FOLLOWUP_IP: 
    AcsAPI+d284
    1000d284 894a04           mov     [edx+0x4],ecxFOLLOWUP_NAME:  MachineOwnerSYMBOL_NAME:  AcsAPI+d284MODULE_NAME:  AcsAPIIMAGE_NAME:  AcsAPI.dllDEBUG_FLR_IMAGE_TIMESTAMP:  4ab82b9cSTACK_COMMAND:  .ecxr ; kbBUCKET_ID:  ACCESS_VIOLATION_AcsAPI+d284Followup: MachineOwner
    ---------
      

  7.   

    原有程序的pdb拷贝过来加载dmp文件调试,主要是看堆栈,一般都会定位到代码行的,要程序生成时对应的pdb之类的文件,还有注意观察下线程堆栈,不一定是主线程导致的错误,你直接在堆栈上是看不到的。
      

  8.   

    AcsAPI.dll和Plus.exe这些都是你们自己的应用?异常地址给你了啊,0x0000d284,AcsAPI.dll如果有源码你生成MAP定位到那行去看看。
      

  9.   

    Plus.exe 是自己的程序AcsAPI.dll是别的动态库 没有源码的。
      

  10.   

    to sangermax :对dump文件调试不是很清楚,我现在用的是VC6可以调试dump吗?有哪些有关于调试dump文件的指引资料?
      

  11.   

    可以查看那个抛出来的地址所属的函数以及所在的源文件和行,如果你有AcsAPI.dll和Plus.exe的调试版本可以试下下面的命令,
    objdump -d .dll or .exe也可以是addr2line -f -e .dll or .exe一定要是调试版本才能看得到,因为你的.exe或.dll中有调试段信息。
      

  12.   

    STACK_TEXT:  
     WARNING: Stack unwind information not available. Following frames may be wrong.
     0177fefc 1000b946 00971f68 0000003f 014a0300 AcsAPI+0xd284 这里的0xd284表示什么啊?是不是我程序的内存地址?能不能通过map文件找到出错的行数??
      

  13.   

    使用windbg调试dump会好一些。vc尤其低版本对dump调试支持不太好。需要你生成pdb文件,并配置好windows的符号信息。
      

  14.   

    能通过pdb调试,就不要使用map文件。pdb包含的调试信息比map丰富的多,map有用的信息只有函数偏移地址,缺少变量类型信息等等。
      

  15.   

    生成.dmp文件,根据.dmp文件进行调试
      

  16.   

    你是说在编译时候生成dmp文件吗?还是出问题的时候生成的dump文件?
      

  17.   


    生成dump的工具有不少,可以用windbg,debugdiag,adplus等等。建议你用windbg,当遇到异常,windbg会中断下来,你配置好pdb路径,其实不用抓dump,直接就可以调试。如果在出问题的机器上不方便调试,可以使用windbg抓取dump,用命令:.dump /ma yourdumpfile拷贝dump文件到你开发机器上配置好pdb调试。
      

  18.   


    addr2line 0xd284 -f -e ACSAPI.dll
    你要保证你的ACSAPI.dll中有调试段信息。