プロが教える店舗&オフィスのセキュリティ対策術

VisualStudio2005で中断した際の変数参照値がおかしい。
お世話になります。ちょっと言葉がみつからなくて、説明がめちゃくちゃになってしまいそうですが、よろしくお願いします。
現在、VS2005でC++の開発を行っているのですが、あまり深い開発をしたことが無く、VSの環境設定や機能などをいじったことが一度もありません。そのせいなのかは分かりませんが、ソースの流れを追う為に、ブレークポイントで中断して、変数の値を参照できる機能で(この機能をどう呼ぶのかも知りません)、変数の中身をチェックしていたのですが、どうにも参照できた値がおかしいのです。
例えば、

int i=0;
int j=0;

for(i=0;i<5;i++){
j++; //ここでブレーク
}

という簡単なソースを実行させます。そしてiとjの値を参照すると、中身が「i:40196」「j:40265」という感じになってしまいます。ポインタか何かの値になってしまっているのかと思ったのですが、それらしきものも見当たりません。ちなみにループはちゃんと回数分回ります。
ほかにも、変数そのものが参照できなかったり、ソースそのものはちゃんと動作しているのに、値が「不適切です」になっていたり……。
これはVS2005の環境設定ミスなのでしょうか。それとも私が根本的に間違っているのでしょうか。動作しないならまだいいのですが、正常に動いてしまうから混乱しています。

分かりづらい文章ですが、よろしくお願いします。

A 回答 (5件)

Debug|Win32のコンフィグが変ですね。

大半のパラメータが出ていません。
画像を添えますので同じか確認してみてください。
「VisualStudio2005で中断し」の回答画像5
    • good
    • 0
この回答へのお礼

直りました! すばらしい!
なるほど。やはり環境設定だったのですね。うーん。ツールの設定くらい、ちゃんと覚えたほうがいいですね。結局は今回、何をしたのかよくわからないです。いつ設定いじったのかも覚えていない始末……。ですがいい薬になりました! もっと設定をいじり倒して、覚えていきたいと思います。
何から何まで丁寧に教えてくださってありがとうございました!

お礼日時:2010/08/19 17:13

異常な値が出るコンパクトな再現コードの用意とvcprojファイルをメモ帳で開いたテキストコードを見せてもらって良いですか?



こちらでのWin32コンソールで新規に作った場合のvcprojのConfigurationsを参考にみせますね。
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>

この回答への補足

なんだかすごいお手間をおかけしてすみません;;

■proj
<?xml version="1.0" encoding="shift_jis"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="testproj"
ProjectGUID="{省略}"
>
<Platforms><PlatformName="Win32"/></Platforms>
<ToolFiles></ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<ToolName="VCPreBuildEventTool"/>
<ToolName="VCCustomBuildTool"/>
<ToolName="VCXMLDataGeneratorTool"/>
<ToolName="VCWebServiceProxyGeneratorTool"/>
<ToolName="VCMIDLTool"/>
<Tool
Name="VCCLCompilerTool"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<ToolName="VCManagedResourceCompilerTool"/>
<ToolName="VCResourceCompilerTool"/>
<ToolName="VCPreLinkEventTool"/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
/>
<ToolName="VCALinkTool"/>
<ToolName="VCManifestTool"/>
<ToolName="VCXDCMakeTool"/>
<ToolName="VCBscMakeTool"/>
<ToolName="VCFxCopTool"/>
<ToolName="VCAppVerifierTool"/>
<ToolName="VCWebDeploymentTool"/>
<ToolName="VCPostBuildEventTool"/>
</Configuration>
</Configurations>

■ソース
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
DWORD i,j;
MSG msg; HWND hWnd;
WNDCLASSEX wcex={sizeof(WNDCLASSEX),CS_HREDRAW|CS_VREDRAW,WndProc,0,0,hInstance,NULL,NULL,(HBRUSH)(COLOR_WINDOW+1),NULL,(_TCHAR*)gName,NULL};
if(!RegisterClassEx(&wcex))
return 0;
DWORD WndStyle WS_OVERLAPPEDWINDOW&~(WS_MAXIMIZEBOX|WS_SIZEBOX);
RECT WndRect={0,0,600,600};
AdjustWindowRect(&WndRect,WndStyle,false);
if(!(hWnd=CreateWindow(gName,gName,WndStyle,CW_USEDEFAULT,0,WndRect.right-WndRect.left,WndRect.bottom-WndRect.top,NULL,NULL,hInstance,NULL)))
return 0;
ShowWindow(hWnd,SW_SHOW);
do{
if(GetAsyncKeyState(VK_ESCAPE))
PostQuitMessage(0);
i++;
j++;
}while(msg.message!=WM_QUIT);
return 0;
}

ソースは無理がありました。手掛かりにはならないかもです。

補足日時:2010/08/19 13:31
    • good
    • 0

・新規のプロジェクトを作っても同じ問題がありますか?


・どのプロジェクトで作業していますか?
どうにも分かりませんので、そこの問題に至るまので新規作成から、デバッグ実行までの手順を書いてください。

この回答への補足

何度も申し訳ないです。
手順としては、

・「ファイル」⇒「新規作成」⇒「プロジェクト」⇒「空のプロジェクト」⇒作成
・ボーンプログラムをプロジェクトに参加させる
・一度実行して空のウインドウが表示されるか確認する
・中に処理を書き込む
・動作確認がしたいのでブレークして変数を見たら、おかしいことに気が付く

といった感じでした。
これといっておかしなことはしていないつもりなのですが……。

>新規のプロジェクトを作っても同じ問題がありますか?

試しに新規でWin32プロジェクトを作成してみたのですが、変数などの代入は問題なく参照できるのですが、一部、ポインタやマクロの数値が取れないみたいです。

動作に問題はないので、問題ないと言えば問題ないのですが……なんだか気持ちが悪くて仕方がないです。参照できないのでウォッチリストに正しい値が入らず、作業効率がどうにも悪いです。

補足日時:2010/08/19 11:10
    • good
    • 0

リビルドは試されましたか?

この回答への補足

リビルドもしました。debugフォルダも一度丸ごと削除してみましたが、結果は同じです。PCを別のにしても変わらないので、何か別なものが原因な気がします。

補足日時:2010/08/19 08:43
    • good
    • 0

Releaseビルドだとデバッガの変数値は正しくないことが多いです。

Debugビルドでしょうか?

この回答への補足

Debugです。Releaseも試しましたが同じでした。

補足日時:2010/08/18 18:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!