Seçkin
Seçkin

Reputation: 2826

Quickfix Error : System.AccessViolationException

I have a quickfix .net application. I am using .net/c++ version of quickfix

Sometimes my application throws this error and i cannot catch it with try catch block. The lenght of fix messages are about 3000. I don't get this error everytime. This is the event log :

Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.AccessViolationException Stack: at System.String..ctor(SByte*) at QuickFix.Group.getField(QuickFix.StringField) at FixApplication.onMessage(QuickFix44.MarketDataIncrementalRefresh, QuickFix.SessionID) at QuickFix44.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID) at QuickFix.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID, QuickFix.BeginString) at QuickFix.MessageCracker.crack(QuickFix.Message, QuickFix.SessionID)
at FixApplication.fromApp(QuickFix.Message, QuickFix.SessionID) at .Application.fromApp(Application*, FIX.Message*, FIX.SessionID*)

The line which throws error :

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

}

This is the fix msg (you can parse it with this online tool : 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|290=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|

Upvotes: 1

Views: 453

Answers (2)

Junio
Junio

Reputation: 1

I fix this problem made a request list. Example:

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

Upvotes: 0

rupweb
rupweb

Reputation: 3328

This looks related.

It's about a race condition in the Group object, which gets garbage collected before it is referenced.

You want something like gcnew per: .Net garbage collection

Upvotes: 0

Related Questions