2014-04-11 2 views
1

У меня есть приложение quickfix .net. Я использую .net/c++ version of quickfixОшибка Quickfix: System.AccessViolationException

Иногда мое приложение вызывает эту ошибку, и я не могу ее поймать с помощью блока catch try. Длина сообщений об исправлении составляет около 3000. Я не получаю эту ошибку каждый раз. Это журнал событий:

Framework Версия: v4.0.30319 Описание: Процесс был прерван из-за необработанное исключение. Исключение Информация: System.AccessViolationException Stack: в 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 (приложение *, FIX.Message *, FIX.Sessio Нид *)

линия, которая бросает ошибку:

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 = Х | 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 = А | 290 = 2 | 279 = 1 | 278 = 25502 | 270 = 2,11616 | 271 = 3000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 25504 | 270 = 2,11596 | 271 = 7000000 | 276 = | 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 = А | 290 = 4 | 279 = 1 | 278 = 25514 | 270 = 2,11756 | 271 = 6000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 204 | 270 = 1,38947 | 271 = 1500000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 600 | 270 = 0,93834 | 271 = 1000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 601 | 270 = 0,93833 | 271 = 1 миллион | 276 = А | 290 = 2 | 279 = 1 | 278 = 602 | 270 = 0,93832 | 271 = 1 миллион | 276 = А | 290 = 3 | 279 = 1 | 278 = 603 | 270 = 0,93831 | 271 = 2000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 604 | 270 = 0,93821 | 271 = 2000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 610 | 270 = 0,93839 | 271 = 1000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 611 | 270 = 0,9384 | 271 = 1500000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 613 | 270 = 0,93843 | 271 = 3500000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 614 | 270 = 0,93844 | 271 = 3000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 2200 | 270 = 1,09337 | 271 = 10000 00 | 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 = А | 290 = 4 | 279 = 1 | 278 = 2204 | 270 = 1,09333 | 271 = 1000000 | 276 = А | 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 = А | 290 = 5 | 279 = 1 | 278 = 19600 | 270 = 1,08182 | 271 = 1000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 19601 | 270 = 1,08181 | 271 = 1000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 19602 | 270 = 1,0818 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 19603 | 270 = 1,08179 | 271 = 1000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 19604 | 270 = 1,08178 | 271 = 1000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 19612 | 270 = 1,08205 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 19613 | 270 = 1,08206 | 271 = 1000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 19614 | 270 = 1,08216 | 271 = 2000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 23600 | 270 = 1,51927 | 271 = 2000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 23601 | 270 = 1,51926 | 271 = 1000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 23602 | 270 = 1,51925 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 23603 | 270 = 1,51915 | 271 = 3000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 23604 | 270 = 1,51905 | 271 = 4000000 | 276 = А | 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 = А | = 2 290 | 279 = 1 | 278 = 23612 | 270 = 1.51947 | 271 = 1 миллион | 276 = А | 290 = 3 | 279 = 1 | 278 = 23613 | 270 = 1,51957 | 271 = 2000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 23614 | 270 = 1,51967 | 271 = 3000000 | 276 = А | = 290 5 | 10 = 142 |

+0

Скорее всего, вы пытаетесь извлечь 'field', который не присутствует в исходном FIX сообщении. Можете ли вы вставить FIX messgae, который вы разбираете, когда происходит экспрессия. – DumbCoder

+0

Я вставил исправление msg. –

+0

Вы пытались отлаживать вообще? Никто не собирается тратить через это большое сообщение FIX, которое вы опубликовали. – DumbCoder

ответ

0

This выглядит связанным.

Речь идет о состоянии гонки в объекте Group, который получает мусор, собранный до его ссылки.

Вы хотите что-то вроде gcnew на: .Net garbage collection

0

исправить эту проблему сделал список запросов. Пример:

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); 
    }`