【问题标题】:Quickfix Error : System.AccessViolationException快速修复错误:System.AccessViolationException
【发布时间】:2014-04-11 11:08:39
【问题描述】:

我有一个 quickfix .net 应用程序。我正在使用.net/c++ version of quickfix

有时我的应用程序会抛出此错误,我无法使用 try catch 块捕获它。 修复消息的长度约为 3000。我不会每次都收到此错误。 这是事件日志:

框架版本:v4.0.30319 描述:进程被终止 由于未处理的异常。异常信息: System.AccessViolationException 堆栈:在 System.String..ctor(SByte*) 在 QuickFix.Group.getField(QuickFix.StringField) 在 FixApplication.onMessage(QuickFix44.MarketDataIncrementalRefresh, QuickFix.SessionID)在 QuickFix44.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID) 在 QuickFix.MessageCracker.crack(QuickFix.Message,QuickFix.SessionID, QuickFix.BeginString) 在 QuickFix.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID)
在 FixApplication.fromApp(QuickFix.Message, QuickFix.SessionID) 在 .Application.fromApp(Application*, FIX.Message*, FIX.SessionID*)

抛出错误的行:

public override void onMessage(QuickFix44.MarketDataIncrementalRefresh msg, SessionID sessionID)
{
  try
  {

      var mdReqId = new MDReqID();
      if (msg.isSet(mdReqId))
        msg.get(mdReqId);
      var noMdEntries = new NoMDEntries();
      if (msg.isSet(noMdEntries))
        msg.get(noMdEntries);
      int noMdEntriesInt;
      if (Int32.TryParse(noMdEntries.ToString(), out noMdEntriesInt))
      {
        for (uint i = 1; i <= noMdEntriesInt; i++)
        {
          var group = new MarketDataIncrementalRefresh.NoMDEntries();
          Group repeatedData;
          if (msg.isSet(noMdEntries))
          {
            repeatedData = msg.getGroup(i, group);
            var mdUpdateAction = new MDUpdateAction();
            if (repeatedData.isSetField(mdUpdateAction))
              repeatedData.getField(mdUpdateAction);
            var mdEntryType = new MDEntryType();
            if (repeatedData.isSetField(mdEntryType))
              repeatedData.getField(mdEntryType);

            var symbol = new Symbol();
            if (repeatedData.isSetField(symbol))
              repeatedData.getField(symbol);
            var mdEntryPx = new MDEntryPx();
            if (repeatedData.isSetField(mdEntryPx))
              repeatedData.getField(mdEntryPx);
            var mdEntrySize = new MDEntrySize();
            if (repeatedData.isSetField(mdEntrySize))
              repeatedData.getField(mdEntrySize);
            var numberOfOrders = new NumberOfOrders();
            if (repeatedData.isSetField(numberOfOrders))
              repeatedData.getField(numberOfOrders);

            var mdEntryPositionNo = new MDEntryPositionNo();
            if (repeatedData.isSetField(mdEntryPositionNo))
              repeatedData.getField(mdEntryPositionNo);

            var quoteCondition = new QuoteCondition();
            if (repeatedData.isSetField(quoteCondition))
              repeatedData.getField(quoteCondition);


            var sysSymbolId = 0;
            var mdEntryId = new MDEntryID();
            if (repeatedData.isSetField(mdEntryId))
            {
              repeatedData.getField(mdEntryId);//THIS LINE THROWS ERROR
              string strMdEntryId = mdEntryId.getValue();

            }
            //}
          }
        }
      }
    }
    Functions.WriteDebugLog("OK");
  }
  catch (Win32Exception e)
  {
    Functions.WriteSystemLog("Ex Msg:" + e.ToString() + " Fix Msg : " + msg.ToString());
  }
  catch (Exception ex)
  {
    Functions.WriteSystemLog("Ex Msg:" + ex.ToString() + " Fix Msg : " + msg.ToString());
  }

}

