System.Data.RBTree`1.Minimum(Int32 x_id)中的System.NullReferenceException

时间:2015-07-01 18:37:55

标签: c# .net

在运行我的比特币节点(用C#.NET 4.5编写)时,我正在获得空引用异常。我一直在尝试各种各样的应用程序,但它有时会出现,有时几个小时后,有时在服务器连续运行数天之后。我无法激发问题(无法重现),我也看不到红黑树的.NET实现的来源。它似乎可能是与清除数据集相关的内部.NET错误。我这里有一个异常跟踪。如果有人有同样的奇怪经历,我将不胜感激任何有关如何纠正问题或解决问题的反馈。

HResult:           -2146233088, 0x80131500
Exception Source:  
Exception Origin:  
Exception Stack:
    Exception Type:    Slf.Cs.SlfInternalErrorException
    Exception Message: SelectData with SELECT statement: "SELECT * FROM [dbo].[BlockHeaders] WHERE BlockHash = @EqualToValue" failed.
    SlfException Info: 
    HResult:           -2146233088, 0x80131500
    Exception Source:  Slf.Cs
    Exception Origin:  Int32 SelectData(System.Data.SqlClient.SqlConnection, Int32, System.Data.DataTable, System.String, System.Data.SqlClient.SqlParameter[])
    Exception Stack:   at Slf.Cs.SlfSqlUtilities.SelectData(SqlConnection connection, Int32 timeoutSeconds, DataTable dataTable, String selectStatement, SqlParameter[] parameters) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs\System\Basics\SlfUtilities.cs:line 1231
                       at Slf.Cs.Data.SlfSqlTable`1.Select(String columnName, Object equalToValue, Int32 maxCount, String orderByStatement) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs\System\Database\SqlServer\SlfSqlDatabase.cs:line 950
                       at Slf.Cs.CryptCoin.BlockchainDB.GetDbBlockHeadersByBlockHash(Byte[] headerHash) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Basics\BlockchainDB.cs:line 212
                       at Slf.Cs.CryptCoin.BlockchainDB.GetBlockHeight(SlfByte32 blockHash) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Basics\BlockchainDB.cs:line 856
                       at Slf.Cs.CryptCoin.BitcoinStore.GetBlockHeight(SlfByte32 hash) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Basics\BitcoinStore.cs:line 597
                       at Slf.Cs.CryptCoin.BitcoinPeer.ExecuteGetHeadersCommand(BitcoinMessage message) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Network\BitcoinPeer.cs:line 829
                       at Slf.Cs.CryptCoin.BitcoinPeer.ExecuteCommand(BitcoinMessage message) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Network\BitcoinPeer.cs:line 1223
                       at Slf.Cs.CryptCoin.BitcoinPeer.ProcessNextCommand() in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Network\BitcoinPeer.cs:line 1591
                       at Slf.Cs.CryptCoin.BitcoinPeer.Run(Object userContext) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Network\BitcoinPeer.cs:line 1740
                       at Slf.Cs.CryptCoin.BitcoinNode.Peer(PeerContext context) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs.CryptCoin\Network\BitcoinNode.cs:line 857
                       at Slf.Cs.SlfPeerToPeerNode.InternalPeerThread(PeerContext context) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs\System\Network\SlfPeerToPeerNode.cs:line 1977
        Exception Type:    System.NullReferenceException
        Exception Message: Object reference not set to an instance of an object.
        HResult:           -2147467261, 0x80004003
        Exception Source:  System.Data
        Exception Origin:  Int32 Minimum(Int32)
        Exception Stack:   at System.Data.RBTree`1.Minimum(Int32 x_id)
                           at System.Data.RBTree`1.Successor(Int32& nodeId, Int32& mainTreeNodeId)
                           at System.Data.RBTree`1.RBTreeEnumerator.MoveNext()
                           at System.Data.Index.InitRecords(IFilter filter)
                           at System.Data.Index.Reset()
                           at System.Data.DataTable.ResetInternalIndexes(DataColumn column)
                           at System.Data.DataTable.Clear(Boolean clearAll)
                           at System.Data.DataTable.Clear()
                           at Slf.Cs.SlfSqlUtilities.FillDataTable(SqlDataAdapter adapter, DataTable dataTable) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs\System\Basics\SlfUtilities.cs:line 1299
                           at Slf.Cs.SlfSqlUtilities.SelectData(SqlConnection connection, Int32 timeoutSeconds, DataTable dataTable, String selectStatement, SqlParameter[] parameters) in C:\Data Files\Development Projects\iProtus\Frameworks\Slf.Cs\System\Basics\SlfUtilities.cs:line 1222

- 由于初始评论的性质而编辑

查看最里面的异常跟踪。这是对标准DataTable.Clear()方法的调用,该方法应该从DataTable中删除所有内容。剩下的事情并不重要。事后来看,我应该刚刚发布了这个最内层的例外。

此外,我没有看到需要提供示例代码,因为它显然是.NET的内部代码。很可能它是并发相关的,我试图通过将所有DataTable.Clear()调用包装在一个静态对象的锁中来避免,并且它仍然发生。它很少发生并且随机间隔的事实是并发性问题的另一个好的迹象。然而,尝试一切,我终于放弃并发布在这里,希望其他人解决这个问题:)

0 个答案:

没有答案