Stdout redirection and capture
We were recently asked if Memory Validator could handle monitoring a program that took it’s input from a file and wrote its’ output to a file. As shown in the following example.
redirect.exe < input.txt > output.txt
Our tools could handle this, but it wasn’t obvious that they could. Also for interactive use there was no easy way to do this via the launch dialog, unless you were using Coverage Validator. We had to make changes to most of our tools so that they could do what Coverage Validator could do. All tools had a new diagnostic sub-tab added so that stdout data that was captured (an option) could be viewed.
In this article I’m going to explain how to launch a program that reads from stdin and/or writes to stdout using our tools. Although I’m talking about Memory Validator, these techniques apply to all our Validator tools.
There are four ways of doing this.
- Start your program from a batch file, putting the redirect of stdin and stdout in the batch file.
- Start your program from the launch dialog/wizard, specifying the input and output files on the launch wizard.
- Start your program from the command line, specifying the input and output files on the command line.
- Use the Memory Validator API to start Memory Validator from inside the target program.
Batch File
Using a batch file to do this is easy. Simply create your batch file in the form shown in the example below.
e:\redirect\release\redirect.exe < e:\test\input.txt > e:\test\output.txt
Save the batch file with a known name. In this example I’ll save the batch file in e:\test\redirectTest.bat. Then launch the batch file from Memory Validator (or another Validator tool). The first program launched by the batch file will be monitored.
Launch Dialog/Wizard
We modified the launch wizard and the launch dialog to include fields for an optional input file and an optional output file. We also added an option that would capture stdout so that you could view the output on the diagnostic tab.
This example shows the program testAppTheReadsFromStdinAndWritesToStdout.exe being launched, reading from e:\test\input.txt, and writing to reading from e:\test\output.txt.
The stdout capture checkbox has been selected. This will mean a copy of stdout will be captured and displayed on the diagnostic sub-tab stdout.
Command Line
For command line operation we need two new options -stdin and -stdout, each of which takes a filename for an argument.
There are two additional arguments that you can supply to tell Memory validator to ignore missing input files and missing output files: -ignoreMissingStdin and -ignoreMissingStdout.
memoryValidator.exe -program e:\redirect\release\redirect.exe -directory e:\redirect\release -stdin e:\test\input.txt -stdout e:\test\output.txt -showErrorsWithMessageBox
API
You can use the Memory Validator API to start Memory Validator each time the target program is run. In that case just running the following command on the command prompt would cause Memory Validator monitor the target program redirect.exe.
e:\redirect\release\redirect.exe < e:\test\input.txt > e:\test\output.txt
To use the Memory Validator API with a particular application, the following steps outline the minimum steps required.
- Link to svlMemoryValidatorStub.lib (_x64.lib for x64)
- Link to svlMemoryValidatorStubLib.lib (_x64.lib for x64)
- #include “stublib.h”
- call startProfiler(); at the start of your program
- See documentation in the help file for more details.
For other Validator tools the library names will change. See the documentation (topic API) for the particular tool for details.
Conclusion
There are four ways you can work with stdin and stdout with our Validator tools.
You can work with batch files, launch interactively using the launch dialog/wizard, work from the command line, and use the Validator API.