这是修复消息(您可以使用此在线工具解析它:http://fixloganalyzer.com/):

8=FIX.4.4|9=2254|35=X|34=21998|49=*|50=*| 52=20140411-07:52:52.472|56=**|262=1397202772472|268=42|279=1|278=25500|270=2.11636|271=3500000|276=A| 290=1|279=1|278=25501|270=2.11626|271=2000000|276=A|290=2|279=1|278=25502|270=2.11616|271=3000000|276=A|290= 3|279=1|278=25504|270=2.11596|271=7000000|276=A|290=5|279=1|278=25510|270=2.11716|271=3500000|276=A|290=1| 279=1|278=25512|270=2.11736|271=5000000|276=A|290=3|279=1|278=25513|270=2.11746|271=5000000|276=A|290=4|279= 1|278=25514|270=2.11756|271=6000000|276=A|290=5|279=1|278=204|270=1.38947|271=1500000|276=A|290=5|279=1| 278=600|270=0.93834|271=1000000|276=A|290=1|279=1|278=601|270=0.93833|271=1000000|276=A|290=2|279=1|278= 602|270=0.93832|271=1000000|276=A|290=3|279=1|278=603|270=0.93831|271=2000000|276=A|290=4|279=1|278=604| 270=0.93821|271=2000000|276=A|290=5|279=1|278=610|270=0.93839|271=1000000|276=A|290=1|279=1|278=611|270= 0.9384|271=1500000|276=A|290=2|279=1|278=613|270=0.93843 |271=3500000|276=A|290=4|279=1|278=614|270=0.93844|271=3000000|276=A|290=5|279=1|278=2200|270=1.09337|271 =1000000|276=A|290=1|279=1|278=2201|270=1.09336|271=1000000|276=A|290=2|279=1|278=2203|270=1.09334|271=4000000 |276=A|290=4|279=1|278=2204|270=1.09333|271=1000000|276=A|290=5|279=1|278=2211|270=1.09344|271=2000000|276 =A|290=2|279=1|278=2214|270=1.09356|271=3000000|276=A|290=5|279=1|278=19600|270=1.08182|271=1000000|276=A |290=1|279=1|278=19601|270=1.08181|271=1000000|276=A|290=2|279=1|278=19602|270=1.0818|271=1000000|276=A|290 =3|279=1|278=19603|270=1.08179|271=1000000|276=A|290=4|279=1|278=19604|270=1.08178|271=1000000|276=A|290=5 |279=1|278=19612|270=1.08205|271=1000000|276=A|290=3|279=1|278=19613|270=1.08206|271=1000000|276=A|290=4|279 =1|278=19614|270=1.08216|271=2000000|276=A|290=5|279=1|278=23600|270=1.51927|271=2000000|276=A|290=1|279=1 |278=23601|270=1.51926|271=1000000|276=A|290=2|279=1|278=23602|270=1.51925|271=1000000|276=A|290=3|279=1|278 =23603|270=1.51915|271=3000000|276=A|29 0=4|279=1|278=23604|270=1.51905|271=4000000|276=A|290=5|279=1|278=23610|270=1.51945|271=1500000|276=A|290= 1|279=1|278=23611|270=1.51946|271=1000000|276=A|290=2|279=1|278=23612|270=1.51947|271=1000000|276=A|290=3| 279=1|278=23613|270=1.51957|271=2000000|276=A|290=4|279=1|278=23614|270=1.51967|271=3000000|276=A|290=5|10= 142|

【问题讨论】:

  • 您可能正在尝试提取原始 FIX 消息中不存在的 field。当异常发生时,你能粘贴你正在解析的 FIX 消息吗?
  • 我已经粘贴了修复信息。
  • 您是否尝试过调试?没有人会浏览您发布的那条重要的 FIX 消息。
  • 正常工作。几个小时后我运行程序,它给出了错误。它不会每次都给它。因此,我无法解决
  • fixparser 的大链接

标签: c# c++ quickfix fix-protocol


【解决方案1】:

This 看起来相关。

这是关于 Group 对象中的竞争条件,它在被引用之前被垃圾收集。

您想要gcnew 之类的东西:.Net garbage collection

【讨论】:

    【解决方案2】:

    我为解决这个问题做了一个请求列表。 示例:

        public void RequisitarMarketData(List<String> _lstAtivo, String _mercado, String _id, SessionID sessionId)
        {
            QuickFix44.MarketDataRequest _marketDataRequest = new QuickFix44.MarketDataRequest();
    
            _marketDataRequest.set(new MDReqID(_id));
    
            _marketDataRequest.set(new SubscriptionRequestType('1'));
    
    
            var anoMDEntryTypes = new QuickFix44.MarketDataRequest.NoMDEntryTypes();
            var amdEntryType_bid = new MDEntryType('2');
    
    
            anoMDEntryTypes.set(amdEntryType_bid);
            _marketDataRequest.addGroup(anoMDEntryTypes);
    
            _marketDataRequest.set(new MarketDepth(0));
    
            foreach (String _ativo in _lstAtivo)
            {
                var relatedSymbol = new QuickFix44.MarketDataRequest.NoRelatedSym();
                relatedSymbol.set(new Symbol(_ativo));
                _marketDataRequest.addGroup(relatedSymbol);
            }
    
    
            var relatedSymbola = new QuickFix44.MarketDataRequest.NoRelatedSym();
            relatedSymbola.set(new SecurityExchange(_mercado));
            _marketDataRequest.addGroup(relatedSymbola);
    
            //Send message
            Session.sendToTarget(_marketDataRequest, sessionId);
        }`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多