在运行我的比特币节点(用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()调用包装在一个静态对象的锁中来避免,并且它仍然发生。它很少发生并且随机间隔的事实是并发性问题的另一个好的迹象。然而,尝试一切,我终于放弃并发布在这里,希望其他人解决这个问题:)