none
PDBファイルの用途 RRS feed

  • 質問

  • いつもお世話になります。mkmarimoです。

     

    初心者的な質問かもしれませんが、Visual Studioでプログラムをビルドするときに、

    同時に出力されるPDBファイルについて質問させてください。

     

    PDBファイルはプログラムデータベースファイルの略で、デバッグ時のシンボルとなる

    という概要はわかっているつもりなのですが、このことは、Visual Studio上から

    ソースコードにブレークポイントをセットし、ステップ実行できるという風に解釈して合ってますでしょうか。

    ※実際にVisual StudioのプロジェクトのプロパティからPDBファイルを出力させないようにして、

     デバッグ実行を行おうとすると、警告が出てできませんでした。

     

    もしそうであれば、このPDBファイルはプログラムのソースコードが手元にある場合のみ活躍する

    もののように思えますが、実行ファイル(EXEファイル)とその実行ファイルをビルドしたときのPDBファイルの

    2ファイルがあれば、デバッグ可能という話を聞いたことがあります。

     

    しかし、実際にどうすればよいのかわからず、あまり情報もないため、その真相が知りたくて

    質問させていただきました。

     

    十分に調査すればわかることなのかもしれませんが、うまく目的の情報が見つけられないので、

    EXEとPDBだけで、デバッグ可能なのかという真相と、もし可能であれば、そのやり方を教えてください。

     

    以上、よろしくお願いします。

    2007年12月19日 0:08

回答

  •  mkmarimo さんからの引用

    確かに、重要なビルドごとでPDBを残すという話はよく聞きます。

    では、PDBを残しておくと、後でどのように使えるのかが知りたいのです。

     

    ※マネージの世界は詳しくないので以下はアンマネージの話です

     

    使うシチュエーションとしてはアプリをユーザが使用中に

    アプリケーションエラーが発生し、ワトソン博士によってダンプファイルが生成される場合があります。

    生成されたダンプファイルを送ってもらい、WinDBGを使ってダンプファイルの

    解析を行う場合にPDBが必要になります。

     

     mkmarimo さんからの引用

    普通にDLLとPDBを同一フォルダに置いて、VS上でEXEのプログラムからDLLのコードにステップインできると

    いうことでしょうか。

    はい、できます。

    ただしVSからDLLのコードにステップインするためにはDLL、PDBに加えソースファイルが必要です。

    また、ソースファイルはPDBに記録されているパス(DLLを生成したときのソースファイルのパス)に置いてないと

    ステップインできません

    2007年12月19日 11:35
  •  mkmarimo さんからの引用
    確かに、重要なビルドごとでPDBを残すという話はよく聞きます。

    では、PDBを残しておくと、後でどのように使えるのかが知りたいのです。

     

    と仰るということは、PDBがあれば、ないより楽にデバッグ可能ということですよね?

    そのデバッグの方法を具体的に知りたいのですが、どうするのでしょうか。

     

    通常,EXE ファイルのフォルダに置いておくだけで,デバッガが読み込んでくれます.特に操作は必要ありません.

    デバッグシンボル (PDB ファイル) が読み込まれたバイナリは,「出力」ペインに「シンボルが読み込まれました」と表示されるはずです.これが表示されれば十分で,他にすることはありません.

    あるいは,デバッグ中にメニューから「デバッグ」→「ウィンドウ」→「モジュール」と選択し,興味のあるモジュールについて「シンボルの状態」を見てみて下さい.「シンボルが読み込まれました」と書かれていれば,PDB ファイルは正しく機能しています.

     

    恐らく,ソースコードが存在しないプログラムでも,同じディレクトリに PDB ファイルを置いておけば,シンボルはきちんと読み込まれているかと思います.

     

     mkmarimo さんからの引用
    普通にDLLとPDBを同一フォルダに置いて、VS上でEXEのプログラムからDLLのコードにステップインできるということでしょうか。

     

    いいえ.

    C.John さんも書かれていますが,ソースコード上でのステップ実行はソースコードが必要です.

     

    前回も書きましたが,PDB ファイルの重要性は言語に依存する話です.mkmarimo さんが興味がある言語が何なのか分からないので一般論しか書けませんが,C/C++ などのネイティブコード開発では,PDB ファイルのシンボル情報は,ソースコードが無かったとしても非常に有用です.

    一方,C#/Visual Basic などのマネージコード開発では,EXE/DLL に十分な情報が含まれているので,重要性はそこまで高くないかもしれませんが,全く無意味というわけでもありません.例えば,ソースコードが無くてPDB ファイルのみがあった場合でも,スタック変数の名前だけは分かります.ソースコードが無くて PDB ファイルのみがある状態で,デバッグ中にメニューから「デバッグ」→「ウィンドウ」→「ローカル」と表示してみれば分かります.PDB ファイルがなければ,スタック変数の名前も分からなくなります.

    2007年12月19日 16:01

