几年之前,研究过 EDK2 的调试信息输出的问题【参考1】【参考2】。最近偶然之间发现目前的 EDK2 的 EmulatorPkg 生成的 WinHost.exe 无法使用“>>”进行输出重定向。这次针对这个问题进行研究。
首先说说具体的现象。使用 winhost >> out.txt 命令,尝试抓取Debug 信息,仍然能在屏幕上看到 Debug 信息:
打开 out.txt 可以看到抓到了部分的信息:
根据之前的知识,我们在 EmulatorPkg 中搜索 STD_OUTPUT_HANDLE,可以找到三个位置:
1. \EmulatorPkg\Win\Host\WinHost.c 中的SecPrint() 函数,我们在其中加入 strcat(Buffer,”DBG0″)
2. \EmulatorPkg\Win\Host\WinThunk.c 中的SecWriteStdErr() 函数,我们加入
NumberOfBytes=NumberOfBytes+4;
strcat(Buffer,”DBG1″);
3. \EmulatorPkg\Win\Host\WinThunk.c中的SecWriteStdOut() 函数,我们加入
NumberOfBytes=NumberOfBytes+4;
strcat(Buffer,”DBG2″);
再次进行测试,在 OUT.TXT 中可以看到:
对应的屏幕可以看到如下输出:
所以,问题在于:
- WriteFile ( GetStdHandle (STD_OUTPUT_HANDLE),…….) 能够重定向到文件中
- WriteFile ( GetStdHandle (STD_ERROR_HANDLE),…….) 无法定向到文件中
如果将上面的2中的STD_ERROR_HANDLE,修改为STD_OUTPUT_HANDLE,即可重定向到文件中。
当然,遇到 Windows 相关问题,还是需要请教天杀,对此他给出了Microsoft的资料【参考3】,如果我们不想修改代码,那么可以直接使用下面的方式重定向到文件中:
WinHost 2 >>OUT.txt
有兴趣的朋友不妨自己动手试试。
参考:
- http://www.lab-z.com/stu82/ NT32Pkg的Debug Message
- http://www.lab-z.com/stu130nt32/ NT32 模拟器中的 Debug Message 输出
- https://learn.microsoft.com/zh-cn/troubleshoot/developer/visualstudio/cpp/language-compilers/redirecting-error-command-prompt