C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: デバッグ中enumが未定義の値になる


(過去ログ 52 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■28577 / inTopicNo.1)  デバッグ中enumが未定義の値になる
  
□投稿者/ akt (6回)-(2008/11/28(Fri) 00:38:12)

分類:[C++/CLI] 

お世話になっております。

enum列挙型変数がデバッグでブレークポイントで止めて、ウォッチウィンドウを見ると、
<未定義の値>になり、値がわかりません。

環境はVisual Studio 2005 Ver.8.0.50727.762 (SP050727-7600)です。

【再現方法】
1. 新規作成→プロジェクト→Windows フォームアプリケーション
2. Form1.hに以下のenum_t列挙型を追加
#pragma once

enum enum_t
{
    first = 0,
    second,
    third
};

namespace test_proj {
・・・

3. Form1.hのコンストラクタ(30行目くらい)に以下を追加

Form1(void)
{
    InitializeComponent();
    //
    //TODO: ・・・
    //
    enum_t val;

    val = first;     ←ここでブレークポイント
}

4. 上記ブレークポイントを貼ってデバッグ実行

5. 自動変数ウィンドウ、ローカルウィンドウを見るとvalが<未定義の値>になっている

ウォッチウィンドウに
*&val
と入力すると、一応0と評価されていました。

ネットで調べたところ、近いところで以下のようなものが見つかりました。
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-28361.htm
しかし、上記のことをおこなっただけなので、ソースコードの規模が大きいわけではありません。

Visual Studio 2005ではenumの値はウォッチできないのでしょうか。

元々はもう少し規模の大きいプログラミングをしているとき、ふとenumをウォッチしようとしたら
ことごとく<未定義の値>になっており、何かプロジェクトの設定を変えてしまったかと思い、
切り分けをしている内に上記のように再現できた次第です。

よろしくお願い致します。

引用返信 編集キー/
■28579 / inTopicNo.2)  Re[1]: デバッグ中enumが未定義の値になる
□投稿者/ dogatana (13回)-(2008/11/28(Fri) 00:50:01)
No28577 (akt さん) に返信
> enum_t val;
> val = first; ←ここでブレークポイント
> 4. 上記ブレークポイントを貼ってデバッグ実行
> 5. 自動変数ウィンドウ、ローカルウィンドウを見るとvalが<未定義の値>になっている
>
> ウォッチウィンドウに
> *&val
> と入力すると、一応0と評価されていました。

enum_t val; では初期値を設定してないため、未定義になってるということはないですか?
この行でブレイクポイントを設定すると、valにfirstを代入する前に止まると思うのですが、
ステップ実行してやると値が表示されませんかね?

> Visual Studio 2005ではenumの値はウォッチできないのでしょうか。

このvalは自動変数なので、寿命はその関数が実行中となるため、常に見えるわけではないと想像。

#VisualStudioのIDEは使ってません ^^;

引用返信 編集キー/
■28581 / inTopicNo.3)  Re[2]: デバッグ中enumが未定義の値になる
□投稿者/ akt (7回)-(2008/11/28(Fri) 01:05:38)
No28579 (dogatana さん) に返信
> このvalは自動変数なので、寿命はその関数が実行中となるため、常に見えるわけではないと想像。
すみません。ブレークポイントの位置を書き間違えました。
さすがに初期化前は未定義になります。
実際は、その次の
enum_t val;

val = first;
} ←ここです。
当然、代入は行われているはずです。
ウォッチで&*valとみたときに値が 0と赤くなっていたので、直前に値が変わったことを示していると思われます。
しかし、valで見ると<未定義の値>になるのです。
引用返信 編集キー/
■28772 / inTopicNo.4)  Re[3]: デバッグ中enumが未定義の値になる
□投稿者/ dogatana (18回)-(2008/11/30(Sun) 20:08:15)
No28581 (akt さん) に返信
> ■No28579 (dogatana さん) に返信
>>このvalは自動変数なので、寿命はその関数が実行中となるため、常に見えるわけではないと想像。
> すみません。ブレークポイントの位置を書き間違えました。
> さすがに初期化前は未定義になります。
> 実際は、その次の
> enum_t val;
>
> val = first;
> } ←ここです。
> 当然、代入は行われているはずです。
> ウォッチで&*valとみたときに値が 0と赤くなっていたので、直前に値が変わったことを示していると思われます。
> しかし、valで見ると<未定義の値>になるのです。

想像で言うのも何なので、IDEを使ってみました。^^

