求助:WIN7下测试应用程序(IOCP)出现异常代码:0xC00000005,错误模块: ntdll.dll,异常偏移:0x00032239

Qiaorui 2013-03-02 07:01:44
WIN7事件查看器应用程序错误信息:

----------------------------------------------------------------------
错误应用程序名称: iocpsys.exe,版本: 0.0.0.0,时间戳: 0x512db979
错误模块名称: ntdll.dll,版本: 6.1.7601.17514,时间戳: 0x4ce7b96e
异常代码: 0xc0000005
错误偏移量: 0x00032239
错误进程 ID: 0x2eefc
错误应用程序启动时间: 0x01ce14be573d7b3c
错误应用程序路径: D:\Program Files\Projects\iocpsys\mingw5\iocpsys.exe
错误模块路径: C:\Windows\SYSTEM32\ntdll.dll
报告 ID: 0a8582fd-80b2-11e2-8b1b-c89cdc5df9ca
----------------------------------------------------------------------

WIN7环境(多核)下测试,导致运行崩溃的都是以上错误。因为异常偏移(0x00032239)<基地址(0x00400000),所以,似乎没有办法,也不知道如何根据.map文件确定错误代码行号。

WINXP环境下测试,多核机器中,不定时会出现读写0x00000010错误,老机器没有这个错误。

好像WIN7及以后,错误提示与WINXP不一致了,也不知道这两个环境下的错误是否有关联?大概是什么原因引起的,应该如何着手解决?

以下是WIN7环境下,appcrashview分析的错误信息:

----------------------------------------------------------------------
Version=1
EventType=APPCRASH
EventTime=130066561397209095
ReportType=2
Consent=1
ReportIdentifier=72e22686-82cc-11e2-8b1b-c89cdc5df9ca
IntegratorReportIdentifier=72e22685-82cc-11e2-8b1b-c89cdc5df9ca
Response.type=4
Sig[0].Name=应用程序名
Sig[0].Value=iocpsys.exe
Sig[1].Name=应用程序版本
Sig[1].Value=0.0.0.0
Sig[2].Name=应用程序时间戳
Sig[2].Value=5130d950
Sig[3].Name=故障模块名称
Sig[3].Value=ntdll.dll
Sig[4].Name=故障模块版本
Sig[4].Value=6.1.7601.17514
Sig[5].Name=故障模块时间戳
Sig[5].Value=4ce7b96e
Sig[6].Name=异常代码
Sig[6].Value=c0000005
Sig[7].Name=异常偏移
Sig[7].Value=00032239
DynamicSig[1].Name=OS 版本
DynamicSig[1].Value=6.1.7601.2.1.0.768.2
DynamicSig[2].Name=区域设置 ID
DynamicSig[2].Value=2052
DynamicSig[22].Name=其他信息 1
DynamicSig[22].Value=0a9e
DynamicSig[23].Name=其他信息 2
DynamicSig[23].Value=0a9e372d3b4ad19135b953a78882e789
DynamicSig[24].Name=其他信息 3
DynamicSig[24].Value=0a9e
DynamicSig[25].Name=其他信息 4
DynamicSig[25].Value=0a9e372d3b4ad19135b953a78882e789
UI[2]=D:\Program Files\Projects\iocpsys\mingw5\iocpsys.exe
UI[3]=iocpsys.exe 已停止工作
UI[4]=Windows 可以联机检查该问题的解决方案。
UI[5]=联机检查解决方案并关闭该程序
UI[6]=以后联机检查解决方案并关闭程序
UI[7]=关闭程序
LoadedModule[0]=D:\Program Files\Projects\iocpsys\mingw5\iocpsys.exe
LoadedModule[1]=C:\Windows\SYSTEM32\ntdll.dll
LoadedModule[2]=C:\Windows\system32\kernel32.dll
LoadedModule[3]=C:\Windows\system32\KERNELBASE.dll
LoadedModule[4]=C:\Windows\system32\msvcrt.dll
LoadedModule[5]=C:\Windows\system32\WS2_32.DLL
LoadedModule[6]=C:\Windows\system32\RPCRT4.dll
LoadedModule[7]=C:\Windows\system32\NSI.dll
LoadedModule[8]=C:\Windows\system32\mswsock.dll
LoadedModule[9]=C:\Windows\system32\user32.dll
LoadedModule[10]=C:\Windows\system32\GDI32.dll
LoadedModule[11]=C:\Windows\system32\LPK.dll
LoadedModule[12]=C:\Windows\system32\USP10.dll
LoadedModule[13]=C:\Windows\system32\IMM32.DLL
LoadedModule[14]=C:\Windows\system32\MSCTF.dll
LoadedModule[15]=C:\Windows\System32\wshtcpip.dll
FriendlyEventName=已停止工作
ConsentKey=APPCRASH
AppName=iocpsys.exe
AppPath=D:\Program Files\Projects\iocpsys\mingw5\iocpsys.exe
----------------------------------------------------------------------
...全文
3922 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
taoshahai 2013-05-24
  • 打赏
  • 举报
