windbgのシンボルサーバとキャッシュの設定がややこしいので少しまとめたい、がよくわからないところもある。
ソース:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/symbol-path
設定
設定はFile⇒Symbol File Path…から行う。デバッグ中の場合設定を反映するには.reloadを行う。設定した後は必ずFile⇒Save Workspaceを実行して保存すること。
設定する種類
設定する種類は4つ。
- 普通のパス
- 普通のキャッシュ
- シンボルサーバ
- シンボルサーバのキャッシュ
普通のパス
>普通のパスはセミコロンで区切って設定する。このパスがあるとwindbgは3つのパスを探す。パスがC:\MyDirだった場合でモジュールがDLLだった場合、最初にc:\MyDir\symbols\dll\を探す、次にc:\MyDir\dll\を探す。最後にc:\MyDir\を探す。探すファイルは名前で探すのではなくすべての*.pdbから同じGUIDのものを見つける(多分)。デバッグビルドではpdbやDLLにGUIDが振られ、それで一致させるものと思われる。これは特に設定しなくてもモジュールの存在するディレクトリは探すと思われる。
普通のキャッシュ
cache*C:\MyCacheなどと設定する。*は区切り文字を表す。これを記述している位置が重要で、ここより右にある普通のパスに対してのみキャッシュする。キャッシュディレクトリはモジュール名の下になんらかのハッシュあるいはGUIDディレクトリをつくることになるので、普通のパスから見つけるよりは早くなると思われる。C:\MyCacheを省略してcache*とだけ書くとデフォルトのキャッシュディレクトリ、多分C:\ProgramData\dbg\symに保存すると思われるが、これを指定しなくても保存するようにも思われる。
シンボルサーバ
srv*pathで記述する。pathはローカルのパスでもhttpでもいい。ローカルの場合、普通のパスとの違いはdllなどのサブディレクトリを検索しないこと(多分)と、普通のキャッシュにキャッシュしないこと、ローカルパスを記述する場合、もともと存在しているpdbをここに手動で移動することを想定していると思われる。pdbにはソースのフルパスが書かれており、ビルドした位置にからソースもpdbも移動させないなら、普通のパスを使って移動させる場合はここに書くのだと思われる。httpの場合も特に違いはない。
シンボルサーバのキャッシュ
srv*localpath*pathで記述する。localpathがpathのキャッシュになる。普通のキャッシュと同じ場所においていいかは不明だけど多分大丈夫。
シンボルを探す順番
不明だが多分左から探すと思われる。
Lazy Symbol Loading
windbgはシンボルが見つかったからといって勝手に読み込んだりはしないのでldコマンドでロードする。-sオプションをつけてwindbgを起動すれば、この機能が無効になりロードするようになるらしい。
1 |
ld module |