一个TCP服务器程序, 在10个客户端疯狂访问的情况下, 五、六分钟出现非法操作,跟踪发现出在memcpy()函数内部,我不懂汇编,请帮分析一下是什么原因。memcpy的三个参数应该是没有问题的。程序停在倒数第二行上。--- intel\memcpy.asm --------------------------------------------------------------------------
memcpy:
0040ADC0 push ebp
0040ADC1 mov ebp,esp
0040ADC3 push edi
0040ADC4 push esi
0040ADC5 mov esi,dword ptr [src]
0040ADC8 mov ecx,dword ptr [count]
0040ADCB mov edi,dword ptr [dst]
0040ADCE mov eax,ecx
0040ADD0 mov edx,ecx
0040ADD2 add eax,esi
0040ADD4 cmp edi,esi
0040ADD6 jbe CopyUp (0040ade0)
0040ADD8 cmp edi,eax
0040ADDA jb CopyDown (0040af58)
CopyUp:
0040ADE0 test edi,3
0040ADE6 jne CopyLeadUp (0040adfc)
0040ADE8 shr ecx,2
0040ADEB and edx,3
0040ADEE cmp ecx,8
0040ADF1 jb CopyUnwindUp (0040ae1c)
0040ADF3 rep movs dword ptr [edi],dword ptr [esi]
0040ADF5 jmp dword ptr [edx*4+40AF08h]
memcpy:
0040ADC0 push ebp
0040ADC1 mov ebp,esp
0040ADC3 push edi
0040ADC4 push esi
0040ADC5 mov esi,dword ptr [src]
0040ADC8 mov ecx,dword ptr [count]
0040ADCB mov edi,dword ptr [dst]
0040ADCE mov eax,ecx
0040ADD0 mov edx,ecx
0040ADD2 add eax,esi
0040ADD4 cmp edi,esi
0040ADD6 jbe CopyUp (0040ade0)
0040ADD8 cmp edi,eax
0040ADDA jb CopyDown (0040af58)
CopyUp:
0040ADE0 test edi,3
0040ADE6 jne CopyLeadUp (0040adfc)
0040ADE8 shr ecx,2
0040ADEB and edx,3
0040ADEE cmp ecx,8
0040ADF1 jb CopyUnwindUp (0040ae1c)
0040ADF3 rep movs dword ptr [edi],dword ptr [esi]
0040ADF5 jmp dword ptr [edx*4+40AF08h]
主要考虑:仔细地设计多线程下的同步问题. 考虑使用引用计数的机制. 使用内存池也能减少这样的错误