我目前正在使用Visual Studio 2013.我之前从未使用调试器来处理我的C ++代码,但我曾经一直用它来编程我的MSP430。无论如何,我正在尝试重新编程并尝试使用调试器来逐步执行我的代码并遵循我的if / else语句的逻辑。当我尝试使用调试器来执行此操作时,一旦它开始进入所有预先编写的C ++代码,例如if,#include,ect等。我试图让我的调试器忽略所有标准的C ++幕后细节,然后单步执行我的代码。我搞砸了微软的“仅限我的代码”功能,但似乎无法让它按照我的意愿去做。最糟糕的情况是,我想我必须在我想要通过之后设置一个断点,但是如果有一个更简单的方法则很奇怪。谢谢!
更新:
以下是我用来测试您的建议的示例代码。
#include <iostream>
#include <string>
using namespace std;
int main(){
cout << "line one\n";
cout << "line one\n";
cout << "line one\n";
cout << "line one\n";
cout << "line one\n";
cout << "line one\n";
cout << "line one\n";
cout << "line one\n\n";
string input;
cin >> input;
cout << "line one";
cout << "line one";
cout << "line one";
return 0;
}
这没什么好看的,但是我试图从第一个cout语句开始,看到它显示在我的控制台窗口中,单击一个按钮,让它显示下一个cout语句,重复,重复一遍。
我确定我没有正确实施这些建议。当我尝试step out方法时,它最终会运行我所有的cout语句。这只是因为我正在尝试进行cout操作而不是逻辑树,例如if / whiles / ect?
这是不合逻辑的混乱,我实际上试图用这种方法来追踪我的逻辑路径。这是非常糟糕的代码,但在我废弃并重写之前,我试图弄清楚如何逐步完成它并追踪混乱。
#include <iostream>
#include <string>
using namespace std;
int main(){
string action;
bool running = 1;
int turn = 1;
while (running){
//display map
if (turn == 1){
//ask for user input
cout << "Choose a planet (ex: A1 or D4) or END turn: ";
cin >> action;
if (action == "END"){
if (turn == 1){
turn = 2;
}
else {
turn = 1;
}
}
}
else{
cout << "It is not your turn";
turn = 2;
}
//change players turn
}
return 0;
}
我正试图逐步完成我的嵌套条件,因为当我运行代码时,它只会打印“它不是你的回合”。我很确定我知道这样做的真正原因,但调试这个片段并不是问题的目的。 :)
答案 0 :(得分:0)
当使用MSVC调试器单步执行代码时,通常有两个选项(在设置断点或启动调试器并且程序以某种方式暂停后使用):
第一个详细输入到函数调用,运算符覆盖,对象构造中,并且在所有内容都“逐步完成”之前不会留下指令,而后者就是你想要的:只是跳过的“高级”概述可以分解指令并“跳转”到下一条指令的所有内容。
“我的代码”以前只是托管功能,但it seems they've enabled it for native C++ as well。这有助于避免使用大量不必要的条目来纠缠堆栈跟踪,但是步入和转出机制仍然存在。
编辑:以上工作 IFF 您的应用程序是在调试模式下编译的。发布模式是一个优化版本,适用于......向最终用户发布程序。这意味着它不会有调试信息,因此设置断点将无法按预期工作。
对于上面的代码:
确保您在调试模式下进行编译(可以通过进入项目属性进行更改)
在main()函数的第一个语句
启动调试器
当执行停止在您输入断点的行上时,按F10键跳到下一条指令
请注意,当您跳过控制台输入操作以便在终端屏幕上对某些内容进行数字处理时,执行将传递给程序。一旦输入换行符,它就会在调试器中恢复。
答案 1 :(得分:0)
除了在步入操作员或新的或不感兴趣的访问者后立即“踩出”之外,还有一个上下文菜单项“Step into ...”将显示一个对话框,询问哪个你真正想要介入的功能。当这种方法有效时(我的经验是它通常有点夸张),它将允许你完全绕过在调用感兴趣的函数调用之前使用的其他getter,operator等。
但是,有时候,最简单的方法是在要进入的函数中设置断点,然后继续。如果我需要反复进行,我发现这是最好的方法。