問題タブ [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.

0 投票する
0 に答える
458 参照

windows - PDB ファイルが読み込まれない

このアプリケーションには、ネストされたディレクトリに DLL の形式でいくつかのアドオンがあります。ログを取得するバックグラウンドで実行されている DbgView のインスタンスを使用してテストを実行しています。問題は、ビルドを構築したコンピューターとは別のコンピューターでテストを実行することです。これにより、PE ヘッダー (Dumpbin ツールを介して抽出された) のデバッグ ディレクトリ エントリがほとんど無効になります。

そのようなシンボル サーバーはありません。ただし、すべての PDB ファイルは、デバッグ ビルドのバイナリの隣に適切な名前で配置されているため、問題なく検出されることを期待していました。

アドオンは LoadLibrary Windows 関数によって読み込まれ、次に SymLoadModule64 関数を使用してシンボル テーブルが読み込まれます。戻り値によると正しいですが、SymGetModuleInfo64 を使用して実際にロードされた PDB を確認すると、実際には何も表示されません。これは、アプリケーションのこの部分を修正することになった元の問題からも明らかです。つまり、前述のデバッグ ログのコール スタック、より正確には、アドオンに対応する部分がめちゃくちゃになっているということです。

関数のさまざまなバージョンを試し、DbgHelp ライブラリのバージョンも確認しましたが、役に立ちませんでした。

VS からのアタッチは、VS が実際に PDB を見つけられることを示していますが、シンボルの読み込みメカニズムと出力ウィンドウのログは依然として問題のある動作を示しています。VSが修正できるのは、混乱したコールスタックだけです。

DbgHelp のシンボルの読み込みは、アプリケーションのルート ディレクトリを「SymSearchPath」として、DEFERRED_LOAD を有効にして初期化されます。後者は削除する必要があり、前者はアドオンのディレクトリを含めるように設定されています。別の解決策は、PDB ファイルをこのルート ディレクトリに移動することでした。

MSDN の SymInitializeのリファレンスによると、「SymSearchPath」は PDB ファイルを再帰的に検索しますが、実際にはそうではありません。もう 1 つのことは、Web を閲覧して PDB ファイルを見つける方法を確認するたびに、バイナリのロード元のディレクトリで PDB ファイルが検索されるという行の 1 番目または 2 番目として読み取られますが、上で説明しましたが、これもそのようには起こりません。

全体として、問題は解決したように見えますが、ここには多くの混乱があります。

だから..
1.誰かがPDBファイルがロードされる真の方法を知っていれば、それは非常に啓発的です。.. ?
2. DbgHelp は根本的にバグがありますか?
3. MSDN でそう言われているのに、なぜ「SymSearchPath」は再帰的に検索されないのですか?

また、他に追加するものがあれば、それも大歓迎です。
このような長い投稿を読んでくれてありがとう。

0 投票する
1 に答える
1854 参照

windbg - dbghelp を使用してクラス メソッドのシンボルのアドレスを検索する

クラス メソッドのアドレスを見つけるために dbghelp を使用しようとしています。たとえば、DirectX メソッド (DXGI): dxgi!CDXGIFactory::CreateSwapChainImpl

正しいシンボルがあり、_NT_SYMBOLS_PATH が定義されています。WinDBG を使用すると、次の「x」コマンドが正常に機能します。

ただし、この文字列を SymFromName で使用しようとすると、エラー 1168 (要素が見つかりません) が発生します。

「::」が原因で失敗するのでしょうか、それとも同じシンボルに 2 つのアドレスがあるために失敗するのでしょうか (どうすれば回避できますか?)。

0 投票する
1 に答える
357 参照

windows - DbHelp 経由で PDB からクラス メソッドのアクセス指定子を取得しますか?

以下のような単純なクラスがあるとします。

MSVC でコンパイルし、DbgHelp API を介して対応する PDB を解析すると、子を反復処理してメソッドと変数をうまく解析できますが、特定の子のアクセス指定子を決定する方法がわかりません。私のコードは次のようになります。

DbgHelp API を介してクラスの子のアクセス指定子 (public、private、protected) を決定することは可能ですか?

0 投票する
2 に答える
317 参照

c# - C# を使用して C++ アプリケーションからコールスタックを取得するにはどうすればよいですか?

C++ で記述された他のアプリケーションをテストする C#/VB.NET アプリケーションがあります。C++ アプリケーションが応答しない場合は、そこからコールスタックを取得したいと考えています。C++ で書かれたさまざまな例 (dbghelp.dll CaptureStackBackTraceやWalk the callstackなど) を見つけましたが、C# で書かれたものは何も見つかりませんでした。助けてくれませんか?

0 投票する
1 に答える
190 参照

c# - MSVC++ でかなり C# 風のスタック トレースを取得するにはどうすればよいですか?

C# では、次の種類のスタック トレースを取得します。

私はC++でかなり同じことをしたいのですが、2つのことがわかりません.ファイルと現在の行番号を取得するにはどうすればよいですか?

私がこれまでに取り組んできたコード例:

出力:

0 投票する
2 に答える
2980 参照

c++ - SymGetLineFromAddr が正しく機能しない

次のコードがあります。

問題は、次の行で常にエラーが発生することです。printf("at %s in %s, address 0x%0X\n", symbol->Name, line->FileName, symbol->Address);

理由は、行の FileName が NULL のように見えるためです。実際、ライン構造全体がめちゃくちゃです。エラー時にスタック トレースを表示するアプリケーションを作成しようとしています。しかし、それはなぜですか?上記のコードを使用して動作するべきではありませんか? PS 私は単純な MSVC++ コンソール アプリケーションとして、Win32 に対してコンパイルしました。