-
Notifications
You must be signed in to change notification settings - Fork 57
Description
I've been using NetMQ in production for a while. NETMQ
version number is 4.0.0.1,AsyncIO
version number is 0.1.26.0
Recently, i found the program had crashed. Checked out the windows log to find out is an OOM exception。
Then I view the dump file through windbg.
!dumpheap -stat
...
00007ff7ffbc0d50 536240 17159680 NetMQ.Core.Utils.Proactor+Item
00007ff7ffbca7f8 536242 17159744 NetMQ.Core.IOObject
00007ff7ffbcba70 536534 34338176 AsyncIO.Windows.AcceptExDelegate
00007ff7ffbcb7f0 536534 34338176 AsyncIO.Windows.ConnectExDelegate
00007ff7ffbcbdd8 1073068 60091808 AsyncIO.Windows.Overlapped
00007ff7ffbcb600 536534 90137712 AsyncIO.Windows.Socket
Total 3839215 objects
I checked the status of several objects. Confirm that the AsyncSocket object has called the Dispose method,and the value of InProgress
equels true
!mdt 000000000390db20
000000000390db20 (AsyncIO.Windows.Overlapped)
m_address:000000001ef5ffb0 (System.IntPtr)
m_handle:(System.Runtime.InteropServices.GCHandle) VALTYPE (MT=00007ff85e5f3bc0, ADDR=000000000390db48)
<OperationType>k__BackingField:0x1 (Receive) (AsyncIO.OperationType)
<AsyncSocket>k__BackingField:000000000390da78 (AsyncIO.Windows.Socket)
<InProgress>k__BackingField:true (System.Boolean)
<Disposed>k__BackingField:true (System.Boolean)
<State>k__BackingField:000000000390de08 (NetMQ.Core.Utils.Proactor+Item)
check gc table
!gchandles
GC Handle Statistics:
Strong Handles: 520519
Pinned Handles: 84
Async Pinned Handles: 0
Ref Count Handles: 0
Weak Long Handles: 43
Weak Short Handles: 116
Other Handles: 0
Statistics:
...
00007ff7ffbcbdd8 511752 28658112 AsyncIO.Windows.Overlapped
Total 520762 objects
check Finalize Queue
!finq -stat
Generation 0:
Count Total Size Type
---------------------------------------------------------
1 168 AsyncIO.Windows.Socket
1 object, 168 bytes
Generation 1:
Count Total Size Type
---------------------------------------------------------
1008 169344 AsyncIO.Windows.Socket
2 48 System.Windows.Forms.VisualStyles.VisualStyleRenderer+ThemeHandle
1,010 objects, 169,392 bytes
Generation 2:
Count Total Size Type
---------------------------------------------------------
1 776 FC.Main.frmMain
1 104 AsyncIO.Windows.CompletionPort
535525 89968200 AsyncIO.Windows.Socket
...
It can be concluded that AsyncSocket called Dispose, but because the overlapped operation was being processed, it was not eventually notified of the io completion port
Then I found a lot of junk connection requests in the program log. I found through wireshark clutch bag due to multiple abnormal connections
i check the source code
public override void Receive(byte[] buffer, int offset, int count, SocketFlags flags)
{
m_inOverlapped.StartOperation(OperationType.Receive);
m_receiveWSABuffer.Pointer = new IntPtr(m_receivePinnedBuffer.Address + offset);
m_receiveWSABuffer.Length = count;
int bytesTransferred;
SocketError socketError = UnsafeMethods.WSARecv(Handle, ref m_receiveWSABuffer, 1,
out bytesTransferred, ref flags, m_inOverlapped.Address, IntPtr.Zero);
if (socketError != SocketError.Success)
{
socketError = (SocketError)Marshal.GetLastWin32Error();
if (socketError != SocketError.IOPending)
{
throw new SocketException((int)socketError);
}
}
}
if socket was reset when need to read and write ,the asyncsocket will be dispose and the Io operation canceled. InProgress
equels true so that the Overlapped hand not be free. it may cause io completion notification may never come.
Is this and 《Could it be a potential issue of AsyncSocket? #26》is same problem?