問題タブ [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 投票する
3 に答える
4415 参照

c - SymLoadModuleExをどのように使用してPDBファイルをロードしますか?

SymLoadModuleExPDBファイルからシンボルをロードするために呼び出してSymFromAddrから、そのPDBからシンボルを検索するために使用しようとしています。BaseOfDllただし、パラメータに何を渡すかがわかりませんDllSize。ドキュメントには、PDBファイルをロードするときに、これらのパラメータを0にすることはできないと明示的に記載されており、実際に0を渡そうとすると失敗しERROR_INVALID_PARAMETERます。

私のコードは次のようになります。

PDBファイルをロードするときに何を渡して何を渡すBaseOfDllかをどのように理解しますか?DllSize問題のPDBファイルは別のプログラム実行可能ファイル(DLLではない)のシンボルファイルであり、議論のために、PDBが生成された元のEXEにアクセスできないと仮定します。

または、PDBファイルから特定のアドレスに対応するシンボルを検索するためのより良い方法はありますか?

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

c++ - dbghelp!StackWalk64 を使用して混合モード (マネージド + ネイティブ) スタックをどのようにウォークしますか?

StackWalk64 を使用して、x64 プロセスでマネージ フレームとネイティブ フレームの両方を含むコールスタックをウォークしようとしています。最初または 2 番目のマネージド フレームまではすべて正常に動作しますが、その後、StackWalk64 はフレームのリターン アドレスを特定できず、失敗します。

関数テーブル アクセス コールバックに SymFunctionTableAccess64 を使用しており、シンボル ハンドラは SymInitialize() で初期化されています。dbghelp でマネージ フレームを正しくウォークスルーするために必要な魔法はありますか?

失敗するコールスタックの例:

UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart

注:この質問は、管理されたフレームをシンボル/メソッド名などに解決する方法に関するものではありません。シンボルの解像度などに関係なく、スタック全体を調べたいだけです

また、IDebugControl4::GetContextStackTrace は正しく機能しますが、DbgEng はカスタム関数テーブル コールバックを使用し、単純に SymFunctionTableAccess64 に委任しません。問題は、CLR が RtlInstallFunctionTableCallback を使用してコールバック関数テーブル (mscordacwks を指す) をインストールすることであり、SymFunctionTableAccess64 はそれに従うほどスマートではないと思われます。

カスタム関数テーブル アクセス コールバックを記述して、関数テーブル チェーンをトラバースし、mscordacwks でコールバックを呼び出すことに時間を費やしましたが、かなり大ざっぱで、実際には機能しませんでした。

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

c++ - デバッグシンボルのモジュール名を取得する


C ++ / WindowsでdbgHelpを使用して取得したデバッグシンボルのモジュール名を取得する方法はありますか?
ありがとう :)

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

windows - ミニダンプからスタック トレースを抽出する方法は?

MiniDumpWriteDump を介してアプリケーションの実行中に記録されたミニダンプがたくさんあります。ミニダンプは、開発マシンとは異なる OS バージョンのマシンで作成されました。

現在、dbghelp.dll を使用して、ミニダンプからスタック トレースを抽出するプログラムを作成しようとしています。MINIDUMP_MODULE_LIST を調べて SymLoadModule64 を呼び出していますが、パブリック シンボル サーバーから pdb (kernel32 など) をダウンロードできません。「C:\Windows\System32」をシンボル パスに追加すると、dll が検出され、シンボルがダウンロードされますが、もちろんミニダンプの dll と一致しないため、結果は役に立ちません。

では、適切な pdb をダウンロードして使用するように dbghelp.dll に指示するにはどうすればよいでしょうか。

[編集]

SymLoadModule64 はファイル名のみを取得し、バージョン/チェックサム情報を取得しないことを忘れていたため、明らかに SymLoadModule64 だけでは、dbghelp がどの pdb をダウンロードするかを判断できません。

この情報は、MINIDUMP_MODULE_LIST で実際に入手できますが、dbghelp API に戻す方法がわかりません。

追加のパラメーターを取る SymLoadModuleEx がありますが、それが必要なのか、追加のパラメーターに何を渡す必要があるのか​​ わかりません。

[編集]

デバッグ用 SDK には dbghelp.dll と一緒に dbgeng.dll が配布されていることに気付きましたが、今のところうまくいきません。MSDN は十分に文書化されているようで、windbg が使用するエンジンと同じであると述べています。たぶん、それを使用してスタック トレースを抽出できます。

MSDN には個々のコンポーネントのみが記載されており、それらがどのように連携するかは記載されていないため、dbgeng.dll を使用してミニダンプを処理するための紹介を誰かに教えてもらえれば、おそらく役立つでしょう。

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

c++ - .PDB ドキュメントからデバッグ シンボルを処理する C++ ライブラリを探しています。

