求教:memcpy导致程序崩溃?有dump分析文件.

roger_77 2011-12-06 02:22:26

运行环境:Windows Server 2003
程序类型:VC++2008 SP1,MFC DLL,非托管.


使用Adplus捕获了进程非正常退出,Crash产生了dump文件.


windbg加载dump文件如下:

Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [D:\Controlsys_vc9\PID-16736__NETCORE.EXE__2nd_chance_AccessViolation__full_3af4_2011-12-02_11-47-17-671_4160.dmp]
User Mini Dump File with Full Memory: Only application data is available

Comment: '2nd_chance_AccessViolation_exception_in_NETCORE.EXE_running_on_IBM'
Symbol search path is: D:\Controlsys_vc9;D:\symbolMyApp;d:\symbolcache;srv*d:\symbolcache*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows Server 2003 Version 3790 (Service Pack 2) MP (4 procs) Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Machine Name:
Debug session time: Fri Dec 2 11:47:17.000 2011 (GMT+8)
System Uptime: 31 days 9:22:39.730
Process Uptime: 0 days 0:49:47.000
................................................................
............
Missing image name, possible paged-out or corrupt data.
Loading unloaded module list
.Missing image name, possible paged-out or corrupt data.
....
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(4160.2cd0): Access violation - code c0000005 (first/second chance not available)
eax=667d0418 ebx=66bef1b8 ecx=000000df edx=00000000 esi=667d009c edi=3a165020
eip=7855ab1a esp=66beeec8 ebp=66beeed0 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206
msvcr90!memcpy+0x5a:
7855ab1a f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

=================
!analyze -v
执行分析命令后显示如下:

FAULTING_IP:
msvcr90!memcpy+5a [f:\dd\vctools\crt_bld\SELF_X86\crt\src\INTEL\memcpy.asm @ 188]
7855ab1a f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 7855ab1a (msvcr90!memcpy+0x0000005a)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000001
Parameter[1]: 3a165020
Attempt to write to address 3a165020

DEFAULT_BUCKET_ID: INVALID_POINTER_WRITE

PROCESS_NAME: NetCore.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"

EXCEPTION_PARAMETER1: 00000001

EXCEPTION_PARAMETER2: 3a165020

WRITE_ADDRESS: 3a165020

FOLLOWUP_IP:
msvcr90!memcpy+5a [f:\dd\vctools\crt_bld\SELF_X86\crt\src\INTEL\memcpy.asm @ 188]
7855ab1a f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

NTGLOBALFLAG: 0

APPLICATION_VERIFIER_FLAGS: 0

FAULTING_THREAD: 00002cd0

PRIMARY_PROBLEM_CLASS: INVALID_POINTER_WRITE

BUGCHECK_STR: APPLICATION_FAULT_INVALID_POINTER_WRITE

LAST_CONTROL_TRANSFER: from 004d96e1 to 7855ab1a

STACK_TEXT:
66beeed0 004d96e1 3a165020 667d009c 0000037c msvcr90!memcpy+0x5a [f:\dd\vctools\crt_bld\SELF_X86\crt\src\INTEL\memcpy.asm @ 188]
66beefcc 004da268 fbe0fea8 0afce1d0 66bef1b8 NetCore!MACROLAND::CVideoBuffer2::WriteDataBlockInBuffer+0x181 [e:\work\netcore_vc9\src\videobuffer.cpp @ 403]
66bef150 0046a255 66bef1b8 fbe0e010 0afce318 NetCore!MACROLAND::CVideoBuffer2::BufferDataBlock+0x248 [e:\work\netcore_vc9\src\videobuffer.cpp @ 295]
66bef188 0046a86f 00000000 66bef1b8 00000001 NetCore!MACROLAND::CStreamListManager::BufferStream+0xa5 [e:\work\netcore_vc9\src\streaminfo.cpp @ 1458]
66bef1e4 06a61823 66bef20c c2c2fc38 667d008c NetCore!MACROLAND::CStreamListManager::DisposeStreamData+0xaf [e:\work\netcore_vc9\src\streaminfo.cpp @ 1304]
66bef23c 06a7c35f 00000000 0baa5a60 0000037c VM2000Client!MACROLAND::StreamDirectDataCallBack+0x183 [e:\projects\workingcode\devicedriver\vmclientdriver\devicecode.cpp @ 2685]
66bef384 06a7cb24 667d008c 66bef80c 66bef814 VM2000Client!CVideoChannel::ProcessRecvData+0x15f [e:\projects\workingcode\devicedriver\vmclientdriver\videochannel.cpp @ 413]
66befeec 7867a6bb 667d0020 c091aca4 00000000 VM2000Client!CVideoChannel::VideoProc+0x2f4 [e:\projects\workingcode\devicedriver\vmclientdriver\videochannel.cpp @ 854]
WARNING: Stack unwind information not available. Following frames may be wrong.
66beff74 78543433 1bc6f108 fa9161dc 00000000 mfc90+0x9a6bb
66beffac 785434c7 00000000 66beffec 7c82482f msvcr90!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
66beffb8 7c82482f 0d77c328 00000000 00000000 msvcr90!_threadstartex+0x69 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
66beffec 00000000 7854345e 0d77c328 00000000 kernel32!BaseThreadStart+0x34


FAULTING_SOURCE_CODE:
No source found for 'f:\dd\vctools\crt_bld\SELF_X86\crt\src\INTEL\memcpy.asm'


SYMBOL_STACK_INDEX: 0

SYMBOL_NAME: msvcr90!memcpy+5a

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: msvcr90

IMAGE_NAME: msvcr90.dll