回复
错误地址是:错误偏移量: 0x00032239+ 基地址(0x400000)
lesliewang0720 2013-03-26
  • 打赏
  • 举报
回复
楼主好,最近在调OPC接口 也遇到了跟你类似的问题,创建枚举器后,客户端调用,取Next,然后程序就崩溃了。。。跳出跳出Unhandled exception at 0x76ee2d37 in OPCServer.exe: 0xC0000005: Access violation reading location 0x22d0f40. 楼主有什么建议吗?
Qiaorui 2013-03-05
  • 打赏
  • 举报
回复
引用 3 楼 CS1024 的回复:
问题出现于大量client同时断开连接时,也集中到的关闭socket和内存释放的部分,如果从代码中没有找到明显的错误,可以多从关键代码段、信号量等着手,重点看会不会导致死锁。另外,还有些BUG是由于执行顺序的问题引起的,也要注意,因为代码顺序并非就是执行顺序。
正如ls所说,昨晚上留意了关闭socket和内存释放部分代码,在关闭socket和内存释放之前,返回被关闭或释放的socket的ip和端口,这里没有进行很好的处理,导致未返回前可能已经关闭或释放。
CS1024 2013-03-05
  • 打赏
  • 举报
回复
问题出现于大量client同时断开连接时,也集中到的关闭socket和内存释放的部分,如果从代码中没有找到明显的错误,可以多从关键代码段、信号量等着手,重点看会不会导致死锁。另外,还有些BUG是由于执行顺序的问题引起的,也要注意,因为代码顺序并非就是执行顺序。
Qiaorui 2013-03-02
  • 打赏
  • 举报
回复
知道是程序的问题,问题也集中到的关闭socket和内存释放的代码,因为这个问题的出现是在进行压力测试时出现的,即很多client同时断开连接时出现的(10038、10054错误说明了问题)。只是到底是死锁引起还是其它问题,不好确定,而且异常偏移都是0x00032239,觉得比较特殊,想发贴问问有没有人遇到过类似问题,进而缩小问题代码的定位。同时也想问问大家如何调试IOCP的,借鉴一下经验。
langeldep 2013-03-02
  • 打赏
  • 举报
