From patchwork Thu Oct 6 17:23:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 58486 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EEFDD389838D for ; Thu, 6 Oct 2022 17:24:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EEFDD389838D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1665077083; bh=uI0mxT8mw5lk+II6N8knC1hLfe3jjDmxiU8Tq5gvXMU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=d28ggn/hO0qNOnKUdffL6HGVCs8b6gkV+ujeWcElx0MJ64xNIzpvMR9YhaIK15a6p PsSOizSfRkWp5wkdjtrH3kivvhT75FRlvysfJCT2kQhfoomHbIpBfOZdyWgYXxOIYy DwmR54ArD7xWi1FDfsFUcg5SvRb0esSGKDTWDKHQ= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 92C8B384B82E for ; Thu, 6 Oct 2022 17:23:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 92C8B384B82E Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-609-Xk12buPSPi23yPuT3hqMIw-1; Thu, 06 Oct 2022 13:23:57 -0400 X-MC-Unique: Xk12buPSPi23yPuT3hqMIw-1 Received: by mail-wr1-f69.google.com with SMTP id f9-20020adfc989000000b0022b3bbc7a7eso748569wrh.13 for ; Thu, 06 Oct 2022 10:23:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uI0mxT8mw5lk+II6N8knC1hLfe3jjDmxiU8Tq5gvXMU=; b=L/6QXU2eaTHZP/j5naHLnKp3zKFvofcmq5n3F3bUrJgdCCjW7N02e1QEmLV+9e775a WoBZQWs3gz4xZVFcgEijrPPD8n4mLRTBNkeSLFAQV7LkxihFE1V38Z1we8xJ/Q5AvN81 q9d3fi2UZLQeOXAeerSUbBi63xnzRqFBqKUQhDbtyhHZbVALjXY467kzzLwJz0uWw48c PVStElF7f4AY+vu5yTGA+WokSKIYvXMvfxf50HRJN68o8bIvQOdtxL6ICv1mCUr1vrEn WpgWwJ54JSOfH/oOwnMIPhxxmPG5ZX95AJtMr5g9fVaI9nBpVt7d4IdkkXTOSsHsGZu5 UoKw== X-Gm-Message-State: ACrzQf0UJ9k/Yg4kRdmBxKDWEeiGXUT6IkljwPj0dKoCbqpZyT3t/uTk dlqSA5OHjVezT5957bbsso8ScRJ8e3wnCBTa00HH8s8XSH/TAfGfvfUI0xM4AjTZ4GmEK6FAlW1 zD8rMDiQQ1l33l0SZGcY5JOgd66iGHdWVIVbkLdefNXRVWv5aL+wPUe4oEagoip2ue+wsPDJnPQ == X-Received: by 2002:a5d:6508:0:b0:22e:1af4:57f9 with SMTP id x8-20020a5d6508000000b0022e1af457f9mr660754wru.539.1665077035720; Thu, 06 Oct 2022 10:23:55 -0700 (PDT) X-Google-Smtp-Source: AMsMyM41Fm8mnFMWomYIYFMjU8DQr/KkVgxaJTFF3LPB5f5iNsbAgYYloAxYwcDEZIcS94oes1TaHg== X-Received: by 2002:a5d:6508:0:b0:22e:1af4:57f9 with SMTP id x8-20020a5d6508000000b0022e1af457f9mr660742wru.539.1665077035369; Thu, 06 Oct 2022 10:23:55 -0700 (PDT) Received: from localhost (92.40.178.145.threembb.co.uk. [92.40.178.145]) by smtp.gmail.com with ESMTPSA id h14-20020a056000000e00b0022e6da05e43sm2097076wrx.89.2022.10.06.10.23.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Oct 2022 10:23:55 -0700 (PDT) To: gdb-patches@sourceware.org Subject: [PATCH 3/3] gdb: add infcall specific debugging Date: Thu, 6 Oct 2022 18:23:45 +0100 Message-Id: <9871275a989ff2c262ea9c94e3172c7eabfe7957.1665076921.git.aburgess@redhat.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Andrew Burgess via Gdb-patches From: Andrew Burgess Reply-To: Andrew Burgess Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Add two new commands: set debug infcall on|off show debug infcall These enable some new debugging related to when GDB makes inferior function calls. I've added some basic debugging for what I think are the major steps in the inferior function call process, but I'm sure we might want to add more later. --- gdb/NEWS | 4 +++ gdb/doc/gdb.texinfo | 7 +++++ gdb/infcall.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index 796a4ef8072..8b519a648f7 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -111,6 +111,10 @@ maintenance print frame-id [ LEVEL ] Print GDB's internal frame-id for the frame at LEVEL. If LEVEL is not given, then print the frame-id for the currently selected frame. +set debug infcall on|off +show debug infcall + Print additional debug messages about inferior function calls. + * Changed commands document user-defined diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 44d87e95748..e04c053c7bc 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -27587,6 +27587,13 @@ @item show debug infrun Displays the current state of @value{GDBN} inferior debugging. +@item set debug infcall +@cindex inferior function call debugging info +Turns on or off display of debugging info related to when @value{GDBN} +makes inferior function calls. +@item show debug infcall +Displays the current state of @value{GDBN} inferior function call debugging. + @item set debug jit @cindex just-in-time compilation, debugging messages Turn on or off debugging messages from JIT debug support. diff --git a/gdb/infcall.c b/gdb/infcall.c index 34852191043..8e12a119c15 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -44,6 +44,34 @@ #include "gdbsupport/scope-exit.h" #include +/* True if we are debugging inferior calls. */ + +static bool debug_infcall = false; + +/* Print an "infcall" debug statement. */ + +#define infcall_debug_printf(fmt, ...) \ + debug_prefixed_printf_cond (debug_infcall, "infcall", fmt, ##__VA_ARGS__) + +/* Print "infcall" enter/exit debug statements. */ + +#define INFCALL_SCOPED_DEBUG_ENTER_EXIT \ + scoped_debug_enter_exit (debug_infcall, "infcall") + +/* Print "infcall" start/end debug statements. */ + +#define INFCALL_SCOPED_DEBUG_START_END(fmt, ...) \ + scoped_debug_start_end (debug_infrun, "infcall", fmt, ##__VA_ARGS__) + +/* Implement 'show debug infcall'. */ + +static void +show_debug_infcall (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + gdb_printf (file, _("Inferior call debugging is %s.\n"), value); +} + /* If we can't find a function's name from its address, we print this instead. */ #define RAW_FUNCTION_ADDRESS_FORMAT "at 0x%s" @@ -529,6 +557,8 @@ call_thread_fsm::call_thread_fsm (struct ui *waiting_ui, bool call_thread_fsm::should_stop (struct thread_info *thread) { + INFCALL_SCOPED_DEBUG_ENTER_EXIT; + if (stop_stack_dummy == STOP_STACK_DUMMY) { /* Done. */ @@ -577,10 +607,17 @@ static struct gdb_exception run_inferior_call (std::unique_ptr sm, struct thread_info *call_thread, CORE_ADDR real_pc) { + INFCALL_SCOPED_DEBUG_ENTER_EXIT; + struct gdb_exception caught_error; ptid_t call_thread_ptid = call_thread->ptid; int was_running = call_thread->state == THREAD_RUNNING; + infcall_debug_printf ("call function at %s in thread %s, was_running = %d", + core_addr_to_string (real_pc), + call_thread_ptid.to_string ().c_str (), + was_running); + current_ui->unregister_file_handler (); scoped_restore restore_in_infcall @@ -610,15 +647,25 @@ run_inferior_call (std::unique_ptr sm, proceed (real_pc, GDB_SIGNAL_0); + infrun_debug_show_threads ("non-exited threads after proceed for inferior-call", + all_non_exited_threads ()); + /* Inferior function calls are always synchronous, even if the target supports asynchronous execution. */ wait_sync_command_done (); + + infcall_debug_printf ("inferior call completed successfully"); } catch (gdb_exception &e) { + infcall_debug_printf ("exception while making inferior call (%d): %s", + e.reason, e.what ()); caught_error = std::move (e); } + infcall_debug_printf ("thread is now: %s", + inferior_ptid.to_string ().c_str ()); + /* If GDB has the prompt blocked before, then ensure that it remains so. normal_stop calls async_enable_stdin, so reset the prompt state again here. In other cases, stdin will be re-enabled by @@ -764,6 +811,8 @@ call_function_by_hand_dummy (struct value *function, dummy_frame_dtor_ftype *dummy_dtor, void *dummy_dtor_data) { + INFCALL_SCOPED_DEBUG_ENTER_EXIT; + CORE_ADDR sp; struct type *target_values_type; function_call_return_method return_method = return_method_normal; @@ -830,6 +879,9 @@ call_function_by_hand_dummy (struct value *function, if (args.size () < ftype->num_fields ()) error (_("Too few arguments in function call.")); + infcall_debug_printf ("calling %s", get_function_name (funaddr, name_buf, + sizeof (name_buf))); + /* A holder for the inferior status. This is only needed while we're preparing the inferior function call. */ infcall_control_state_up inf_status (save_infcall_control_state ()); @@ -1276,6 +1328,12 @@ call_function_by_hand_dummy (struct value *function, e = run_inferior_call (std::move (sm_up), call_thread.get (), real_pc); } + if (e.reason < 0) + infcall_debug_printf ("after inferior call, exception (%d): %s", + e.reason, e.what ()); + infcall_debug_printf ("after inferior call, thread state is: %s", + thread_state_string (call_thread->state)); + gdb::observers::inferior_call_post.notify (call_thread_ptid, funaddr); if (call_thread->state != THREAD_EXITED) @@ -1287,6 +1345,8 @@ call_function_by_hand_dummy (struct value *function, { struct value *retval; + infcall_debug_printf ("call completed"); + /* The inferior call is successful. Pop the dummy frame, which runs its destructors and restores the inferior's suspend state, and restore the inferior control @@ -1317,6 +1377,8 @@ call_function_by_hand_dummy (struct value *function, return retval; } + else + infcall_debug_printf ("call did not complete"); /* Didn't complete. Clean up / destroy the call FSM, and restore the previous state machine, and handle the error. */ @@ -1572,4 +1634,10 @@ The default is to unwind the frame."), show_unwind_on_terminating_exception_p, &setlist, &showlist); + add_setshow_boolean_cmd + ("infcall", class_maintenance, &debug_infcall, + _("Set inferior call debugging."), + _("Show inferior call debugging."), + _("When on, inferior function call specific debugging is enabled."), + NULL, show_debug_infcall, &setdebuglist, &showdebuglist); }