在Visual Studio中,是否有可能访问远程GDB会话的stdout?我正在使用Visual Studio Visual C++ for Linux Development,并希望能够访问所有printf的数据。
在Visual Studio中,是否有可能访问远程GDB会话的stdout?我正在使用Visual Studio Visual C++ for Linux Development,并希望能够访问所有printf的数据。
在我看来,ssh/gdb管道的MSVC应该将stdout和stderr都传递到输出或调试窗口中,但至少在MSVC 2017版本15.3中没有这样做。希望微软以后会为我们实现这一点。
与此同时,在gdbserver模式下可以使用解决方法。被调试程序的stdout最终出现在ssh虚拟终端中。它可以通过将Debug/solution Properties/Debugging/Program Arguments设置为>/tmp/stdout
来重定向到/tmp/stdout
,然后可以通过tail -f /tmp/stdout
在另一个终端中查看。
另一种查看stdout的方法是在调试器启动时在单独的窗口中显示它,就像Win32 Console进程中出现的新控制台一样。这可以通过在运行相同机器上的X服务器上实现。例如,在Windows 7上Xming可以很好地工作(请注意,远程Linux机器必须允许在c:\Program Files (x86)\Xming\X0.hosts
中)。远程Linux机器上的X的DISPLAY
环境变量必须设置为调试Windows机器的显示,例如设置为192.168.1.10:0
。将Debug/solution Properties/Debugging/Pre-Launch Command设置为export DISPLAY=192.168.1.10:0
(将IP地址替换为您的Windows机器IP地址),或者通过export DISPLAY="`sed -e 's/ .*/:0/'<<<"$SSH_CLIENT"`"
让shell为您填充IP。这次通过将Debug/solution Properties/Debugging/Program Arguments设置为|xless -f
来管道stdout(在远程Linux机器上必须安装xless,例如通过apt-get install xless
)。
请注意,当重定向时,stdout并不总是由调试程序刷新新行,因此在main()
中的第一次调用setvbuf(stdout, NULL, _IONBF, 0)
会有所帮助。
还有一点需要注意的是,看起来stderr被MSVC调试管道吃掉了,因此无法重定向而不导致调试失败,但在main()
中使用stderr=stdout
会有所帮助。