0

XPが埋め込まれたwindbgを使用しています。オペレーティング システムのシンボルを取得しようとすると、「シンボル ファイルが見つかりませんでした。デフォルトで ntdll.dll のシンボルをエクスポートするように設定されています」というメッセージが表示されて失敗します。(これはXP組み込みの典型ですか???)

自分のコードのシンボルとソースを見つけて読み込むのに問題はありません。ただし、コードをステップ実行すると、dv によって返されるメモリ内の変数の場所が実際のメモリの内容と一致しないように見えるため、コードとシンボル ファイルの間に重大な不一致があることが示唆されます (たとえば、変数を割り当てますが、その後、アドレスその dv の主張がそれに対応することは変更されていないように見えます)。

私のsympathは、最初にシンボルディレクトリをリストし、次にキャッシュ、次にサーバーをリストするので、キャッシュされたシンボルファイルが干渉することはありません.

これは、ntdll シンボル ファイルが見つからず、正しく一致しない別のシンボル ファイルを使用することによる潜在的な影響ですか、それとも他に原因があるのでしょうか?

例:
.sympath D:/Symbols
.symfix+
.srcpath D:/Symbols ** Yes, currently the source is in with the symbols
.reload
** (defaults to export symbols for ntdll.dll since symbol file can't be found)
bp 00401000 (break at a constructor)
g
(program runs till it hits constructor)
l+t
dv /i /t /V ** look up this pointer memory location to check constructor
** We bring up a memory window at the location the this pointer refers to and
** step through the code, but no changes appear in that memory window
** moreover a local LARGE_INTEGER whose value is set with QueryPerformanceCounter
** also appears unchanged after the call
** when the constructor returns we assign the memory address returned by
** new to a global pointer, whose memory address we look up with dt, but
** after the call that address still has 0 in it

これを実際に修正する方法を誰か教えてもらえますか?

補足として、実際には xp 組み込みマシンで cdb をサーバーとして実行し、windbg の「リモート セッションに接続」オプションを使用します。上記のコマンドはすべて、windbg を介して実行されます。

4

1 に答える 1

1

.reload の前に !sym ノイジーを実行すると、ntdll.dll のシンボルが見つからない理由がわかります。それらが単にシンボル サーバーでインデックス化されていない可能性は十分にあります。これは一般的に運が悪いことを意味します (残念ながら、これを修正するために連絡する人は実際にはいません)。

他のシンボルの問題については:

1) これはコードのリリース ビルドですか? だとしたら完全に予想通り

2) デバッグ ビルドの場合、指しているソースがターゲット マシンと一致することを 100% 確信していますか? 答える前に 100% であることを確認してください :)

-スコット

于 2010-08-31T15:50:19.673 に答える