0

これはちょっと長い説明ですが、デバッグ プロセスのどこに問題があるのか​​正確にはわかりません。

C++ DLL の関数を呼び出す Excel マクロがあります。この関数を呼び出すたびに、Excel インスタンスは突然強制終了し、警告やエラー メッセージは表示されません。次のようにVisual Studio Expressでデバッグを設定して、何が起こっているのかを追跡しようとしています:

構成プロパティ->デバッグ->コマンド: C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE

構成プロパティ->C/C++->ブラウズ情報->ブラウズ情報を有効にする:はい (/FR)

次に、テストする関数をクリックしてデバッグを開始し、ブレークポイントを設定して F5 キーを押します。Excel.exe のデバッグ情報が利用できないというエラー メッセージが表示され、[はい] をクリックしてデバッグを続行します。

Excel インスタンスが開きます。C++ ブレークポイントは、白い「ブレークポイントはヒットしません」という円に変わりました。マクロを含むワークブックを開き、マクロを実行します。

Visual Studio で、EXCEL.EXE がブレークポイントをトリガーしたというメッセージが表示されます。これは、C++ コードで設定したブレークポイントであると思われます。[ブレーク] をクリックします。新しいタブが開き、次のメッセージが表示されます。

wntdll.pdb not loaded

この時点で、デバッガーは続行されないため、手動で停止し、Excel を強制終了します。出力ウィンドウは言う

EXCEL.EXE はコード 0 で終了しました

[デバッグ オプション] -> [シンボル] に移動し、[Microsoft シンボル サーバー] ボックスをオンにします。シンボルが必要な DLL がわからないので、[すべてのモジュールのシンボルを自動的に読み込む] を選択します。デバッガを起動します。

Excel で利用できないデバッグ情報に関する同じメッセージが表示され、Excel インスタンスが開きます。ブックを再度開き、マクロを開始します。その間、VS では多くの DLL のシンボルが読み込まれます。

VS に次のようなタブが表示されます。

Source not available
Source information is missing from the debug information in this module.

適切な DLL のシンボルがまだロードされていない可能性がありますが、すべてのシンボルがロードされるのを待ちたくありません。以前に試してみたところ、10分経ってもシンボルがまだロードされていました。

コール スタックを見ると、次のコールが最新です。

ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpReportHeapFailure@4()    Unknown
ntdll.dll!_RtlpLogHeapFailure@24()  Unknown

私の C++ アプリのコードはまだ呼び出されていません。これらの呼び出しは、VBE7 および ole32 呼び出しの直後に行われます。

コードをデバッグして、Excel が終了する理由を突き止めたいだけです。ここで何が起こっているのか理解できる人はいますか?

編集: エラーが発生したときの完全なコール スタックは次のとおりです。

ntdll.dll!_RtlReportCriticalFailure@8() Unknown
ntdll.dll!_RtlpReportHeapFailure@4()    Unknown
ntdll.dll!_RtlpLogHeapFailure@24()  Unknown
ntdll.dll!_RtlSizeHeap@12() Unknown
ole32.dll!CRetailMalloc_GetSize(IMalloc * pThis, void * pv) Line 710    C++
oleaut32.dll!APP_DATA::FreeCachedMem(void *,unsigned long)  Unknown
oleaut32.dll!_SysFreeString@4() Unknown
VBE7.DLL!_lblEX_FFreeStr()  Unknown
VBE7.DLL!_lblEX_VCallHresult()  Unknown
VBE7.DLL!_lblEX_ImpAdCall() Unknown
VBE7.DLL!InvokeImmedSub(struct RTMI *,class GEN_PROJECT *,class EXFRAME *,struct IDispatch *)   Unknown
VBE7.DLL!WATCHMGR::ExecuteImmedLogln(char * *,unsigned int,int,class GEN_PROJECT *,unsigned long,int,int,class WATCH *) Unknown
VBE7.DLL!ExecProcUnderCursor(void)  Unknown
VBE7.DLL!_EbInvokeItem@4()  Unknown
VBE7.DLL!CmdFDispatchCommand(unsigned short)    Unknown
VBE7.DLL!FTranslateAccelerator(struct tagMSG *,int) Unknown
VBE7.DLL!FRubyMsg(struct tagMSG *)  Unknown
VBE7.DLL!MainFTranslateMessage(struct tagMSG *,unsigned long)   Unknown
VBE7.DLL!CMsoComponent::FPreTranslateMessage(struct tagMSG *)   Unknown
EXCEL.EXE!2f9f874a()    Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for EXCEL.EXE] 
EXCEL.EXE!2f9f73f4()    Unknown
MSO.DLL!637b77f1()  Unknown
MSO.DLL!637e0143()  Unknown
EXCEL.EXE!2f990ec5()    Unknown
msvcr90.dll!___set_flsgetvalue()    Unknown
msvcr90.dll!__getptd_noexit()   Unknown
msvcr90.dll!__getptd()  Unknown
msvcr90.dll!_LocaleUpdate::_LocaleUpdate(struct localeinfo_struct *)    Unknown
msvcr90.dll!__ismbcalpha()  Unknown
msvcr90.dll!__ismbblead()   Unknown
0062430d()  Unknown
kernel32.dll!@BaseThreadInitThunk@12()  Unknown
ntdll.dll!___RtlUserThreadStart@8() Unknown
ntdll.dll!__RtlUserThreadStart@8()  Unknown
4

1 に答える 1

3

プログラム データベース (PDB) ファイルには、プログラムのデバッグ構成のインクリメンタル リンクを可能にするデバッグ情報とプロジェクト状態情報が保持されます。Visual Studio は、ソース コードを使用してデバッグできるようにするための関連するデバッグ情報が見つからなかったことを単に伝えています。

wntdll.pdbに関連すると思いntdll.dllますが、VS でシンボル ディレクトリを設定するには、[ツール] -> [オプション] -> [デバッグ] -> [シンボル] に移動します。

このページには、特にsymchk.exeシンボルのダウンロードに使用する部分に関する情報が含まれています。

Windows デバッグ シンボル - 読み込まない

使用方法についての説明symchk.exeは次のとおりです。

http://support.microsoft.com/kb/311503

現在、この問題はクラッシュに関連していない可能性があります。プロセス モニターを使用して、プロセスからのメッセージを監視することをお勧めします。これは、何が問題なのかを特定するのに非常に役立ちます。

于 2013-11-01T18:25:35.343 に答える