PDB ドキュメントで定義された構造をデコードするモジュールを作成します。PDB ドキュメントから必要なデバッグ シンボルを抽出するモジュールを提供してくれる人はいますか? ありがとう。

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

c++ - DEBUGフラグを使用してプロセスを開く際の問題

とフラグを使用CreateProcessしてデバッガーでプロセスを開こうとすると、プロセスが開かれますが、受け取ったハンドルで呼び出そうとすると失敗します。DEBUG_PROCESSDEBUG_ONLY_THIS_PROCESSSymInitialize

これは私のコードです:

作成フラグなしでCreateProcessを呼び出すと、symInitializeは成功します。
私は何が間違っているのですか?

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

c# - C# の SymLoadModule64 と GetCurrentProcess

dbghelp ライブラリを使用して、pdb ファイルから型とプログラムの情報を取得したいと考えています。現在、私は C++ よりも C# のほうが好きなので、現在 C# 内から動作させようとしています。現在、SymLoadModule64 への呼び出しでスタックしています。次のように、C++ で動作する呼び出しがあります。

ただし、何らかの方法で C# から呼び出そうとすると、エラーが発生し続けます。

その結果、loadedModule は 0 に設定され、Marshal.GetLastWin32Error() は 6 (ERROR_INVALID_HANDLE) を返します。さて、ハンドルに問題があるように見えるので、それを取得するためにネイティブ関数を使用するだけでよいと思いました(C#ハンドルからの非互換性による落とし穴を回避するために、C ++が期待するものなど)。ただし、管理されている間、

多かれ少なかれ意味のあるもの (1008、1036、...) を常に返します。

常に -1 を返します。

だから:「主要な」質問(C#からSymLoadModule64()を機能させる方法)に関するアイデアをいただければ幸いです。もちろん、GetCurrentProcess()への呼び出しが失敗する理由も知りたいです。前もって感謝します。

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

debugging - StackWalk64() は単一のフレームを返します

あるプロセスのスレッドのコール スタックを取得しようとすると、同じフレームが 1 つだけ取得されますが、それよりも多くのフレーム (少なくとも 5 フレーム) があることは確かです。

StackWalk64() は常に最初の呼び出しで成功します - フレームを返します:

しかし、2 回目の呼び出しですぐにエラー ID 998-ERROR_NOACCESS で失敗します (MSDN が言うように、このエラーはこの呼び出しが原因ではない可能性があります)。

さらに、SymFromAddr() を使用してこのアドレスをシンボル名に解決しようとすると、エラー 126-ERROR_MOD_NOT_FOUND で失敗します (SymInitialize(m_processHandler,NULL,TRUE) 呼び出しが成功した後)。

コードは次のとおりです。

どうなり得るか?

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

windows - DLL内の未解決のシンボルエラー

背景として、中規模のLinuxコードベース(巨大な.soにコンパイル)をx64ウィンドウ(.dllにコンパイル)に移植することに遭遇しました。リンカーに問題がありました。

最小限のテストケースとして、次のファイルからVisualStudioプロジェクトを作成する場合:

プロジェクトタイプをDLLに設定してビルドすると、「LNK2001:未解決の外部シンボル__imp_UnDecorateSymbolName」というエラーが発生します。つまり、ファイルは正しくコンパイルされますが、dllへのリンクに失敗します。

特に(少なくとも私のシステムでは)dbghelp.libのようなファイルがないため、目標はdllがdbghelp.dllにリンクすることだと思います。では、DLLがアプリケーションにロードされるときではなく、なぜ今そのシンボルを解決しようとしているのでしょうか。そして、なぜそれはその機能をとにかく見ることができないのですか?

明確にするために、x64 DLLをビルドしていること、およびC:\ Windows\System32のdbghelp.dllがx64であることを確認しました。

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

clr - !dumpheap -stat にリストされていない ValueTypes の名前/MT を取得する効率的な方法

私は SOS コマンドとその出力を処理していますが、現在使用されているすべてのタイプを実際に取得する方法がないように思われることに気付きました。これまでのところ最善の方法は ですが!dumpheap -stat、インスタンスがあるタイプのみをリストしています。ただし、ValueType がボックス化されていない場合、その型は に表示されません!dumpheap -stat。(ヒープに割り当てられていないため、これは驚くべきことではありません。)

私の質問は次のとおりです。現在存在する追加の ValueTypes を把握する効率的な方法はありますか? !dumpvc <mt> <address>つまり、個々のヒープ オブジェクト (出力に基づくものなど) を検査するときにオンデマンドで読み込むことができます!do <address>が、表示される統計については、(インスタンス/クラス定義) すべてを見るよりも簡単な方法でタイプを見つけるとよいでしょう。既知のクラスを調べて、追加の ValueTypes を使用しているかどうかを確認します。