none
グローバル変数がウォッチできません RRS feed

  • 質問

  • VS2010_SP1 C++ Windowsフォームアプリケーションで開発を行っています(初心者です)
    グローバル領域に定義した構造体のメンバーが正しくウォッチ出来ません。
    VS2008 C++ Windowsフォームアプリケーションを借りて同等のプログラムを試してみたのですが同じ症状でした。
    何が悪いのかがよく分かりません。プログラムや動作環境の修正方法などご指導いただきたいと思います。

    書き込みに関しても初心者ですので、どこまで記載すればよいのかよく分かりません。
    不足内容や不自然な内容等ございましたら、その点に関してもアドバイス等をお願いします。

    //-------------------------------
    //「button1」がクリックされた時に問題の関数を実行しています。
    //-------------------------------

    /* Form1.h 抜粋*/

    #include    "test.h"
    /* 省略 */
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        ftest();
    }

     

    /* test.cpp 全体*/

    #include    "StdAfx.h"
    #include    "test.h"
    TEST_TEST    test_test;
    void    ftest(void);
    void    ftest(void){
        test_test.vul_test01 = 1;//①
       
        if(test_test.vul_test01 == 1){//②
            test_test.vul_test02 = 2;//③
        }
        else {
            test_test.vul_test02 = 12;
        }
    }

     

    /* test.h 全体*/

    typedef struct tagTest {
        unsigned long vul_test01;
        unsigned long vul_test02;
        unsigned long vul_test03;
        unsigned long vul_test04;
        unsigned long vul_test05;
        unsigned long vul_test06;
    } TEST_TEST;
    extern    TEST_TEST    test_test;
    extern    void    ftest(void);

    //
    私の環境では、関数「ftest()」内で①をステップ実行すると
    ウォッチウィンドウ上では「test_test.vul_test02」に「1」が格納されます。
    この際に「test_test.vul_test01」には不定値が入っています。

    その後②を経過後③が実行されるのですが、ウォッチウィンドウ上では
    「test_test.vul_test03」に「2」が入ります。

    症状からしてリード時、ライト時には同じアドレスを参照しているようなのですが、
    ウォッチウィンドウが参照しているアドレスが4Byteずれているように感じます。
    しかし、VS2008でも同じ症状ですので、文法的に問題があるのかもしれないとも思っています。

    VS2010はSP1がリリースされていますので、SP1でも試しましたが変化がありませんでした。

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

     

    2011年3月18日 8:07

回答

  • 確認しました。
    同じCodeをWin32 Native Applicationで確認すると再現せず、C++/CLIだと再現します。

       TEST_TEST *p = &test_test;
    上記のようにPointer経由だと正しく表示されます。

    Debuggerの不具合だと思われます。
    Connectを検索してみて似たような投稿が見つからなければ、新規に投稿してみては如何でしょうか。

    >文法的に問題があるのかもしれないとも思っています。
    問題ないです。

    • 回答としてマーク 山本春海 2011年3月31日 8:52
    2011年3月18日 9:10

すべての返信

  • 確認しました。
    同じCodeをWin32 Native Applicationで確認すると再現せず、C++/CLIだと再現します。

       TEST_TEST *p = &test_test;
    上記のようにPointer経由だと正しく表示されます。

    Debuggerの不具合だと思われます。
    Connectを検索してみて似たような投稿が見つからなければ、新規に投稿してみては如何でしょうか。

    >文法的に問題があるのかもしれないとも思っています。
    問題ないです。

    • 回答としてマーク 山本春海 2011年3月31日 8:52
    2011年3月18日 9:10
  • >kozz さん

    早速の検証、ありがとうございました。
    VSを利用し始めたばかりなので、自分が行っている操作自体にも自信が持てない状況でした。

    類似投稿を確認した後に、Connectに「バグ報告」としてフィードバックしたいと思います。

    簡易的な対策として以下を実施してみたいと思います。

    ①関数内にバッファとしてローカル変数(vul_buf)を用意する。
    ②目的のグローバル変数(test_test.vul_test01)に代入を行う。
    ③同等の代入をローカル変数バッファ(vul_buf)にも行う。
    ④「test_test.vul_test01」と「vul_buf」が等しいことプログラム上でを確認する。
    (等しくない場合は自作のエラー関数をコールし、エラー時の処理を実行する。)

     

    2011年3月22日 1:10
  • managed code(value struct)に変更すると現象が出ませんね。
    unmanaged codeである必要がなければ、managed codeへの変更を検討するのも良いかと思います。

    2011年3月22日 9:41
  • こんにちは、ザムライ さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    kozz さんからの情報が参考になったようでしたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    kozz さん、ありがとうございます。

    Connect のほうに登録されるとのことですが、結果などわかりましたらフィードバックいただけるとうれしいです。

    今後とも、MSDN フォーラムをよろしくお願いいたします。
                                                                                                                                                        
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年3月31日 8:53