DEBUG_FLR_IMAGE_TIMESTAMP: 488ef6c5

STACK_COMMAND: ~624s; .ecxr ; kb

FAILURE_BUCKET_ID: INVALID_POINTER_WRITE_c0000005_msvcr90.dll!memcpy

BUCKET_ID: APPLICATION_FAULT_INVALID_POINTER_WRITE_msvcr90!memcpy+5a

WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/NetCore_exe/1_4_0_3/4ed70b9b/msvcr90_dll/9_0_30729_1/488ef6c5/c0000005/0003ab1a.htm?Retriage=1

Followup: MachineOwner
---------

程序经常在启动后运行1个小时左右崩溃退出,崩溃时间不定.
得到的dump完全转储文件有900MB多,但是windbg分析后,进程内的大部分对象无法获取其成员变量崩溃当时的值,显示为“<Memory access error>”。

本人能力有限,一直找不出崩溃的真正原因所在,希望此来请教高人指点一二。
万分谢谢!



...全文
2272 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-12-06
  • 打赏
  • 举报
回复
你都确定是memcpy的问题,然后看看你memcpy处的代码不就好了
shen_wei 2011-12-06
  • 打赏
  • 举报
回复
上你的代码更好些吧。。。这样看着更好些吧!!!
roger_77 2011-12-06
  • 打赏
  • 举报
回复
memcpy,是否线程安全的?
比如:一个缓冲区,一个线程正在通过memcpy读取缓冲数据,另一个线程通过memcpy往缓冲写入数据。

分数不够还可以加。请各位多多指点。谢谢
roger_77 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaoguailong3 的回复:]

memcpy长度超过,或者cpy的指针是空指针的话,就是爆掉,注意看下这个函数
[/Quote]

mepcpy参数的值,有两个值,无法查看,在windbg中显示为“<Memory access error>”
roger_77 2011-12-06
  • 打赏
  • 举报
回复
这个程序的工程属性中,已经选择:
“调试信息格式”中选了的“程序数据库(/Zi)”
“生成调试信息”中选了的“是(/DEBUG)”
“生成程序数据库文件”中,填了“$(TargetDir)$(TargetName).pdb”

xiaoguailong3 2011-12-06
  • 打赏
  • 举报
回复
memcpy长度超过,或者cpy的指针是空指针的话,就是爆掉,注意看下这个函数
roger_77 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chenjiawei007 的回复:]

访问违例,看你描述,内存泄露或者越界的可能性比较大。这是你的程序吗? release版本中debug选项中是否使用了程序集,不勾选dump文件分析出来的变量值是错误的。
[/Quote]

这是本人的程序,没用到程序集,这是非托管的VC程序。

不勾选dump文件分析出来的变量值是错误的?
请问这指什么意思?
roger_77 2011-12-06
  • 打赏
  • 举报
回复
STACK_TEXT:
66beeed0 004d96e1 3a165020 667d009c 0000037c msvcr90!memcpy+0x5a [f:\dd\vctools\crt_bld\SELF_X86\crt\src\INTEL\memcpy.asm @ 188]
66beefcc 004da268 fbe0fea8 0afce1d0 66bef1b8 NetCore!MACROLAND::CVideoBuffer2::WriteDataBlockInBuffer+0x181 [e:\work\netcore_vc9\src\videobuffer.cpp @ 403]

只能从上面看出,memcpy函数的三个参数地址分别为:3a165020 667d009c 0000037c
chenjiawei007 2011-12-06
  • 打赏
  • 举报
回复
访问违例,看你描述,内存泄露或者越界的可能性比较大。这是你的程序吗? release版本中debug选项中是否使用了程序集,不勾选dump文件分析出来的变量值是错误的。
roger_77 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jennyvenus 的回复:]

memcpy里面使用的长度是-1,这应该是recv函数的返回值弄的吧,小于0就出错了。
[/Quote]

请问:
从哪里可以看出memcpy里面使用的长度是-1?
oyljerry 2011-12-06
  • 打赏
  • 举报
回复
66beefcc 004da268 fbe0fea8 0afce1d0 66bef1b8 NetCore!MACROLAND::CVideoBuffer2::WriteDataBlockInBuffer+0x181 [e:\work\netcore_vc9\src\videobuffer.cpp @ 403]
66bef150 0046a255 66bef1b8 fbe0e010 0afce318 NetCore!MACROLAND::CVideoBuffer2::BufferDataBlock+0x248 [e:\work\netcore_vc9\src\videobuffer.cpp @ 295]
66bef188 0046a86f 00000000 66bef1b8 00000001 NetCore!MACROLAND::CStreamListManager::BufferStream+0xa5 [e:\work\netcore_vc9\src\streaminfo.cpp @ 1458]
66bef1e4 06a61823 66bef20c c2c2fc38 667d008c NetCore!MACROLAND::CStreamListManager::DisposeStreamData+0xaf [e:\work\netcore_vc9\src\streaminfo.cpp @ 1304]


--- 主要看这些操作内存的地方,应该是指针越界等问题
用户 昵称 2011-12-06
  • 打赏
  • 举报
回复
memcpy里面使用的长度是-1,这应该是recv函数的返回值弄的吧,小于0就出错了。
roger_77 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 waistcoat06 的回复:]

在出问题的机器上装个Windbg,当程序崩溃时自动抓到,挂上PDB文件就好查了
[/Quote]

已经在出问题的机器上装了windbg,且抓到了dump,请问上面的分析显示stack call.
WaistCoat06 2011-12-06
  • 打赏
  • 举报
回复
在出问题的机器上装个Windbg,当程序崩溃时自动抓到,挂上PDB文件就好查了

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