問題タブ [minidump]
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.
debugging - コール スタックが null である Visual Studio でのミニダンプのデバッグ
Visual Studio 2005 でコンパイルしたプログラムでは再現できない、100% 再現可能なクラッシュが発生している顧客がいます。プログラムのデバッグ ビルドを送り、すべての PDB ファイルと DLL ファイルを手元に置いておきました。ミニダンプ ファイルが送られてきましたが、開くと次のようになります。
「MiniDump.dmp の 0x00000000 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000000」。
次に、コール スタックに「0x00000000()」のみが表示され、逆アセンブリによって 0x0 のメモリのダンプが表示されます。シンボル サーバーをセットアップし、PDB シンボルをロードしました。しかし、多くの DLL のどれが実際に null へのジャンプを引き起こしたのかを知る方法がわかりません。これは多くの依存関係を持つ大規模なプロジェクトであり、サードパーティとして API を使用しているため、それらの一部はソースまたは PDB を持っていないバイナリです。
では、このミニダンプは一体どのように役立つのでしょうか? クラッシュの原因となった DLL を確認するにはどうすればよいですか? これまでデバッグにミニダンプを実際に使用したことはありませんが、私が読んだすべてのチュートリアルには、少なくとも関数名またはコール スタックの手がかりを与える何かが表示されているようです。nullを指す1行だけを取得します。
また、「依存」を使用して、未解決の DLL 依存関係があるかどうかを確認してみました。ただし、さまざまな Windows OS を搭載した 3 台のテスト マシンでは、OS DLL 依存関係の 3 つの異なるセットを取得しているようです (それでもクラッシュを再現できません)。したがって、これは問題を診断するための特に信頼できる方法ではないようです。
この問題の原因を特定するには、他にどのような方法がありますか? どの DLL が null にジャンプしたかを確認するために 1 つの命令を戻す方法はありますか?
minidump - ミニダンプ ファイルにはクラッシュのタイムスタンプが含まれていますか?
ミニダンプ ファイルの MiscInfoStream には、プロセスの作成時間が含まれています。クラッシュする前にプロセスが実行されていた時間を知りたいです。ミニダンプ ファイルには、例外のタイムスタンプがどこかに含まれていますか?
このダンプ ファイルの WinDbg は、次のように表示されます。これは、それがどこかにあることを意味します...
(DumpChk は、ストリームのリストの最後に同じ情報を表示します)
今日は 3 月 15 日なので、これがほぼ確実にクラッシュのタイムスタンプであることに注意してください。その値と「プロセス稼働時間」の値をプログラムで取得する方法が必要です。
MINIDUMP_MISC_INFO_3
タイムゾーン情報を含む構造体を見つけましたが、例外時間が含まれていないようです。
一部のダンプ ファイルには、プロセス内の各スレッドのタイムスタンプを含む ThreadInfoListStream が含まれているように見えますが、これは私が確認したミニダンプには含まれていません。
c++ - WinDbg拡張機能のダンプファイルメモリに基づいてオブジェクトを作成するにはどうすればよいですか?
私は大規模なアプリケーションで作業しており、WinDbgを頻繁に使用して、顧客からのDMPファイルに基づいて問題を診断しています。WinDbgの小さな拡張機能をいくつか作成しました。これらは、DMPファイルから情報を引き出すのに非常に役立つことが証明されています。私の拡張コードでは、c++クラスオブジェクトを同じ方法で何度も手作業で逆参照していることに気づきました。例えば:
それはうまく機能しますが、より優れた機能を備えた(そしてアプリケーションのDMPファイル内のより複雑なオブジェクトにアクセスする)拡張機能を作成するにつれて、より良いソリューションを待ち望んでいました。もちろん、私は自分のアプリケーションのソースにアクセスできるので、DMPファイルからオブジェクトをコピーし、そのメモリを使用して、関数を呼び出すことができるデバッガー拡張機能に実際のオブジェクトを作成する方法があるはずです(アプリケーションからdllにリンクすることによって)。これにより、DMPから手で物を引き出す手間を省くことができます。
これも可能ですか?拡張機能で新しいオブジェクトを作成し、それをDMPファイルから直接大きなReadMemoryで上書きするなど、明らかなことを試みました。これはデータを正しいフィールドに配置しているように見えましたが、関数を呼び出そうとするとびっくりしました。私は何かが欠けていると思います...多分c++は私が知らないいくつかのvtableファンキーさを引き出しますか?私のコードは次のようになります。
フォローアップ:EngExtCppのExtRemoteTypedが必要なようです。誰かがこれをうまく使用しましたか?いくつかのサンプルコードをグーグルで検索する必要がありますが、あまり運がありません。
フォローアップ2:私はこれについて2つの異なる調査ルートを追求しています。
1)ExtRemoteTypedを調べていますが、このクラスは実際にはReadMemory/GetFieldOffset呼び出しの単なるヘルパーであるようです。はい、それはALOTの速度を上げるのに役立ちますが、DMPファイルからオブジェクトを再作成する場合には実際には役立ちません。ドキュメントはスリムですが、私は何かを誤解している可能性があります。2)ReadMemoryを使用して、拡張機能で作成されたオブジェクトをDMPファイルのデータで上書きすることも検討しています。ただし、上記のようにsizeof(* thisClass)を使用するのではなく、データ要素のみを選択し、vtablesはそのままにしておくと考えていました。
c++ - 実行中のプロセスの MiniDump の作成
アプリケーションがハングした場合 (つまり、アプリケーションの外部)、アプリケーションの MiniDump を作成できるエンド ユーザー向けのツールを作成しようとしています。内部 MiniDumper と同じコードを使用していますが、アプリのハンドルとプロセス ID を使用していますが、MiniDumpWriteDump を呼び出すとエラー コード 0xD0000024 が発生し続けます。何か案は?
このコードは、プロセスの内部にある場合 (つまり、SetUnhandledExceptionFilter を使用する場合) 100% 機能します。
minidump - WER で追加データを要求する方法は?
私は WER を初めて使用します (実際、数日前に登録したばかりです)。
アカウントを確立し、テスト アプリケーションをそれにマップすることができました。
ただし、未処理の例外を呼び出すと、追加のファイルが収集されていないことがわかります (BucketID <> 8 の適切なレポートがソリューション センターにあり、winqual にはまだ到着していませんが、少なくとも送信されました)。
Version.txt、AppCompat.txt、minidump.mdmp などのファイルが収集されることを期待しています。また、 WerRegisterFile 関数を使用してファイルを追加しようとしました。エラーはありませんが、ファイルも送信されません。
このスレッドを読みました- サーバーが要求した場合にのみ、追加のデータが収集されると書かれています。それで、私の質問は(ばかげているように聞こえるかもしれませんが...)、追加のデータを要求するにはどうすればよいですか? プロファイル内のすべてをスキャンしましたが、有用なオプションは製品/ファイル マッピングに関連するものだけです。
これは明らかなはずだと思います(ヘルプでは説明されていません)が、...行き詰まっています:(どこを見るべきかを示すスクリーンショットがいいでしょう:)
visual-studio-2008 - SetUnhandledExceptionFilter 機能
ミニダンプでメソッドがどのように機能するかを誰かに説明してもらえSetUnhandledExceptionFilter
ますか?
.net - 特定の初回例外が発生したときに .NET プロセスのミニダンプを作成する方法
私のアプリケーションは、QA 環境で InvalidCastException をスローします。これは開発では再現できません。
例外の瞬間にミニダンプを取得したいと考えています。adplus については知っていますが、InvalidCastException がスローされたときにミニダンプを作成するように使用する方法がわかりません。どうやら、1 つの .NET 例外と別の .NET 例外を区別していないようです。私が間違っているかもしれませんが、方法はあります。または、それを行う別のツールがあります。できれば無料のもの。
とにかく、誰でもこの問題を処理する方法をアドバイスできますか?
ありがとう。
アップデート
- ビルドは、QA と開発の両方でデバッグ ビルドです。ただし、QA はラボで可能になった複雑なシナリオを実行しますが、これは開発者が再現することはできません。したがって、QA での実行時にダンプを作成する機能が必要です。
- コードを変更して、コードからミニダンプを作成できます。ただし、このような問題が発生するたびにコードを変更する必要がない、より柔軟なソリューションが必要です。
更新 2
実際、私は John robbins SuperAssert.Net からミニダンプ生成コードを「盗みました」。これは特定のポイントからミニダンプを生成するためのコードですが、adplus のスタイルでより柔軟なアプローチが必要です。John Robbins のアプローチは、cdb スクリプトを作成し、そのスクリプトで cdb デバッガーを呼び出してプロセスにアタッチし、ダンプを作成することです。MiniDumpWriteDump API は使用しません。
windbg - WinDbgを使用したミニダンプのデバッグについてサポートが必要
似たような質問をたくさん読んだのですが、自分の問題が何であるかを正確に答えることができないようです。
64ビットWindows2008で実行されていた32ビットアプリケーションから一連のミニダンプを取得しました。32ビットVistaBusinessの32ビットVisualStudioはそれらにまったく触れないので、私はWinDbgでそれらを開こうとしています。
正確に対応する.pdbファイルはありません(この特定のリリース以降にのみ保存を開始しました)が、同じマシンで同じコードを使用して.pdbsをビルドしています。ミニダンプを作成した正確な実行可能ファイルにもアクセスできます。
.pdbsを実行可能ファイルと一致させることができるChkMatchと呼ばれる気の利いた小さなアプリケーションを見つけました...(ChkMatchによる)唯一の違いは年齢だったので、新しい.pdbsを元の実行可能ファイルと一致させました。
ただし、WinDbgにロードすると、「不一致のpdb」と表示されます。これは、設定.symopts+0x40
したので、とにかくロードしようとします。次に、警告が表示されます。
実行!lmi myexe
してみると、実際、実行可能ファイルのチェックサムは実際にはゼロでした。少し調べてみると、実行可能ファイルは/release
チェックサムを持つフラグを使用してビルドされている必要があることがわかりました。それはすべてうまくいっていますが、正確に時間を遡って再構築することはできません(ただし、そうした場合は、元の.pdbsを確実に保存します:-P)。
ここでできることはありますか?少しばかげているようですが、少なくともコールスタックを取得するのに十分なものをここで一致させることはできません。
debugging - ヒープ情報を保持しながら、マネージ プログラムのミニダンプのサイズを縮小しますか?
.NET 4.0 のダンプ デバッグ サポートにより、(もちろんユーザーに尋ねた後:) C# プログラム クラッシュのミニダンプを作成して問題追跡システムにアップロードすることを自動的に検討しています (ミニダンプが問題の原因を解決するのに役立つようにするため)。クラッシュ)。
WithFullMemory ミニダンプ タイプを使用すると、すべて正常に動作します。スタック変数とヒープ変数の両方を確認できます。残念ながら、(圧縮された) ダンプは、小さな C# プログラムであっても非常に大きくなります。
"Normal" ミニダンプ タイプを使用すると、非常に小さなダンプが得られますが、マネージ デバッガーではスタック変数情報さえ利用できません。実際、マネージド デバッガーでは、WithFullMemory よりも小さいものはまったく役に立たないようです。MINIDUMP_CALLBACK_ROUTINE を使用して、含まれるモジュール情報を独自のモジュールに制限する試みをいくつか試みましたが、マネージ ダンプにはほとんど影響がないように見えますが、それでもマネージ デバッグを壊すことができますか?
管理されたデバッグに役立つようにしながら、ミニダンプをトリミングする方法に関するヒントはありますか?
asp.net - Visual Studio 2010 で ASPNET ワーカー プロセスのダンプ ファイルをデバッグするにはどうすればよいですか?
ASP.NET Web サイトが、IIS を死のスパイラルに陥れる WCF サービス メソッドを呼び出そうとするという、特に厄介なバグに遭遇しました。最終的には、関連付けられているアプリ プールがダウンします。未処理の例外を出力する log4net コードには到達しません。
w3wp.exe プロセスがスピンアップして停止するのを見ていたので、次のコマンドを使用してSysInternals から ProcDumpを使用して、終了時にダンプ ファイルを取得することにしました。
これにより、VS2010 で開くことができるミニダンプ ファイルが取得され、ヒープ情報が存在することが示されます。これはエキサイティングです:
したがって、この時点で、その特定の Web サイトの bin フォルダーであるシンボル パスを設定しようとします。適切なサーバーからコピーしました。ただし、ネイティブのみでデバッグするオプションしか取得できず、それを行うと、適切なシンボルが見つかりません。
これが私のPDBの場所の設定です:
コール スタックが Windows DLL のどこかで停止しているように見えるためかどうかはわかりません...? コールスタックウィンドウの画面です。
とにかく、私の究極の質問は、この例外の原因を見つけるための適切な道をたどっているかどうかです。もしそうなら、何が欠けていますか? アンマネージ コードにあるように見えますが、すべてが爆発する前に最後のマネージ コールを見たいと思っています。
また、参考までに、Web サーバーは Win2003 x86、私の PC は Win7 x64 です。
ありがとう!