如何在debugging模式下执行控制台应用程序后使Visual Studio暂停?

我有一个我想作为控制台应用程序运行的boostunit testing集合。

当我在项目上工作,我运行testing,我希望能够debuggingtesting,我希望在testing运行后保持打开控制台。

我看到,如果我运行在释放模式下,控制台窗口会在程序退出后保持运行状态,但在debugging模式下情况并非如此。

我不想添加“系统(”暂停“);” 或任何其他黑客喜欢读一个字符到我的程序。 我只想让Visual Studio在运行testing之后暂停,就像在发布模式下运行一样。 如果testing的输出是在Visual Studio的一个输出窗口中捕获的,但是也似乎比应该更难。

我怎样才能做到这一点?

boosttesting为visual studio提供了以下使用build议,使您可以在编译结束时自动运行unit testing,并将输出捕获到构build窗口中。

这个技巧的好处在于它使您能够将testing失败视为编译错误。 “…你可以跳过这些错误使用通常的键盘快捷键/鼠标点击你用于编译错误分析…”

尝试使用Ctrl + F5组合运行应用程序。

http://connect.microsoft.com/VisualStudio/feedback/details/540969/missing-press-any-key-to-continue-when-lauching-with-ctrl-f5

在旧版本中,即使您select了“空项目”,2010年也不会默认为控制台子系统,因此您必须手动进行设置。 要做到这一点,在解决scheme资源pipe理器的左侧或右侧(可能已被选中,所以你不必担心这个)的项目。 然后从菜单栏下拉菜单中select“项目”,然后select“ project_name属性”>“configuration属性”>“链接器”>“系统”,并设置第一个属性,下拉“子系统”属性为“子系统:CONSOLE)”。 控制台窗口现在应该照常执行后保持打开状态。

在最后一行代码上设置一个断点。

刚刚从http://social.msdn.microsoft.com/forums/en-US/Vsexpressvc/thread/1555ce45-8313-4669-a31e-b95b5d28c787/?prof=required复制:;

以下为我工作:-)

////////////////////////////////////////////////// ///////////////////////////////////这是控制台可能消失的另一个原因和解决scheme。

使用新的Visual Studio 2010,即使在使用ctrl f5 aka“start without debugging”的情况下,您也可能会看到此行为。 这很可能是因为您创build了“空项目”而不是“Win32控制台应用程序”。 如果您创build该项目作为“Win32控制台应用程序”,您可以忽略此,因为它不适用。

在旧版本中,即使您select了“空项目”,但在2010年也不会默认为控制台子系统,因此您必须手动进行设置。 要做到这一点,在解决scheme资源pipe理器的左侧或右侧(可能已被选中,所以你不必担心这个)的项目。 然后从菜单栏下拉菜单中select“项目”,然后select“* project_name * properties”>“configuration属性”>“链接器”>“系统”,并设置第一个属性,下拉“子系统”属性为“控制台(/ SUBSYSTEM:CONSOLE)”。 控制台窗口现在应该照常执行后保持打开状态。

////////////////////////////////////////////////// ///////////////////////////////////

如果它是一个控制台应用程序,请使用Ctrl + F5

为什么不使用系统(“暂停”)黑客?

