我在win32编码,我的程序实际上在vs中以调试模式工作,但不是在发布模式而不是在vs之外。
int _tmain(int argc, _TCHAR* argv[])
{
//assert that there are 3 parameters.
assert(argc==4);
LPCTSTR inputPath = argv[1];
LPCTSTR sharedName = argv[2];
LPCTSTR logPath = argv[3];
有时argc不正确(超过300000,而应该是4),有时是
LPCTSTR sharedName = argv[2];
行只是被忽略了!
当在发布模式下调试这个程序时,它跳过它,当在变量名称上面移动时没有任何反应。
右键单击变量并选择Add Watch时,我收到错误logPath CXX0017:错误:未找到符号“logPath”
当然,我已将vs中的命令参数设置为“a b c”(不带引号)
它可能是什么? 运行简化程序: // test.cpp:定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include "stdafx.h"
#include <windows.h>
#include <assert.h>
#include "conio.h"
int _tmain(int argc, _TCHAR* argv[])
{
assert(argc==4);
LPCTSTR inputPath = argv[1];
LPCTSTR sharedName = argv[2];
LPCTSTR logPath = argv[3];
_getch();
}
产生相同的结果。调试器只是跳转到getch行,如果我尝试添加watch,我会得到logPath CXX0017:错误:未找到符号“logPath”
inputPath CXX0017:错误:未找到符号“inputPath”
sharedName CXX0017:错误:未找到符号“sharedName”
答案 0 :(得分:4)
在发布模式下调试此程序时,它会跳过它,当在变量名称上面移动时没有任何反应。右键单击变量并选择“添加监视”时,出现错误logPath CXX0017:错误:未找到符号“logPath”
这些症状有意义。 “Release”模式告诉编译器启用优化,并且由于您从未使用您声明的变量,编译器可以帮助完全优化它们。如果您再也不会使用它,那么通过创建和分配某些内容的动作毫无意义。
这就是为什么它告诉你没有找到符号,因为它的定义已经过优化。
另一方面,“调试”模式它禁用优化。因此,它会经历创建这些变量并为其赋值的动作,即使您可能永远不会使用它们。这是调试模式的全部要点 - 因此您可以调试应用程序而不受编译器优化行为的干扰,即使它尚未完全编写。
如果您迫切希望在启用优化的情况下使其工作(例如,在“发布”模式下),那么您只需使用您指定的变量的值。这将阻止编译器优化它们。例如,您只需将字符串输出到调试器:
#include "stdafx.h"
#include <windows.h>
#include <assert.h>
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
assert(argc==4);
LPCTSTR inputPath = argv[1];
LPCTSTR sharedName = argv[2];
LPCTSTR logPath = argv[3];
OutputDebugString(inputPath);
OutputDebugString(sharedName);
OutputDebugString(logPath);
_getch();
}