none
C++のソースがデバッグ時に表示できない RRS feed

  • 質問

  • C++とCでプログラミングしているのですが

    C言語の部分はブレイクできるのですが

    C++の部分はブレイクできません。

    .Net 2003のときはこのようなことはなかったとおもうのですが

    理由がわかりません。教えてください。C++の部分をCにかきかえるかまよってます。

     

    2006年2月19日 4:42

すべての返信

  • シンプルな C と C++ のプログラムを試しましたが、問題はないようです。簡単なサンプルコートをポストして頂けますか?
    2006年2月25日 19:49
  • すみませんありがとうございます。
    ソースを添付したかったのですがその方法がわからなかったため文章で書きます。
    CとC++とかいてますが
    ファイル名はどちらも.cppです。
    クラス記述したものがブレイクできません。

    以下のようにコンストラクタにbreakを張ってもとまりませんし
    クラスの定義でブレイクしてステップインしても逆アセンブル表示になります。

    例として
    --test.cpp---
    // mkbinary.cpp : DLL アプリケーションのエントリ ポイントを定義します。
    //

    #include "stdafx.h"
    #include "test.h"
    #include "cdib.h"
    #include "windowsx.h"
    #include "commctrl.h"

    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif

    #define MAX_LOADSTRING 100


    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            func();
            break;
        }
        hInst = hModule;

        return TRUE;
    }

    #ifdef _MANAGED
    #pragma managed(pop)
    #endif

    // これは、エクスポートされた変数の例です。
    //TEST_API int nmkbinary=0;

    // これは、エクスポートされた関数の例です。
    //TEST_API int fnmkbinary(void)
    //{
    //    return 42;
    //}

    // これは、エクスポートされたクラスのコンストラクタです。
    // クラス定義に関しては test.h を参照してください。
    Ctest::Ctest()
    {
        return;
    }
    void Func()
    {
        CDIB cdib; <-- ここにbreakして、ステップインしてもソースが逆アセンブル表示となる
    }
    --cdib.h--
    #ifndef    __DIB_H__
    #define    __DIB_H__
    #include <string>
    #include <vector>

    class CDIB
    {
    private:

    public:
        CDIB();
        ~CDIB();
    }
    #endif
    --cdib.cpp
    CDIB::CDIB()
    {
        HDC        hdc;
        int        nPlanes, nBitsPixel ;

        hdc = ::GetDC(0); <----ここにbreakをつけてもブレイクしない
        nPlanes = ::GetDeviceCaps( hdc, PLANES );
        nBitsPixel = ::GetDeviceCaps( hdc, BITSPIXEL );
    }
    CDIB::~CDIB()
    {
        int i;
        i = 0;
    }



    2006年2月26日 13:36
  • dumpbin.exe /pdbpath を使えば PDB の情報が分かります。例えば最新でない PDB であれば "PDB signature mismatch" と教えてくれます。
     
    D:\test>dumpbin /pdbpath:verbose test.exe
    Microsoft (R) COFF/PE Dumper Version 8.00.50727.39
    Copyright (C) Microsoft Corporation.  All rights reserved.
     

    Dump of file test.exe
     
    File Type: EXECUTABLE IMAGE
      PDB file 'D:\test\test.pdb' checked.  (PDB signature mismatch)
      PDB file 'D:\test\test.pdb' checked.  (PDB signature mismatch)
      PDB file 'C:\WINDOWS\symbols\exe\test.pdb' checked.  (File not found)
      PDB file 'C:\WINDOWS\exe\test.pdb' checked.  (File not found)
      PDB file 'C:\WINDOWS\test.pdb' checked.  (File not found)
     
      Summary
     
            2000 .data
            1000 .idata
            4000 .rdata
           16000 .text
     
    D:\test>
    2006年3月4日 1:21
  • ありがとうございます
    確認しましたが最新でした。
    クラスを静的ライブラリ(xxx.lib)に変更してdllに組み込みデバッグしたところ。

    ステップインで、以下のメッセージがでるようになり
    ソース ファイル: c:\My Documents\Visual Studio 2005\Projects\cdib\dib.cpp
    モジュール: D:\test\mkbinary.dll
    プロセス: [2712] test.exe
    ソース ファイルがモジュールがビルドされたときのものと異なります。
    デバッガでこのファイルを使用しますか?  「はい」、「いいえ」

    のダイアログが表示されるようになり、「はい」でデバッグできるようになりました。
    以降はデバッグできてます。



    2006年3月10日 4:37
  • VS2005の場合、下記のオプション設定のチェックを外してやってみてください。

    ツールー>オプションー>デバッグー>「元のバージョンと完全に一致するソースファイルを必要とする」

    2006年11月28日 14:17
  • まっくんさん

    クラスを静的ライブラリ(xxx.lib)に変更してdllに組み込みデバッグしたところ。
    と書いてありますが、クラスを静的ライブラリに変更というのは実際どのような作業をされたのですか?

    私も同じエラーで困っています。さらに素人なので何もわかりません。

    教えてください。

     

    2006年12月7日 2:07
  • 文脈からの推測ですが、(DLLではなく)LIBを作成し、それを静的リンクした、ということではないでしょうか。LIBのみの作り方はVC++ 2005 EE IDEにも用意されています。

    文脈を外していたらごめんなさい。


    豊田孝
    2006年12月14日 0:25