如果这是因为你不希望程序在没有被debugging时提示,那么有一个办法。 这适用于我:

 void pause () { system ("pause"); } int main (int argc, char ** argv) { // If "launched", then don't let the console close at the end until the // user has seen the report. // (See the MSDN ConGUI sample code) // do { HANDLE hConsoleOutput = ::GetStdHandle (STD_OUTPUT_HANDLE); if (INVALID_HANDLE_VALUE == hConsoleOutput) break; CONSOLE_SCREEN_BUFFER_INFO csbi; if (0 == ::GetConsoleScreenBufferInfo (hConsoleOutput, &csbi)) break; if (0 != csbi.dwCursorPosition.X) break; if (0 != csbi.dwCursorPosition.Y) break; if (csbi.dwSize.X <= 0) break; if (csbi.dwSize.Y <= 0) break; atexit (pause); } while (0); 

我只是把这个代码粘贴到我正在写的每个新的控制台应用程序 如果程序从命令窗口运行,光标位置不会是<0,0>,它不会调用atexit()。 如果它已经从你的debugging器(任何debugging器)启动,那么控制台的光标位置将会是<0,0>,并执行atexit()调用。

我从一个曾经在MSDN库中的示例程序中得到了这个想法,但是我认为它已经被删除了。

编辑添加: System()例程的Microsft VS实现需要COMSPEC环境variables来标识命令行解释器。 如果这个环境variables搞砸了 – 例如,如果你在Visual Studio项目的debugging属性中遇到了一个问题,那么当程序启动时环境variables没有被正确地传递下去,那么它就会失败。

在Boost.Test中,有一个–auto_start_dbg参数用于在testing失败时(在exception或断言失败时)进入debugging器。 由于某种原因,它不适合我。

http://www.boost.org/doc/libs/1_40_0/libs/test/doc/html/utf/usage-recommendations/dot-net-specific.html

因为这个原因,我创build了自定义的test_observer,当断言失败或exception时,它将打入debugging器。 当我们在debugging器下运行时,这在debugging版本上启用。

在我的unit testingEXE的源文件之一,我已经添加了这个代码:

 #ifdef _DEBUG #include <boost/test/framework.hpp> #include <boost/test/test_observer.hpp> struct BoostUnitTestCrtBreakpointInDebug: boost::unit_test::test_observer { BoostUnitTestCrtBreakpointInDebug() { boost::unit_test::framework::register_observer(*this); } virtual ~BoostUnitTestCrtBreakpointInDebug() { boost::unit_test::framework::deregister_observer(*this); } virtual void assertion_result( bool passed /* passed */ ) { if (!passed) BreakIfInDebugger(); } virtual void exception_caught( boost::execution_exception const& ) { BreakIfInDebugger(); } void BreakIfInDebugger() { if (IsDebuggerPresent()) { /** * Hello, I know you are here staring at the debugger :) * * If you got here then there is exception in your unit test code. * Walk the call stack to find the actual cause. */ _CrtDbgBreak(); } } }; BOOST_GLOBAL_FIXTURE(BoostUnitTestCrtBreakpointInDebug); #endif 

这实际上是更多的努力,但你可以build立在VS.Net,从常规命令行(CMD.EXE)运行,然后附加到开始运行后的过程。 这可能不是你正在寻找的解决scheme。

我会在你自己select的特定时间(毫秒)内使用“等待”命令。 应用程序执行直到您要检查的行,然后在时间过期后继续。

包含<time.h>标题

 clock_t wait; wait = clock(); while (clock() <= (wait + 5000)); // Wait for 5 seconds and then continue wait=0; 

如何使用日志库,如log4net,并将其login到文件appender?

您还可以将您的可执行文件设置为外部工具,并将该工具标记为“ 使用输出”窗口 。 这样,工具的输出将在Visual Studio本身中可见,而不是单独的窗口。

我用F11启动应用程序,并在unit_test_main.ipp(可以是汇编代码)中的某处获取断点。 我使用shift-f11(步出)来运行unit testing,并在CRT中获取下一个汇编指令(通常在mainCRTStartup()中)。 我使用F9在该指令中设置断点。

在下一次调用时,我可以用F5启动应用程序,运行testing后应用程序将中断,因此让我有机会窥视控制台窗口

或者你可以使用boost_test“testing日志输出”。

http://www.boost.org/doc/libs/1_47_0/libs/test/doc/html/utf/user-guide/test-output/test-log.html

那么,控制台窗口是否显示出来并不重要,而且构build日志logging可以将unit testing输出保存为失败构build时检查的工件。

添加下面的行将执行一个简单的MS-DOS pause显示没有消息。

 system("pause >nul | set /p \"=\""); 

而且不需要按Ctrl + F5 (这会使你的应用程序以Release模式运行)

在最后做一个readline,(就像我们在哥伦比亚说的那样,它是“forma cochina”,但它起作用)

 static void Main(string[] args) { . . . String temp = Console.ReadLine(); }