問題タブ [dbghelp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - SetUnhandledExceptionFilter を使用すると、スタック ウォーキングが正しく機能しないのはなぜですか?
次のコードを使用して、例外でスタックをウォークします (注:デバッグ モードではなく、コンソールへのスタック トレースの目的の出力を適切に受け取るために、リリースで実行する必要があります。そうしないと、ポップアップのみが表示されます。 ):
出力:
問題は、上記のトレースには、 in への呼び出しに対応する のみが含まれていることline: 135
です。ただし、スタック トレースの一部として、 を実行する場所に含めたいと思います。これをスタック トレースの一部として含めないのはなぜですか? スタックトレースのこの部分も含めるにはどうすればよいですか? これまでのところ、この機能を実現できた唯一の方法は、 ;の呼び出しの周りでandブロックを使用することです。例外を aに渡しますが、どこでも使用する必要があるため、独自の注意事項があるため、これは良くありません。トップレベルのソリューションが必要です。トップレベルの例外をすべてキャッチしたいのですが、例外がスローされた場所を正確に知りたいのです。function0();
threadFunction
line: 29
throw new exception;
__try
__except(FatalExceptionFilter(GetExceptionCode(), GetExceptionInformation()))
function0()
FatalExceptionFilter
PS このコードは、Windows 8.1、64 ビット マシンで実行されています。これは、リリース ビルド/プラットフォーム x64 でコンパイルされた MSVC++ コンソール アプリケーションです。
更新: _set_se_translator メソッドと Petr の提案を使用して次のことを試しましたが、まだ機能しないようです。実際、ゼロ除算の例外は処理されずにスローされ、何も処理されません。
c++ - Windows 8.1 Update 1 で dbghelp.dll を使用するとアプリケーションがクラッシュする
Windows 8.1 Enterprise のバージョンを Update 1 (今週のブラック チューズデー バージョンでリリースされた最新のパッチ) に更新しました。
dbghelp.dll の一部である WINAPI メソッドを使用する MSVC++ アプリケーションの 1 つを実行したところ、クラッシュしました。私が見つけた唯一の理由は、Event Viewer をチェックしてエラーがないかどうかを確認したからです。確かに、次のものがありました。
8.1 Update 1 で使用する必要があるこの DLL のホットフィックスまたは別のバージョンはありますか?
winapi - StackWalk64 は動作しているように見えますが、SymFromAddr は偽の名前を返します
Windows で現在のスタックを取得するために、次の関数を実装しました。
スタック ウォークは期待どおりに動作しているように見えます。デバッガーとほぼ同じ数のフレームが得られます。また、SymGetModuleBase64
とはGetModuleFileName
モジュール名を解決するために適切に機能します。
しかし、 を呼び出すと、SymFromAddr
常に 1 つのモジュールに対して同じ機能が得られます。各アドレスは異なり、いくつかのアドレスをテストすると、正しいように見えます。
PDB は /Zi および /DEBUG で生成されます。
適切に動作させるために何ができるか考えていますか?
c - アンロードされたモジュールの pdb からの構造情報の抽出
ライブ リモート ターゲットとクラッシュ ダンプの両方で動作する WinDbg デバッガー拡張機能を作成しようとしています。この拡張機能は、構造オフセットを介してメモリの不透明なブロックを分析し、メモリのさまざまな領域を既知のオブジェクトにキャストします。
構造体はバージョン間でフィールド/フィールドの順序を変更するため、デバッガー拡張機能自体にハードコーディングする (またはヘッダーを含める) ことはできません。代わりに、プライベート シンボルを持つ pdb から構造情報を抽出したいと考えています。
pdb/image が読み込まれたモジュール リストにあるライブ ターゲットでこれを使用すると、これはうまく機能し、 GetFieldOffsetなどの関数を使用して、クラスの構造体のフィールドを取得できます。
私の問題:ロードされたモジュール リストにモジュールがない場合 (コンテキストが間違っているか、クラッシュ ダンプを分析している)、上記の関数を使用できません。
分析しているメモリ領域の先頭に、pdb GUID と年齢を格納しました。それを使用して、 SymFindFileInPathを使用して、シンボル パス/シンボル キャッシュで pdb へのパスを見つけることができます。
したがって、特定の pdb インスタンスへのパスはありますが、ここからどこに行けばよいかわかりません。DbgHelp.dll によって公開されたSym* 関数を調べると、この pdb ファイルを使用して型情報を取得する明らかな方法が見当たりません。SymGetTypeInfoなどの関数にはモジュール ベースが必要ですが、私のモジュールはロードできません。必要なのは、構造内のフィールドのバイト オフセットだけです。何か案は?
ありがとう!
c++ - ULONG64 をポインタに変換する方法
18446744073709551572 値として表される仮想アドレスを含む構造体からのULONG64
変数があり、それを関数に渡すことができるように変換する必要があります。SYMBOL_INFO
void*
ReadProcessMemory
私がするだけなら
それは私に FFFFFFD4 を与えます。
なんで?私は何を間違っていますか?どうすれば修正できますか?
前もって感謝します。