Fail* result browser for pruning experiments.

Based on the database layout given by the pruner.
Run ./run.py -c <path to mysql.cnf>
(Default config ~/.my.cnf)

- Checks if objdump table exists
- Added view for results per instruction
- Added config file support for table details
- Overview data loaded at server startup
- Result type mapping configurable via config file

Based on Flask and MySQLdb

Change-Id: Ib49eac8f5c1e0ab23921aedb5bc53c34d0cde14d
This commit is contained in:
Martin Hoffmann
2013-09-26 14:02:36 +02:00
committed by Gerrit Code Review
parent b4f144745a
commit e4bf980b97
16 changed files with 1140 additions and 0 deletions

View File

@ -0,0 +1,11 @@
{% extends "layout.html" %}
{% block content %}
{% if status %}
<h2>About</h2>
{{ status }}
{% else %}
<h2> Sorry, no status information.</h2>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,50 @@
{% extends "layout.html" %}
{% block content %}
<h1>Variant Results</h1>
{% if resulttypes %}
<table>
<tr><td>Result Table</td><td><b>{{ variant_details.getTableDetails().getTitle() }}</b><td></tr>
<tr><td>Variant </td><td><b>{{ variant_details.getDetails().getTitle() }}</b></td></tr>
<tr><td>Details </td><td><b>{{ variant_details.getDetails().getDetails() }}</b></td></tr>
<tr><td>Benchmark </td><td><b>{{ variant_details.getBenchmarkDetails().getTitle() }}</b></td></tr>
<tr><td>Details </td><td><b>{{ variant_details.getBenchmarkDetails().getDetails() }}</b></td></tr>
<tr><td>Result Count </td><td><b>{{ results|length }}</b></td></tr>
</table>
<hr>
<p class='resulttypemenu'>| <a href="{{ url_for('code', variant_id=request.args.get('variant_id'), table=request.args.get('table')) }}">All Results</a> |
{% for restype in resulttypes %}
<a href="{{ url_for('code', variant_id=request.args.get('variant_id'), table=request.args.get('table'), resulttype=restype )}}">{{ restype}}</a> |
{% endfor %}
</p>
<hr>
<table class="codetable">
<tr>
<th>Address</th>
<th>Opcode</th>
<th>Disassembly</th>
<th>Comment</th>
<th>Results</th>
<th># Results</th>
</tr>
{% for d in results %}
{% set link = url_for('instr_details', table=request.args.get('table'), variant_id=request.args.get('variant_id'), benchmark=request.args.get('benchmark'), variant=request.args.get('variant'), resulttype=request.args.get('resulttype'), instr_address=d['instr_address'] ) %}
<tr>
<td><a href="{{ link }}">{{ "0x%x"|format(d['instr_address']) }}</a></td>
<td><a href="{{ link }}">{{ d['opcode'] }}</a></td>
<td><a href="{{ link }}">{{ d['disassemble'] }}</a></td>
<td><a href="{{ link }}">{{ d['comment'] }}</a></td>
<td><a href="{{ link }}">{{ d['results'] }}</a></td>
<td><a href="{{ link }}">{{ d['totals'] }}</a></td>
</tr>
{% endfor %}
</table>
{% else %}
<h1> Sorry, no dump found.</h1>
{% endif %}
{%endblock %}

View File