回复
是你自己程序的问题, 如果有源码的话, debug调试一下应该就知道了
完成端口通讯服务器(IOCP Socket Server)设计 (六)功能强大的IOCP Socket Servre模块例程源码 Copyright © 2009 代码客(卢益贵)版权所有 QQ:48092788 源码博客:http://blog.csdn.net/guestcode 一、声明 版权声明: 1、通讯模块代码版权归作者所有; 2、未经许可不得全部或部分用于任何项目开发; 3、未经许可不得部分修改后再利用源码。 免责声明: 1、 由于设计缺陷或其它Bug造成的后果,作者不承担责任; 2、未经许可的使用作者不提供任何技术支持服务。 权利和义务: 1、任何获得源码并发现Bug的个人或单位均有义务向作者反映; 2、作者保留追究侵权者法律责任的权利。 二、开发背景 部分代码由前项目分离而来,尚未有应用考验,但对于初学者学习和进阶有很大帮助。性能上尚未有定论,但应该不会令你失望。 三、功能说明 1、可以关闭Socket的Buffer; 2、可以关闭MTU(不等待MTU满才发送); 3、可以多IP或多端口监听; 4、可以重用socket(主动关闭除外); 5、可以0缓冲接收(Socket的Buffe = 0时,避免过多的锁定内存页); 6、可以0缓冲连接(客户端仅连接,不一定立即发数据); 7、可以条件编译: a、是否使用内核Singly-linked lists; b、是否使用处理线程(工作线程和处理线程分开); c、是否使用内核锁来同步链表。 8、可以实现集群服务器模式的通讯(有客户端socket); 9、可以单独设置每个连接的Data项来实现连接和Usernfo的关联; 10、每个线程有OnBegin和OnEnd,用于设置线程独立的对象(数据库会话对象); 11、可以提供详细的运行情况,便于了解IOCP下的机制,以及进行调试分析; 12、可以发起巨量连接和数据(需要硬件配置来支持)。
结构层次及相互联系 (1)、工作线程:响应连接的IO投递返回并负责投递读请求,并将IO返回结果投递给处理线程,可设定参数决定工作线程数量; (2)、处理线程:处理线程调用回调函数将信息传递给应用层或协议栈,可设定参数决定工作处理数量; (3)、看守线程:响应Accept事件调用AcceptEx,检测连接和心跳超时 ,将信息投递给工作线程,模块仅有一个看守线程。 1. 技术要求 (1)、线程同步:Lock指令、临界段; (2)、主要Socket API:WSASend、WSARecv、AcceptEx、DisconnectEx; (3)、内存管理:连接池(句柄重用)、内存池; (4)、数据0拷贝:通过内置处理线程,上层应用可以避免自建线程池及复制数据的过程。同时提供GBuf内存分配功能,应用层获得分配地址及填充数据之后亦可直接投递给内核/驱动层; (5)、数据顺序同步:同一个连接同时只有一个处理线程响应其IO事件; (6)、IO请求投递:单投递读、多投递写; (7)、0缓冲读投递:可条件编译实现,以适用大规模连接要求。 (8)、超时机制:可设置空连接(连接不发送数据)超时时间以防止DOS攻击,也可设置心跳超时时间防止网络故障导致的现有连接成为虚连接避免耗尽系统资源。 (9)、接口技术:API、回调函数、客户句柄(客户连接句柄)。 (10)、主、被动发送:不使用HASH、MAP及LIST技术,即可提供安全可靠高效的客户连接句柄,以实现服务器端主被动发送数据功能; (11)、PerHandleData的回收不以IO投递的计数器或链表来做依据但仍能安全回收,同时尽量避免在高频的读写操作时做其他无关的操作以提高读写效率。 (12)、处理线程和工作线程有着良好分工界限,繁重的工作交给处理线程完成,工作线程工作量最大限度的减少,仅响应投递返回及读投递的操作; (13)、支持AWE,模块自动识别AWE是否开启(需手动开启),“否”则使用虚拟内存机制。 2. 功能要求 (1)、多IP多端口监听,每个监听可设置不同的回调函数,以高效的区别处理数据 (2)、可设置每秒最大的连接并发量和空连接(连接不发数据)超时时间以防止DOS攻击造成的服务瘫痪、具有心跳处理(防网络异常造成的虚连接)功能 (3)、不加协议的透明传输,可适用广泛的网络通讯环境 (4)、可现实主、被动发送数据,但不会因兼顾主动发送而额外增加降低效率的工作 (5)、内置处理线程,上层应用可不必自建线程池处理数据,所有IO事件按顺序调用回调函数并可以在回调函数内直接处理数据,不必担心多线程造成的接收数据乱序的问题。 (6)、高效率的数据对应关联机制,在初次连接并根据登录数据设置每个连接对应的宿主(Owner)之后,再接收的数据即可立即获得该连接对应的宿主,而不必再做额外的查询工作,并且模块内部采用的是指针关联方式,对于长连接、主动发送的服务器系统而言是高效率的。 (7)、可兼容IPv6 3. 注意事项 因硬件环境和应用环境不同,不合理的配置会出现效率及性能上的问题,因此以下情况出现时,请务必与作者联系以确保获得更好的参数配置: (1)、连接量超过1000个的。超过的应结合具体硬件配置和网络带宽等因素综合设定运行参数。 (2)、带宽使用率超过20%的。工作线程和处理线程数量的设置也是综合考虑数据吞吐量和数据处理负载的因素来设置的,过多的线程会在调度上浪费时间,同时也应该综合考虑线程优先级别来设置工作线程和处理线程数量,两者的设置也不一定能相等。 (3)、服务器端有主动发送需求的、短连接(含网络故障造成的连接断开)出现频率高的。 压力测试工具介绍: 一、 使用G-TcpClient模块 二、 可以设定间隔时间发起大规模长、短连接 三、 可以发起密集数据包,包括即时和定时发送,1M的光纤带宽最大可以达到100K/S(单向)以上,100M本地网最大可以达到10M/S(单向)以上 四、 数据发送仅由一个独立线程但当,每点击一次Connect就创建一个线程根据当前参数发起连接。 五、 测试前提:服务器接收客户端数据后立即原样返回给客户端
最近有项目要做一个高性能网络服务器,决定下功夫搞定完成端口(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。 但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天一夜弄出了一个C#版,在这与大家分享。 一些心得体会: 1、在C#中,不用去面对完成端口的操作系统内核对象,Microsoft已经为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1。 2、我的SocketAsyncEventArgsPool类使用List对象来存储对客户端来通信的SocketAsyncEventArgs对象,它相当于直接使用内核对象时的IoContext。我这样设计比用堆栈来实现的好处理是,我可以在SocketAsyncEventArgsPool池中找到任何一个与服务器连接的客户,主动向它发信息。而用堆栈来实现的话,要主动给客户发信息,则还要设计一个结构来存储已连接上服务器的客户。 3、对每一个客户端不管还发送还是接收,我使用同一个SocketAsyncEventArgs对象,对每一个客户端来说,通信是同步进行的,也就是说服务器高度保证同一个客户连接上要么在投递发送请求,并等待;或者是在投递接收请求,等待中。本例只做echo服务器,还未考虑由服务器主动向客户发送信息。 4、SocketAsyncEventArgs的UserToken被直接设定为被接受的客户端Socket。 5、没有使用BufferManager 类,因为我在初始化时给每一个SocketAsyncEventArgsPool中的对象分配一个缓冲区,发送时使用Arrary.Copy来进行字符拷贝,不去改变缓冲区的位置,只改变使用的长度,因此在下次投递接收请求时恢复缓冲区长度就可以了!如果要主动给客户发信息的话,可以new一个SocketAsyncEventArgs对象,或者在初始化中建立几个来专门用于主动发送信息,因为这种需求一般是进行信息群发,建立一个对象可以用于很多次信息发送,总体来看,这种花销不大,还减去了字符拷贝和消耗。 6、测试结果:(在我的笔记本上时行的,我的本本是T420 I7 8G内存) 100客户 100,000(十万次)不间断的发送接收数据(发送和接收之间没有Sleep,就一个一循环,不断的发送与接收) 耗时3004.6325 秒完成 总共 10,000,000 一千万次访问 平均每分完成 199,691.6 次发送与接收 平均每秒完成 3,328.2 次发送与接收 整个运行过程中,内存消耗在开始两三分种后就保持稳定不再增涨。 看了一下对每个客户端的延迟最多不超过2秒。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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