- Capture the STDERR output of 'clang' to a file for use with crash reporting.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55749 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2008-09-04 00:02:34 +00:00
Родитель 33ad012026
Коммит 9a3c7dae00
1 изменённых файлов: 28 добавлений и 12 удалений

Просмотреть файл

@ -32,7 +32,7 @@ sub GetPPExt {
}
sub ProcessClangFailure {
my ($Lang, $file, $Args, $HtmlDir, $ErrorType) = @_;
my ($Lang, $file, $Args, $HtmlDir, $ErrorType, $ofile) = @_;
my $Dir = "$HtmlDir/crashes";
mkpath $Dir;
my ($PPH, $PPFile) = tempfile("clang_crash_XXXXXX",
@ -46,6 +46,7 @@ sub ProcessClangFailure {
print OUT "$ErrorType\n";
print OUT "@$Args\n";
close OUT;
system 'mv',$ofile,"$PPFile.output";
}
##----------------------------------------------------------------------------##
@ -109,18 +110,33 @@ sub Analyze {
if (defined $ENV{'CCC_UBI'}) {
push @CmdArgs,"--analyzer-viz-egraph-ubigraph";
}
my $Result = system $Cmd,@CmdArgs;
# Did the command die because of a signal?
if ($Result & 127 and $Cmd eq $Clang and defined $HtmlDir) {
ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir,
"Crash");
}
elsif ($Result) {
ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir,
"Parser Rejects");
}
# Capture the STDERR of clang and send it to a temporary file.
# Capture the STDOUT of clang and reroute it to ccc-analyzer's STDERR.
# We save the output file in the 'crashes' directory if clang encounters
# any problems with the file.
my ($ofh, $ofile) = tempfile("clang_output_XXXXXX", DIR => $HtmlDir);
my $pid = fork();
if ($pid == 0) {
open(STDOUT,">&", \*STDERR);
open(STDERR,">&", $ofh);
exec $Cmd, @CmdArgs;
}
close ($ofh);
wait;
my $Result = $?;
# Did the command die because of a signal?
if ($Result & 127 and $Cmd eq $Clang and defined $HtmlDir) {
ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir,
"Crash", $ofile);
}
elsif ($Result) {
ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir,
"Parser Rejects", $ofile);
}
`rm -f $ofile`;
}
##----------------------------------------------------------------------------##