3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-20 02:49:49 +01:00

compiler_vm: added libc fatal errors; trace program only on signal

This commit is contained in:
Pragmatic Software 2012-02-09 18:48:45 +00:00
parent 4efa96dbbe
commit a2e2d15fc7
3 changed files with 58 additions and 18 deletions

View File

@ -13,8 +13,8 @@ use warnings;
# These are set automatically by the build/commit script # These are set automatically by the build/commit script
use constant { use constant {
BUILD_NAME => "PBot", BUILD_NAME => "PBot",
BUILD_REVISION => 359, BUILD_REVISION => 360,
BUILD_DATE => "2012-02-05", BUILD_DATE => "2012-02-09",
}; };
1; 1;

View File

@ -698,8 +698,10 @@ print FILE "$nick: [lang:$lang][args:$args][input:$input]\n", pretty($code), "\n
$output = compile($lang, pretty($code), $args, $input, $USE_LOCAL); $output = compile($lang, pretty($code), $args, $input, $USE_LOCAL);
=cut
$output =~ s/^\s+//; $output =~ s/^\s+//;
$output =~ s/\s+$//; $output =~ s/\s+$//;
=cut
if($output =~ m/^\s*$/) { if($output =~ m/^\s*$/) {
$output = $nooutput $output = $nooutput
@ -725,11 +727,12 @@ if($output =~ m/^\s*$/) {
my $right_quote = chr(226) . chr(128) . chr(153); my $right_quote = chr(226) . chr(128) . chr(153);
$output =~ s/$left_quote/'/g; $output =~ s/$left_quote/'/g;
$output =~ s/$right_quote/'/g; $output =~ s/$right_quote/'/g;
$output =~ s/\t/ /g;
$output =~ s/\s*In function 'main':\s*//g; $output =~ s/\s*In function 'main':\s*//g;
$output =~ s/warning: unknown conversion type character 'b' in format \[-Wformat\]\s+warning: too many arguments for format \[-Wformat-extra-args\]/info: conversion type character 'b' in format is a candide extension/g; $output =~ s/warning: unknown conversion type character 'b' in format \[-Wformat\]\s+warning: too many arguments for format \[-Wformat-extra-args\]/info: conversion type character 'b' in format is a candide extension/g;
$output =~ s/warning: unknown conversion type character 'b' in format \[-Wformat\]//g; $output =~ s/warning: unknown conversion type character 'b' in format \[-Wformat\]//g;
$output =~ s/\s\(core dumped\)/./; $output =~ s/\s\(core dumped\)/./;
$output =~ s/\[\s+/[/g; # $output =~ s/\[\s+/[/g;
$output =~ s/ \[enabled by default\]//g; $output =~ s/ \[enabled by default\]//g;
$output =~ s/initializer\s+warning: \(near/initializer (near/g; $output =~ s/initializer\s+warning: \(near/initializer (near/g;
$output =~ s/note: each undeclared identifier is reported only once for each function it appears in//g; $output =~ s/note: each undeclared identifier is reported only once for each function it appears in//g;
@ -737,11 +740,16 @@ if($output =~ m/^\s*$/) {
$output =~ s/", '\\(\d{3})' <repeats \d+ times>,? ?"/\\$1/g; $output =~ s/", '\\(\d{3})' <repeats \d+ times>,? ?"/\\$1/g;
$output =~ s/, '\\(\d{3})' <repeats \d+ times>\s*//g; $output =~ s/, '\\(\d{3})' <repeats \d+ times>\s*//g;
$output =~ s/(\\000)+/\\0/g; $output =~ s/(\\000)+/\\0/g;
$output =~ s/\\0[^">]+/\\0/g; $output =~ s/\\0[^">']+/\\0/g;
$output =~ s/\\0"/"/g; $output =~ s/\\0"/"/g;
$output =~ s/"\\0/"/g; $output =~ s/"\\0/"/g;
$output =~ s/\.\.\.>/>/g; $output =~ s/\.\.\.>/>/g;
$output =~ s/(\\\d{3})+//g; $output =~ s/(\\\d{3})+//g;
$output =~ s/<\s*included at \/home\/compiler\/>\s*//g;
$output =~ s/\s*compilation terminated due to -Wfatal-errors\.//g;
$output =~ s/^======= Backtrace.*\[vsyscall\]\s*$//ms;
$output =~ s/glibc detected \*\*\* \/home\/compiler\/prog: //;
$output =~ s/: \/home\/compiler\/prog terminated//;
} }
unless($got_run) { unless($got_run) {

View File

@ -33,12 +33,13 @@ sub execute {
<$out> and next if $line =~ m/^\(gdb\) No line \d+ in/; <$out> and next if $line =~ m/^\(gdb\) No line \d+ in/;
next if $line =~ m/^\(gdb\) Continuing/; next if $line =~ m/^\(gdb\) Continuing/;
next if $line =~ m/^\(gdb\) \$\d+ = "Ok\."/; next if $line =~ m/^\(gdb\) \$\d+ = "Ok\."/;
next if $line =~ m/^(\(gdb\) )?Breakpoint \d+ at 0x/; next if $line =~ m/^(\(gdb\) )*Breakpoint \d+ at 0x/;
next if $line =~ m/^\(gdb\) Breakpoint \d+ at 0x/; next if $line =~ m/^\(gdb\) Breakpoint \d+ at 0x/;
next if $line =~ m/^\(gdb\) Note: breakpoint \d+ also set/; next if $line =~ m/^\(gdb\) Note: breakpoint \d+ also set/;
next if $line =~ m/^(\(gdb\) )?Starting program/; next if $line =~ m/^(\(gdb\) )*Starting program/;
next if $line =~ m/PRETTY_FUNCTION__ =/; next if $line =~ m/PRETTY_FUNCTION__ =/;
next if $line =~ m/libc_start_main/; next if $line =~ m/libc_start_main/;
next if $line =~ m/libc-start.c/;
if($line =~ m/^\d+: (.*? = .*)/) { if($line =~ m/^\d+: (.*? = .*)/) {
print "<$1>\n"; print "<$1>\n";
@ -77,6 +78,8 @@ sub execute {
} }
gdb $in, "break $break\n"; gdb $in, "break $break\n";
gdb $in, "set width 0\n";
gdb $in, "set height 0\n";
gdb $in, "run\n"; gdb $in, "run\n";
next; next;
} }
@ -85,6 +88,9 @@ sub execute {
my $line = <$out>; my $line = <$out>;
print "== got: $line\n" if $debug >= 5; print "== got: $line\n" if $debug >= 5;
if($line =~ m/^\d+\s+return.*?;\s*$/ or $line =~ m/^\d+\s+}\s*$/) { if($line =~ m/^\d+\s+return.*?;\s*$/ or $line =~ m/^\d+\s+}\s*$/) {
for(my $i = 0; $i < $watching; $i++) {
<$out>;
}
if($got_output == 0) { if($got_output == 0) {
print "no output, checking locals\n" if $debug >= 5; print "no output, checking locals\n" if $debug >= 5;
gdb $in, "print \"Go.\"\ninfo locals\nprint \"Ok.\"\n"; gdb $in, "print \"Go.\"\ninfo locals\nprint \"Ok.\"\n";
@ -330,6 +336,8 @@ sub execute {
if($line =~ m/^Watchpoint \d+ deleted/) { if($line =~ m/^Watchpoint \d+ deleted/) {
my $ignore = <$out>; my $ignore = <$out>;
print "ignored $ignore\n" if $debug >= 5; print "ignored $ignore\n" if $debug >= 5;
$ignore = <$out>;
print "ignored $ignore\n" if $debug >= 5;
gdb $in, "cont\n"; gdb $in, "cont\n";
next; next;
} }
@ -372,7 +380,9 @@ sub execute {
next; next;
} }
if($line =~ m/Program received signal/) { if($line =~ m/Program received signal ([^, ]+)/) {
my $signal = $1;
my $trace_prog_only = 1;
my $result = ""; my $result = "";
my $vars = ""; my $vars = "";
my $varsep = ""; my $varsep = "";
@ -381,6 +391,14 @@ sub execute {
$got_output = 1; $got_output = 1;
print "$line "; print "$line ";
print "\ngot signal [$signal]\n" if $debug >= 2;
if($signal eq "SIGABRT") {
$trace_prog_only = 1;
}
my $last_file = "";
while(my $line = <$out>) { while(my $line = <$out>) {
chomp $line; chomp $line;
$line =~ s/^\(gdb\)\s+//; $line =~ s/^\(gdb\)\s+//;
@ -390,30 +408,44 @@ sub execute {
next if $line =~ m/__PRETTY_FUNCTION__ =/; next if $line =~ m/__PRETTY_FUNCTION__ =/;
my $skip = 0;
if($trace_prog_only) {
if($line =~ m/.*\s(.*?)\.c:\d+$/) {
$last_file = $1;
}
$skip = 1 if not $last_file eq "prog";
}
print "last file: [$last_file], skip: $skip\n" if $debug >= 6;
if($line =~ s/^(#\d+\s+)?0x[0-9A-Fa-f]+\s//) { if($line =~ s/^(#\d+\s+)?0x[0-9A-Fa-f]+\s//) {
$line =~ s/\s+at .*:\d+//; $line =~ s/\s+at .*:\d+//;
$line =~ s/\s+from \/lib.*//; $line =~ s/\s+from \/lib.*//;
if($line =~ s/^\s*in\s+//) { if($line =~ s/^\s*in\s+//) {
if(not length $result) { if(not length $result) {
$result .= "in $line "; $result .= "in $line " unless $skip;
} else { } else {
$result .= "called by $line "; $result .= "called by $line " unless $skip;
} }
gdb $in, "info locals\n"; gdb $in, "info locals\n" unless $skip;
gdb $in, "print \"Ok.\"";
} else { } else {
$result = "in $line from "; $result = "in $line from " unless $skip;
gdb $in, "info locals\n"; gdb $in, "info locals\n" unless $skip;
gdb $in, "print \"Ok.\"";
} }
} }
elsif($line =~ m/^No symbol table info available/) { elsif($line =~ m/^\$\d+ = "Ok."/) {
gdb $in, "up\n"; gdb $in, "up\n";
} }
elsif($line =~ s/^\d+\s+//) { elsif($line =~ s/^\d+\s+//) {
next if $line =~ /No such file/; next if $line =~ /No such file/;
$result .= "at statement: $line "; $result .= "at statement: $line " unless $skip;
gdb $in, "up\n"; # gdb $in, "info locals\n" unless $skip;
gdb $in, "print \"Ok.\"";
} }
elsif($line =~ m/([^=]+)=\s+(.*)/) { elsif($line =~ m/([^=]+)=\s+(.*)/) {
$vars .= "$varsep$1= $2"; $vars .= "$varsep$1= $2";
@ -472,4 +504,4 @@ sub flushall {
} }
} }
execute("gdb -silent ./prog"); execute("LIBC_FATAL_STDERR_=1 gdb -silent ./prog 2>&1");