Mimics the C version that displays the contents of the flight recorder. With a core-dump in place source the python file then call 'display_flight_rec' to dump the data. Signed-off-by: Marius Vlad <marius.vlad@collabora.com>dev
parent
d2dbcd3d7e
commit
36453951fb
@ -0,0 +1,103 @@ |
||||
# |
||||
# Copyright © 2019 Collabora Ltd. |
||||
# |
||||
# Permission is hereby granted, free of charge, to any person obtaining |
||||
# a copy of this software and associated documentation files (the |
||||
# "Software"), to deal in the Software without restriction, including |
||||
# without limitation the rights to use, copy, modify, merge, publish, |
||||
# distribute, sublicense, and/or sell copies of the Software, and to |
||||
# permit persons to whom the Software is furnished to do so, subject to |
||||
# the following conditions: |
||||
# |
||||
# The above copyright notice and this permission notice (including the |
||||
# next paragraph) shall be included in all copies or substantial |
||||
# portions of the Software. |
||||
# |
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
||||
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
||||
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
# SOFTWARE. |
||||
# |
||||
# Usage: source this script then 'display_flight_rec' |
||||
# |
||||
|
||||
import gdb |
||||
|
||||
class DisplayFlightRecorder(gdb.Command): |
||||
def __init__(self): |
||||
|
||||
self.rb = '' |
||||
symbol_found = False |
||||
|
||||
ring_buff = gdb.lookup_global_symbol("weston_primary_flight_recorder_ring_buffer") |
||||
if ring_buff == None: |
||||
print("'weston_ring_buffer' symbol not found!") |
||||
print("Either weston is too old or weston hasn't been loaded in memory") |
||||
else: |
||||
self.rb = ring_buff |
||||
self.display_rb_data(self.rb) |
||||
symbol_found = True |
||||
|
||||
if symbol_found: |
||||
super(DisplayFlightRecorder, self).__init__("display_flight_rec", |
||||
gdb.COMMAND_DATA) |
||||
|
||||
def display_rb_data(self, rb): |
||||
print("Flight recorder data found. Use 'display_flight_rec' " |
||||
"to display its contents") |
||||
# display this data (only) if symbol is not empty (happens if the program is not ran at all) |
||||
if rb.value(): |
||||
print("Data at byte {append}, Size: {size}B, " |
||||
"Overlaped: {overlap}".format(append=rb.value()['append_pos'], |
||||
size=rb.value()['size'], |
||||
overlap=rb.value()['overlap'])) |
||||
|
||||
# poor's man fwrite() |
||||
def gen_contents(self, start, stop): |
||||
_str = '' |
||||
for j in range(start, stop): |
||||
_str += chr(self.rb.value()['buf'][j]) |
||||
return _str |
||||
|
||||
# mirrors C version, as to make sure we're not reading other parts... |
||||
def display_flight_rec_contents(self): |
||||
|
||||
# symbol is there but not loaded, we're not far enough |
||||
if self.rb.value() == 0x0: |
||||
print("Flight recorder found, but not loaded yet!") |
||||
return |
||||
else: |
||||
print("Displaying flight recorder contents:") |
||||
|
||||
append_pos = self.rb.value()['append_pos'] |
||||
size = self.rb.value()['size'] |
||||
overlap = self.rb.value()['overlap'] |
||||
|
||||
# if we haven't overflown and we're still at 0 means |
||||
# we still aren't far enough to be populated |
||||
if append_pos == 0 and not overlap: |
||||
print("Flight recorder doesn't have anything to display right now") |
||||
return |
||||
|
||||
# now we can print stuff |
||||
rb_data = '' |
||||
if not overlap: |
||||
if append_pos: |
||||
rb_data = self.gen_contents(0, append_pos) |
||||
else: |
||||
rb_data = self.gen_contents(0, size) |
||||
else: |
||||
rb_data = self.gen_contents(append_pos, size) |
||||
rb_data += self.gen_contents(0, append_pos) |
||||
|
||||
print("{data}".format(data=rb_data)) |
||||
|
||||
# called when invoking 'display_flight_rec' |
||||
def invoke(self, arg, from_tty): |
||||
self.display_flight_rec_contents() |
||||
|
||||
DisplayFlightRecorder() |
Loading…
Reference in new issue