Win32コンソールプロジェクトで見るとenumの実際の値(first)が出ました。
他の関数に実行が移っている場合は、ウォッチウィンドウの該当エントリはグレーですね。

でも、CLRコンソール、CLR Windowsフォームアプリケーションだと、おっしゃる通り
<未定義の値>になりました。
ということで、CLRプログラムをデバッグするときの仕様なのでは?
特にオプション設定なども無いようですし。

引用返信 編集キー/
■28778 / inTopicNo.5)  Re[4]: デバッグ中enumが未定義の値になる
□投稿者/ akt (13回)-(2008/12/01(Mon) 00:08:38)
No28772 (dogatana さん) に返信
> 想像で言うのも何なので、IDEを使ってみました。^^
>
> Win32コンソールプロジェクトで見るとenumの実際の値(first)が出ました。
> 他の関数に実行が移っている場合は、ウォッチウィンドウの該当エントリはグレーですね。
>
> でも、CLRコンソール、CLR Windowsフォームアプリケーションだと、おっしゃる通り
> <未定義の値>になりました。
> ということで、CLRプログラムをデバッグするときの仕様なのでは?
> 特にオプション設定なども無いようですし。

わざわざ試して頂きありがとうございました。(レスが付かないと思っていたのでうれしいです。)
自分だけの現象かと思ったのですが、他環境でも再現するようでしたので、一安心?です。

元々これに気付いたのは、コンソール仕様(WIN32)で使っていたファイルを扱う自作クラスを
C++/CLIフォームアプリ環境で使ったときに、急にデバッガで値が見えなくなったことによります。
つまり、仰るようにWin32コンソールアプリのときはウォッチできていました。

これはIDEの仕様なのでしょうか・・・。(だとするとお粗末な仕様かと。)
CLRのクラスの列挙型ならば、普通にウォッチできていたと思うのですが。

現状は、MessageBoxなどでいちいち表示するのも面倒なので、ウォッチで
&*variable_name
で直接値を表示しておりますが、かなり面倒ですね。列挙型の名前で出力されてくれなくても良いので、
値が表示されて欲しいものです。

他にも同様の経験をされた方がいるかもしれないので、もう少しだけ解決をペンディングさせて頂けたらと思います。
レスが付かないと判断したら、解決に致します。

以上、よろしくお願い致します。
引用返信 編集キー/
■29061 / inTopicNo.6)  Re[5]: デバッグ中enumが未定義の値になる
□投稿者/ dogatana (23回)-(2008/12/03(Wed) 23:36:07)
No28778 (akt さん) に返信
> ■No28772 (dogatana さん) に返信
>>想像で言うのも何なので、IDEを使ってみました。^^
> 現状は、MessageBoxなどでいちいち表示するのも面倒なので、ウォッチで
> &*variable_name

これは、*&variable_nameではないかと思いますが、VisualStudio2005では&がつけられないと
文句をいわれてしまいます。

で、ダーティーな方法ですが、別途ウォッチ用に
int& debugVal = *(reinterpret_cast<int *>(&originalVal));
としてやり、debugValをウォッチすることが可能でした。

ここまでして見るかという話はありますが。

引用返信 編集キー/
■29273 / inTopicNo.7)  Re[6]: デバッグ中enumが未定義の値になる
□投稿者/ akt (14回)-(2008/12/06(Sat) 17:19:00)
No29061 (dogatana さん) に返信
> ■No28778 (akt さん) に返信
>>■No28772 (dogatana さん) に返信
> >>想像で言うのも何なので、IDEを使ってみました。^^
>>現状は、MessageBoxなどでいちいち表示するのも面倒なので、ウォッチで
>>&*variable_name
>
> これは、*&variable_nameではないかと思いますが、VisualStudio2005では&がつけられないと
> 文句をいわれてしまいます。
すみません。easy missです。(泣
仰るとおり*&varialbe_nameです。

> で、ダーティーな方法ですが、別途ウォッチ用に
> int& debugVal = *(reinterpret_cast<int *>(&originalVal));
> としてやり、debugValをウォッチすることが可能でした。
> ここまでして見るかという話はありますが。
そうですね。確かにウォッチで列挙値ではなくて即値でも良いので見れれば問題ないのですが、
なぜかVS2005では見れません。


これは、デバッガのバグだと思うのですが・・・。


返信頂いた方々、ありがとうございました。
自分だけの環境ではないことがわかり、安心しました。
機会があれば、VS2008を入れてどうなるか確かめてみようと思います。




解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -