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:
committed by
Gerrit Code Review
parent
b4f144745a
commit
e4bf980b97
11
tools/analysis/resultbrowser/app/templates/about.html
Normal file
11
tools/analysis/resultbrowser/app/templates/about.html
Normal 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 %}
|
||||
50
tools/analysis/resultbrowser/app/templates/code.html
Normal file
50
tools/analysis/resultbrowser/app/templates/code.html
Normal 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 %}
|
||||
|
||||
|
||||
55
tools/analysis/resultbrowser/app/templates/index.html
Normal file
55
tools/analysis/resultbrowser/app/templates/index.html
Normal 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 %}
|
||||
@ -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 %}
|
||||
32
tools/analysis/resultbrowser/app/templates/layout.html
Normal file
32
tools/analysis/resultbrowser/app/templates/layout.html
Normal 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">
|
||||
© Fail* - Fault Injection Leveraged
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user