xref: /qemu/scripts/qemugdb/aio.py (revision 6acc5c04)
1*6acc5c04SPhilippe Mathieu-Daudé#
2c900ef86SDr. David Alan Gilbert# GDB debugging support: aio/iohandler debug
3c900ef86SDr. David Alan Gilbert#
4c900ef86SDr. David Alan Gilbert# Copyright (c) 2015 Red Hat, Inc.
5c900ef86SDr. David Alan Gilbert#
6c900ef86SDr. David Alan Gilbert# Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
7c900ef86SDr. David Alan Gilbert#
8c900ef86SDr. David Alan Gilbert# This work is licensed under the terms of the GNU GPL, version 2 or
9c900ef86SDr. David Alan Gilbert# later.  See the COPYING file in the top-level directory.
10c900ef86SDr. David Alan Gilbert#
11c900ef86SDr. David Alan Gilbert
12c900ef86SDr. David Alan Gilbertimport gdb
13c900ef86SDr. David Alan Gilbertfrom qemugdb import coroutine
14c900ef86SDr. David Alan Gilbert
15c900ef86SDr. David Alan Gilbertdef isnull(ptr):
16c900ef86SDr. David Alan Gilbert    return ptr == gdb.Value(0).cast(ptr.type)
17c900ef86SDr. David Alan Gilbert
18c900ef86SDr. David Alan Gilbertdef dump_aiocontext(context, verbose):
19c900ef86SDr. David Alan Gilbert    '''Display a dump and backtrace for an aiocontext'''
20c900ef86SDr. David Alan Gilbert    cur = context['aio_handlers']['lh_first']
21c900ef86SDr. David Alan Gilbert    # Get pointers to functions we're going to process specially
22c900ef86SDr. David Alan Gilbert    sym_fd_coroutine_enter = gdb.parse_and_eval('fd_coroutine_enter')
23c900ef86SDr. David Alan Gilbert
24c900ef86SDr. David Alan Gilbert    while not isnull(cur):
25c900ef86SDr. David Alan Gilbert        entry = cur.dereference()
26c900ef86SDr. David Alan Gilbert        gdb.write('----\n%s\n' % entry)
27c900ef86SDr. David Alan Gilbert        if verbose and cur['io_read'] == sym_fd_coroutine_enter:
28c900ef86SDr. David Alan Gilbert            coptr = (cur['opaque'].cast(gdb.lookup_type('FDYieldUntilData').pointer()))['co']
29c900ef86SDr. David Alan Gilbert            coptr = coptr.cast(gdb.lookup_type('CoroutineUContext').pointer())
30c900ef86SDr. David Alan Gilbert            coroutine.bt_jmpbuf(coptr['env']['__jmpbuf'])
31c900ef86SDr. David Alan Gilbert        cur = cur['node']['le_next'];
32c900ef86SDr. David Alan Gilbert
33c900ef86SDr. David Alan Gilbert    gdb.write('----\n')
34c900ef86SDr. David Alan Gilbert
35c900ef86SDr. David Alan Gilbertclass HandlersCommand(gdb.Command):
36c900ef86SDr. David Alan Gilbert    '''Display aio handlers'''
37c900ef86SDr. David Alan Gilbert    def __init__(self):
38c900ef86SDr. David Alan Gilbert        gdb.Command.__init__(self, 'qemu handlers', gdb.COMMAND_DATA,
39c900ef86SDr. David Alan Gilbert                             gdb.COMPLETE_NONE)
40c900ef86SDr. David Alan Gilbert
41c900ef86SDr. David Alan Gilbert    def invoke(self, arg, from_tty):
42c900ef86SDr. David Alan Gilbert        verbose = False
43c900ef86SDr. David Alan Gilbert        argv = gdb.string_to_argv(arg)
44c900ef86SDr. David Alan Gilbert
45c900ef86SDr. David Alan Gilbert        if len(argv) > 0 and argv[0] == '--verbose':
46c900ef86SDr. David Alan Gilbert            verbose = True
47c900ef86SDr. David Alan Gilbert            argv.pop(0)
48c900ef86SDr. David Alan Gilbert
49c900ef86SDr. David Alan Gilbert        if len(argv) > 1:
50c900ef86SDr. David Alan Gilbert            gdb.write('usage: qemu handlers [--verbose] [handler]\n')
51c900ef86SDr. David Alan Gilbert            return
52c900ef86SDr. David Alan Gilbert
53c900ef86SDr. David Alan Gilbert        if len(argv) == 1:
54c900ef86SDr. David Alan Gilbert            handlers_name = argv[0]
55c900ef86SDr. David Alan Gilbert        else:
56c900ef86SDr. David Alan Gilbert            handlers_name = 'qemu_aio_context'
57c900ef86SDr. David Alan Gilbert        dump_aiocontext(gdb.parse_and_eval(handlers_name), verbose)
58