@ -0,0 +1,55 @@
{% extends "layout.html" %}
{% block content %}
{%if overview %}
{% for tablekey, resulttable in overview.getTables().items() %}
<h2>Result table: {{ resulttable.getDetails().getTitle() }}</h2>
-> <a href="{{ url_for('index', reload=1) }}">Reload data</a> <-
<dl>
<dt>Details:</td>
<dd>
{{ resulttable.getDetails().getDetails() }}
<dd>
</dl>
{% if not objdump_there %}
No objdump found
{% endif %}
<table class="overviewtable" cellspacing="0px">
{% for varid, variant in resulttable.getVariants().items() %}
<tr><th>
{% set variant_title=variant.getDetails().getTitle() ~ " - " ~ variant.getBenchmarkDetails().getTitle() ~ " id: " ~ variant.getId() %}
{% if objdump_there %}
<a href="{{ url_for('code',table=resulttable.getDetails().getDBName(), variant_id=variant.getId() ) }}">{{ variant_title }}</a>
{% else %}
{{ variant_title }}
{% endif %}
(Total: {{ variant.getTotals() }})</a>
</th></tr>
<tr><td>
{% if variant.getDetails().getDetails() %}
Variant Details: {{ variant.getDetails().getDetails() }}
{% endif %}
{% if variant.getBenchmarkDetails().getDetails() %}
<br> Benchmark Details: {{ variant.getBenchmarkDetails().getDetails() }}</td></tr>
{% endif %}
<tr><td>
<dl class="horizontal">
{% for reslabel,count in variant.getResults().items() %}
<dt>
{% if objdump_there %}
<a href="{{ url_for('code', table=resulttable.getDetails().getDBName(), variant_id=variant.getId(), resulttype=reslabel ) }}">{{ reslabel }}</a>
{% else %}
{{ reslabel }}
{% endif %}
</dt>
<dd><span style="width:{{count * 100 / variant.getTotals() }}%;">{{count}}</span></dd>
{% endfor %}
</dl></td></tr>
{% endfor %}
</table>
{% endfor %}
{% else %}
<h2> Sorry, no results found.</h2>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,65 @@
{% extends "layout.html" %}
{% block content %}
{% if code %}
<h1>Result by Instruction</h1>
<table>
<tr><td>Result Table</td><td><b>{{ variant_details.getTableDetails().getTitle() }}</b><td></tr>
<tr><td>Variant </td><td><b>{{ variant_details.getDetails().getTitle() }}</b></td></tr>
<tr><td>Benchmark </td><td><b>{{ variant_details.getBenchmarkDetails().getTitle() }}</b></td></tr>
<tr><td>Details </td><td><b>{{ variant_details.getDetails().getDetails() }}</b></td></tr>
<tr><td>Instruction Address </td><td><b>{{ "0x%x (Dec: %d)"|format(request.args.get('instr_address')|int, request.args.get('instr_address')|int) }}</b></td></tr>
<tr><td>Total Results</td><td><b>{{ result|length }}</b></td></tr>
</table>
<hr>
<h2>Code</h2>
<table class="codetable">
<tr>
<th>Address</th>
<th>Opcode</th>
<th>Disassembly</th>
<th>Comment</th>
</tr>
{% for d in code['below'] %}
<tr>
<td>{{ "0x%x"|format(d['instr_address']) }}</td>
<td>{{ d['opcode'] }}</td>
<td>{{ d['disassemble'] }}</td>
<td>{{ d['comment'] }}</td>
</tr>
{% endfor %}
<tr style="font-weight: bold">
<td>{{ "0x%x"|format(code['upper'][0]['instr_address']) }}</td>
<td>{{ code['upper'][0]['opcode'] }}</td>
<td>{{ code['upper'][0]['disassemble'] }}</td>
<td>{{ code['upper'][0]['comment'] }}</td>
</tr>
{% for d in code['upper'][1:] %}
<tr>
<td>{{ "0x%x"|format(d['instr_address']) }}</td>
<td>{{ d['opcode'] }}</td>
<td>{{ d['disassemble'] }}</td>
<td>{{ d['comment'] }}</td>
</tr>
{% endfor %}</table>
<hr>
<h2>Results ({{ result|length }})</h2>
<table class="resulttable">
<tr>
{% for key, value in result[0].items() -%}
<th>{{ key }}</th>
{% endfor -%}
</tr>
{% for r in result -%}
<tr>
{% for k,v in r.items() -%}
<td>{{ v }}</td>
{% endfor -%}
</tr>
{% endfor -%}
</tr>
</table>
{% else %}
<h2> Sorry, no details found.</h2>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<title>Fail* Results</title>
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}"></strong>
<strong><link rel="stylesheet" href="{{ url_for('static', filename='css/barchart.css') }}"></strong>
</head>
<body>
<header>
<div class="container">
<h1 class="logo">Fail*</h1>
<strong><nav>
<ul class="menu">
<li><a href="{{ url_for('index') }}">Home</a></li>
<li><a href="{{ url_for('about') }}">About</a></li>
</ul>
</nav></strong>
</div>
</header>
<div class="container">
{% block content %}
{% endblock %}
</div>
<hr>
<div id="footer">
&copy; Fail* - Fault Injection Leveraged
</div>
</body>
</html>