Reputation: 2826
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
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
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