2017-10-24 21 views
-1

私はvC++ 6のレガシーコードベースで作業しています。例外がスローされるがバグがありますが、スタックされているため、スタックの上位の問題が発生します。バグはプロダクションで発生し、自宅でバグを再解析することはできません(プロダクションコードを更新してエラーを記録することはできません)。VC++ 6で例外をスローする関数を見つける

HRESULT legacyCall() 
{ 
    try 
    { 
     return FunctionThatCallsManyFunctions(); 
    } 
    catch(_com_error e) 
    { 
     return E_FAIL; 
    } 

} 

私は静的解析によって例外をスローするメソッド呼び出しを見つけようとしていますが、あまりにも多くの抽象化とコード行があります。私は例外がどこにスローされているかを見つけるコンパイラフラグや方法論があるのだろうかと思っていますか?

+0

Visual Studioでは、例外がスローされたときにブレークポイントを設定できます。しかし、それはローカル複製を必要とします... – Jarod42

+0

私は古代の製品(VS 2008)を使っていたと思っています:) :) –

+1

1. 'comdef.h'ヘッダを探します。 2. '_com_error'、' _com_raise_error'などを '#define 'で他の識別子に移します。最後に '#undef'を実行します。 4.コードをコンパイルし、何が壊れているかを確認します。これが例外をスローしようとしていることです。 5. 'comdef.h'を復元することを忘れないでください:) – Quentin

答えて

0

@Quentinのおかげで、_com_errorとそのアクセサはcomdef.hで定義されています。 _com_errorは、_com_issue_errorexまたは_com_issue_errorまたは_com_raise_errorを呼び出すことによってスローすることができます。

ソースで例外が見つからないのは、myCOMlibrary.tli(タイプライブラリ実装)という自動生成ファイルで暗黙的に定義されているためです。このファイルはCOMウィザードによって作成され、COMライブラリのすべての呼び出しをラップし、呼び出しが成功した場合はエラーをスローします。

これを知ることで、上記の関数でgrepでき、_com_errorがスローされたコード内のすべての場所を見つけることができました。

関連する問題