سؤال

ضمن تطبيق Windows الخاص بي، فأنا أستخدم ملفوفة C ++ ملفوفة ب .NET DLLs (على وجه التحديد - محرك QuickFix). أثناء التشغيل، مرة واحدة كل يوم (ليس في أي وقت محدد)، في أحد منشئ واحد من الفئات المدمجة يلقي خطأ وقت التشغيل. على الرغم من أن الخطأ قد تم القبض والإبلاغ عنها (إلى ملف السجل، وقاعدة البيانات)، ما زلت أحصل على مربع حوار خطأ وقت التشغيل Windows (الذي لا يقدم أي خيارات استرداد / تصحيح أخطاء) وبعد الضغط على زر "موافق" (واحد فقط متاح) يتم إنهاء تطبيقي.

يحدث هذا عند تشغيله في تصحيح الأخطاء والإصدار وحتى أثناء تشغيله ضمن Debugger VS2005 نفسه.

كملاحظة جانبية، قمت بتجميع DLLs المذكورة أعلاه محليا (نظرا لأن أحدها على الأقل يتضمن التعليمات البرمجية التي تم إنشاؤها تلقائيا استنادا إلى مواصفات XML).

أي واحد؟ (التفاصيل تتبع)

رمز بلدي:

try
{
    QuickFix.Symbol Symbol = new QuickFix.Symbol();
    report.get(Symbol);
    PairsType instrument = ToPairType(Symbol.getValue());

    if (PairsType.NONE == instrument)
        return;

    QuickFix.MDEntryDate entryDate = new MDEntryDate();
    QuickFix.MDEntryTime entryTime = new MDEntryTime();
    QuickFix.QuoteCondition quoteCondition = new QuoteCondition();
    QuickFix.MDEntryPx MDEntryPxBid = new QuickFix.MDEntryPx();
    QuickFix.MDEntryPx MDEntryPxAsk = new QuickFix.MDEntryPx();

    QuickFix.NoMDEntries noMDEntries = new QuickFix.NoMDEntries();
    report.get(noMDEntries);

    for (uint i = 1; i <= noMDEntries.getValue(); ++i)
    {
        QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries group =
           new QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries();

        report.getGroup(i, group);

        if (group.isSetQuoteCondition())
            group.get(quoteCondition);
        if (group.isSetMDEntryDate())
            group.get(entryDate);
        if (group.isSetMDEntryTime())
            group.get(entryTime);

        switch (group.getMDEntryType().getValue())
        {
            case MDEntryType.BID:
                group.get(MDEntryPxBid);
                break;
            case MDEntryType.OFFER:
                group.get(MDEntryPxAsk);
                break;
        }
    }

    // use data...
}
catch (Exception e)
{
    // log the error
}

تفاصيل الخطأ: الرسالة: ألقى المكون الخارجي أثر مكدس استثناء:

at FIX.message_order.=(message_order* , message_order* )
 at std._Tree_nod<std::_Tmap_traits<int,FIX::FieldBase,FIX::message_order,std::allocator<std::pair<int const ,FIX::FieldBase> >,1> >.{ctor}(_Tree_nod<std::_Tmap_traits<int\,FIX::FieldBase\,FIX::message_order\,std::allocator<std::pair<int const \,FIX::FieldBase> >\,1> >* , message_order* _Parg, allocator<std::pair<int const \,FIX::FieldBase> >* _Al)
 at std._Tree<std::_Tmap_traits<int,FIX::FieldBase,FIX::message_order,std::allocator<std::pair<int const ,FIX::FieldBase> >,1> >.{ctor}(_Tree<std::_Tmap_traits<int\,FIX::FieldBase\,FIX::message_order\,std::allocator<std::pair<int const \,FIX::FieldBase> >\,1> >* , message_order* _Parg, allocator<std::pair<int const \,FIX::FieldBase> >* _Al)
 at FIX.FieldMap.{ctor}(FieldMap* , Int32* order)
 at QuickFix.Group..ctor(Int32 field, Int32 delim, Int32[] message_order)
 at QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries..ctor()
 at PriceProviders.PriceProvider.onMarketDataRefresh(FixSession session, MarketDataSnapshotFullRefresh report)
هل كانت مفيدة؟

المحلول

يمكنك تحميل DLL QuickFix في AppDomain منفصلة. من شأنه أن يحمي تطبيقك منه إنهاء بشكل غير متوقع.

يمكنك اختبار مجال التطبيق المنتهي من البرنامج الرئيسي وإعادة تحميله عند الاقتضاء.

مجال التطبيق

http://msdn.microsoft.com/en-us/library/system.appdomain.aspx.

مزيد من المعلومات قليلا حول بناء تطبيق باستخدامها

http://msdn.microsoft.com/en-us/library/yk22e11a(vs.71).aspx.

أنا أفترض أنك لا تملك الوصول إلى رمز C ++ ولكن. ick .. يا له من إصلاح "الجص" سيئة.

نصائح أخرى

يبدو أن لديك تتبع مكدس يشير إلى علة داخل DLL.
هل لديك الكود الخاص بها؟ هل يدعمه شخص ما يمكنك إعادة توجيه أثر المكدس إلى؟

دون تحديد DLL نفسه، ستستمر المسألة في حدوث ذلك، ما لم تحدد الحالات الموجودة في التعليمات البرمجية التي تسبب التعطل وتتعامل معها - وليس حلا موصى به، ولكن في وقت ما واحد فقط متاح عند التحكم في التعليمات البرمجية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top