2

Windows アプリ内で、.NET DLL (具体的には - クイックフィックス エンジン) でラップされた C++ DLL を使用しています。実行中、毎日 1 回 (特定の時間ではなく)、組み込みクラスの 1 つのコンストラクターの 1 つで実行時エラーがスローされます。エラーがキャッチされて (ログ ファイルとデータベースに) 報告されても、Windows の「ランタイム エラー」ダイアログ (回復/デバッグ オプションは提供されません) が表示され、「OK」ボタン (唯一のオプション) を押した後、利用可能) アプリが終了しました。

これは、Debug、Release で実行している場合、および VS2005 デバッガー自体で実行している場合でも発生します。

補足として、上記の DLL をローカルでコンパイルしました (これらの DLL の少なくとも 1 つには、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)
4

2 に答える 2

0

別の AppDomain に QuickFix DLL をロードできます。これにより、アプリが予期せず終了するのを防ぐことができます。

メイン プログラムから終了するアプリ ドメインをテストし、必要に応じて再読み込みできます。

アプリ ドメイン

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

それらを使用してアプリを構築するためのもう少しの情報

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

C++ コードにアクセスできないと仮定していますが。Ick ..なんて厄介な「石膏」修正。

于 2009-07-22T09:03:50.583 に答える
0

DLL 内のバグを示すスタック トレースがあるようです。
そのコードはありますか?スタックトレースを転送できる誰かによってサポートされていますか?

DLL 自体を修正しないと、クラッシュの原因となったコード内のケースを特定して回避しない限り、問題は引き続き発生します。これは推奨される解決策ではありませんが、コードを制御しない場合に利用できる唯一の解決策になる場合があります。

于 2009-07-22T09:05:03.997 に答える