问题描述:
       
       TCHAR sztestBuf[56] =  {  0 };
int d=20;
_stprintf(sztestBuf,_T("%s"),d);用这段代码测试crash,生成dump文件了,通过windbg使用命令!analyze -v 却无法定位到代码行。请高手指教,不甚感激!!以下是分析得到的结果。问题是如何才能定位到代码出错的地方?难道如果调用了crt库里函数,就无法定位到代码行了??0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
********************************************************************************** ERROR: Symbol file could not be found.  Defaulted to export symbols for kernel32.dll - 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ole32.dll - 
Map C:\WINDOWS\system32\user32.dll:
  Image region 60400:29400 does not fit in mapping
*** WARNING: Unable to verify timestamp for user32.dllFAULTING_IP: 
msvcr90!_woutput_l+94c [f:\dd\vctools\crt_bld\self_x86\crt\src\output.c @ 1624]
78576b6a 66833800        cmp     word ptr [eax],0EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 78576b6a (msvcr90!_woutput_l+0x0000094c)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000014
Attempt to read from address 00000014DEFAULT_BUCKET_ID:  APPLICATION_FAULTPROCESS_NAME:  5see.exeERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"READ_ADDRESS:  00000014 BUGCHECK_STR:  ACCESS_VIOLATIONLAST_CONTROL_TRANSFER:  from 00000000 to 00000000STACK_TEXT:  
00680063 00000000 00000000 00000000 00000000 0x0
STACK_COMMAND:  ~0s; .ecxr ; kbFOLLOWUP_IP: 
msvcr90!_woutput_l+94c [f:\dd\vctools\crt_bld\self_x86\crt\src\output.c @ 1624]
78576b6a 66833800        cmp     word ptr [eax],0FAULTING_SOURCE_CODE:  
No source found for 'f:\dd\vctools\crt_bld\self_x86\crt\src\output.c'
SYMBOL_NAME:  msvcr90!_woutput_l+94cFOLLOWUP_NAME:  MachineOwnerMODULE_NAME: msvcr90IMAGE_NAME:  msvcr90.dllDEBUG_FLR_IMAGE_TIMESTAMP:  4a594c79FAULTING_THREAD:  00000ab4FAILURE_BUCKET_ID:  ACCESS_VIOLATION_msvcr90!_woutput_l+94cBUCKET_ID:  ACCESS_VIOLATION_msvcr90!_woutput_l+94cFollowup: MachineOwner

解决方案 »

  1.   

    难道如果调用了crt库里函数,就无法定位到代码行了??
    当然不能定位到crt库里的函数的代码行,只能定位到调用crt库函数的代码行_stprintf(sztestBuf,_T("%s"),d);
    为什么会崩溃啊
      

  2.   


    比如我在函数
    void cmyclass::test()
    {
        TCHAR sztestBuf[56] = { 0 };
        int d=20;
        _stprintf(sztestBuf,_T("%s"),d);
    }按道理应该是可以定位到test函数的啊,但现在定位不到呢。如果连test函数都定位不到,那分析dump文件根本就没意义了嘛。
      

  3.   

    应该定位到_stprintf(sztestBuf,_T("%s"),d);这一行的
    符号文件目录是否设置正确已经符号文件本身是否正确?
      

  4.   

    感谢回复,pdb目录设置正确了,而且我的pdb也是正确的啊。有点郁闷。
      

  5.   

    说明下,我是在一个动态库中调用的,该动态库的pdb也是正确的。
      

  6.   

    怎么生成dump文件的?
    我用crashrpt,能正确定位到出错行
      

  7.   

    _stprintf(sztestBuf,_T("%s"),d);
    这句本来就有问题吧,s改成d。如果是s,编译器以为d是某个字符串的首地址,但是你的d值为20,作为地址来使用的话可不就访问越界了。
      

  8.   


    我也是使用crashreport生成dump文件的,我设置的符号文件路径如下:
    SRV*c:\temp*http://msdl.microsoft.com/download/symbols;D:\pdbd:\pdb是我自己的pdb文件存放路径,主页设置没问题吧??请指教!
      

  9.   

    不知道为啥堆栈是乱的,而且只有一条,像这样的STACK_TEXT:   
    00680063 00000000 00000000 00000000 00000000 0x0我自己写了测试程序也可以定位到错误的,因为发布的程序动态库比较多,不知道为什么用 !analyze -v分析堆栈就像上面这样了。哪位高手指点下啊。