我有一个Eclipse插件(A),它依赖于另一个插件(B).插件B只是一个jar包装器,它包含一个本机dll,并执行jni功能.鉴于此设置,我在A的Activator类的start方法中有以下代码:
MessageConsole jniConsole = new MessageConsole("Opereffa Output", null);
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { jniConsole });
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(jniConsole);
MessageConsoleStream stream = jniConsole.newMessageStream();
System.setOut(new PrintStream(stream));
System.setErr(new PrintStream(stream));
Run Code Online (Sandbox Code Playgroud)
当插件A执行其功能时,System.out的任何使用实际上都会进入Eclipse中的控制台.但是JNI使用的本机代码也会写入输出流,这是我无法抓取的.在开发期间,JNI的输出转到Eclipse实例的控制台,该实例已启动包含插件的运行实例.
那么如何获取JNI输出并在控制台中显示?
假设我们有一个函数将文本打印到控制台,我们无法控制源,但我们可以调用它.例如
void foo() {
std::cout<<"hello world"<<std::endl;
print_to_console(); // this could be printed from anything
}
Run Code Online (Sandbox Code Playgroud)
是否可以将上述函数的输出重定向到字符串而不更改函数本身?
我不是想通过终端这样做的方法
我正在开发一个使用记录器进行调试的大型项目。因为我喜欢跟踪某些 CUDA 内核中发生的事情,所以我试图找到一种方法将printf我的 CUDA 内核重定向到一个stringstream(或任何流),然后可以将其转发到记录器。
我设法通过使用以下代码来做到这一点:
#include <cuda.h>
#include <stdio.h>
#include <unistd.h> // dup
#include <iostream>
#include <sstream> // stringstream
#include <fstream> // ofstream
char* output_file = "printf_redirect.log";
__global__ void printf_redirect(int* src, int* res)
{
res[threadIdx.x] = threadIdx.x;
printf(" %i: Hello World!\n", res[threadIdx.x]);
}
int main()
{
using namespace std;
const uint N = 2;
// Note: dummy arrays are not actually used, but this should prevent the
// compiler from discarding the printf …Run Code Online (Sandbox Code Playgroud)