zl程序教程

您现在的位置是:首页 >  工具

当前栏目

QT + VS + CUDA 没有console无法输出调试信息的解决办法

Qtvs输出 无法 没有 解决办法 CUDA Console
2023-09-27 14:28:32 时间

背景:QT+CUDA开发,从QCreator转到VS,遇到了两个问题:

1. QT项目运行后只有UI界面,没有Console界面,无法输出调试信息

2. 调出Console界面后只能输出CUDA核函数的printf信息,其他位置的printf信息无法输出

原文地址:使用AllocConsole在Win32程序中调用控制台调试输出 - 慕Smile - 博客园

操作流程:

        1. 打开控制台

        2. 重定向输出流

        3. 输出信息

代码:

AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "This is a test info" << std::endl;

相关函数说明:

AllocConsole函数的功能是为当前的窗口程序申请一个Console窗口,其原型为

BOOL AllocConsole(void);

函数调用成功,返回非零值,调用不成功则返回0。

freopen函数用来替换一个流,或者说重新分配文件指针,以实现重定向。可重定向的流有:标准输入流、标准输出流或者标准错误流。其函数原型为

FILE *freopen(const char *path, const char *mode, FILE *stream);

其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。

比较神奇的是,在三台电脑上进行了测试,其中一台电脑不需要freopen就可以直接输出所有的printf信息,另外两台可以输出cuda核函数内的printf信息(需要cudaDeviceSyn函数),但无法输出核函数外的printf信息。

添加freopen函数后解决。

补充:

printf延迟输出的解决方案:

1.设置缓存区为0

setbuf(stdout, NULL);

2.刷新缓存区

fflush(stdout);