すべての返信

  • PDB を自前のアプリケーションか何かで再利用したいというご質問ですか?

    2007年12月19日 3:39
  •  mkmarimo さんからの引用
    十分に調査すればわかることなのかもしれませんが、うまく目的の情報が見つけられないので、

    EXEとPDBだけで、デバッグ可能なのかという真相と、もし可能であれば、そのやり方を教えてください。

     

    mkmarimoさんに「2ファイルがあれば、デバッグ可能」と仰った方が何を想定していたかが正確に分からないので何とも言えませんが,デバッガの役に立つのは事実で,一般論として重要なビルドごとに PDB ファイルを残しておくことが推奨されます.

    ただし,言語によっても PDB ファイルの重要性はずいぶん違いますし,PDB ファイルが無いからといってデバッガが一切使えなくなるというわけでもありません.私も実際,PDB ファイルのない DLL を苦労しながらデバッガで追いかけたことが何度もあります.(もちろんソースコードも存在しないので,ディスアセンブルコードでの話です)

     

    一般論を書き出すと本が一冊できてしまいますが,『.NET&Windows プログラマのためのデバッグテクニック徹底解説』が詳しく書かれていておすすめです.

    2007年12月19日 4:23
  • NyaRuRuさん

     

    いつもお世話になります。mkmarimoです。

     

     NyaRuRu さんからの引用

    mkmarimoさんに「2ファイルがあれば、デバッグ可能」と仰った方が何を想定していたかが正確に分からないので何とも言えませんが,デバッガの役に立つのは事実で,一般論として重要なビルドごとに PDB ファイルを残しておくことが推奨されます.

     

    確かに、重要なビルドごとでPDBを残すという話はよく聞きます。

    では、PDBを残しておくと、後でどのように使えるのかが知りたいのです。

     

     NyaRuRu さんからの引用

    私も実際,PDB ファイルのない DLL を苦労しながらデバッガで追いかけたことが何度もあります.

     

    と仰るということは、PDBがあれば、ないより楽にデバッグ可能ということですよね?

    そのデバッグの方法を具体的に知りたいのですが、どうするのでしょうか。

    普通にDLLとPDBを同一フォルダに置いて、VS上でEXEのプログラムからDLLのコードにステップインできると

    いうことでしょうか。

     

    質問してばかりで申し訳ありませんが、よろしくお願いします。

    2007年12月19日 7:54
  •  mkmarimo さんからの引用

    確かに、重要なビルドごとでPDBを残すという話はよく聞きます。

    では、PDBを残しておくと、後でどのように使えるのかが知りたいのです。

     

    ※マネージの世界は詳しくないので以下はアンマネージの話です

     

    使うシチュエーションとしてはアプリをユーザが使用中に

    アプリケーションエラーが発生し、ワトソン博士によってダンプファイルが生成される場合があります。

    生成されたダンプファイルを送ってもらい、WinDBGを使ってダンプファイルの

    解析を行う場合にPDBが必要になります。

     

     mkmarimo さんからの引用

    普通にDLLとPDBを同一フォルダに置いて、VS上でEXEのプログラムからDLLのコードにステップインできると

    いうことでしょうか。

    はい、できます。

    ただしVSからDLLのコードにステップインするためにはDLL、PDBに加えソースファイルが必要です。

    また、ソースファイルはPDBに記録されているパス(DLLを生成したときのソースファイルのパス)に置いてないと

    ステップインできません

    2007年12月19日 11:35
  •  mkmarimo さんからの引用
    確かに、重要なビルドごとでPDBを残すという話はよく聞きます。

    では、PDBを残しておくと、後でどのように使えるのかが知りたいのです。

     

    と仰るということは、PDBがあれば、ないより楽にデバッグ可能ということですよね?

    そのデバッグの方法を具体的に知りたいのですが、どうするのでしょうか。

     

    通常,EXE ファイルのフォルダに置いておくだけで,デバッガが読み込んでくれます.特に操作は必要ありません.

    デバッグシンボル (PDB ファイル) が読み込まれたバイナリは,「出力」ペインに「シンボルが読み込まれました」と表示されるはずです.これが表示されれば十分で,他にすることはありません.

    あるいは,デバッグ中にメニューから「デバッグ」→「ウィンドウ」→「モジュール」と選択し,興味のあるモジュールについて「シンボルの状態」を見てみて下さい.「シンボルが読み込まれました」と書かれていれば,PDB ファイルは正しく機能しています.

     

    恐らく,ソースコードが存在しないプログラムでも,同じディレクトリに PDB ファイルを置いておけば,シンボルはきちんと読み込まれているかと思います.

     

     mkmarimo さんからの引用
    普通にDLLとPDBを同一フォルダに置いて、VS上でEXEのプログラムからDLLのコードにステップインできるということでしょうか。

     

    いいえ.

    C.John さんも書かれていますが,ソースコード上でのステップ実行はソースコードが必要です.

     

    前回も書きましたが,PDB ファイルの重要性は言語に依存する話です.mkmarimo さんが興味がある言語が何なのか分からないので一般論しか書けませんが,C/C++ などのネイティブコード開発では,PDB ファイルのシンボル情報は,ソースコードが無かったとしても非常に有用です.

    一方,C#/Visual Basic などのマネージコード開発では,EXE/DLL に十分な情報が含まれているので,重要性はそこまで高くないかもしれませんが,全く無意味というわけでもありません.例えば,ソースコードが無くてPDB ファイルのみがあった場合でも,スタック変数の名前だけは分かります.ソースコードが無くて PDB ファイルのみがある状態で,デバッグ中にメニューから「デバッグ」→「ウィンドウ」→「ローカル」と表示してみれば分かります.PDB ファイルがなければ,スタック変数の名前も分からなくなります.

    2007年12月19日 16:01
  • みなさま

     

    お世話になります。mkmarimoです。

     

    ご回答ありがとうございます。

    私の知らなかった情報がたくさん書かれており、非常に参考になりました。

     

    Tom Yamaさんの書き込みも真摯に受け止め、これから実際に試してみます。

     

    以上、ありがとうございました。

    また、ご質問させていただくことがあるかと思いますが、よろしくお願いします。

    2007年12月20日 2:39