From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id 53CF93987C23 for ; Wed, 16 Jun 2021 07:46:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 53CF93987C23 IronPort-SDR: d27bEHvJl84FhLpLSyclVFdoPfWqcmcC+IbLpVkFNCAK1BF0uqyKRujhFMuzVpOosr3rrBrMpT JH2Dj87uaolw== X-IronPort-AV: E=McAfee;i="6200,9189,10016"; a="186509053" X-IronPort-AV: E=Sophos;i="5.83,277,1616482800"; d="scan'208";a="186509053" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2021 00:46:41 -0700 IronPort-SDR: mriWMMicoLwDPnF1XEICF49bwuUGqA46p/Ir0G7+MWFvN2ob6a2QKj33YX6RVcaDh8ATRbIz6t w1AxL9jXqP/A== X-IronPort-AV: E=Sophos;i="5.83,277,1616482800"; d="scan'208";a="637383725" Received: from mulvlfelix.iul.intel.com (HELO localhost) ([172.28.48.31]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2021 00:46:39 -0700 From: Felix Willgerodt To: markus.t.metzger@intel.com, gdb-patches@sourceware.org Subject: [PATCH v3 10/12] btrace, python: Enable calling the ptwrite listener. Date: Wed, 16 Jun 2021 09:42:03 +0200 Message-Id: <20210616074205.1129553-11-felix.willgerodt@intel.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20210616074205.1129553-1-felix.willgerodt@intel.com> References: <20210616074205.1129553-1-felix.willgerodt@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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-List-Received-Date: Wed, 16 Jun 2021 07:46:46 -0000 Adding a new function to btinfo that allows to call the python ptwrite listener from inside GDB. gdb/ChangeLog: 2021-06-14 Felix Willgerodt * btrace.h (btrace_thread_info): New member ptw_callback_fun. * python/py-record-btrace.c (recpy_call_listener): New function. (recpy_initialize_listener): Save recpy_call_listener in btinfo. --- gdb/btrace.h | 8 +++++ gdb/python/py-record-btrace.c | 67 +++++++++++++++++++++++++++++++++++ gdb/python/py-record-btrace.h | 5 +++ 3 files changed, 80 insertions(+) diff --git a/gdb/btrace.h b/gdb/btrace.h index b15efcd147c..7ca71277372 100644 --- a/gdb/btrace.h +++ b/gdb/btrace.h @@ -352,6 +352,14 @@ struct btrace_thread_info stepping through the execution history. */ std::vector aux_data; + /* Function pointer to the ptwrite callback. Returns the string returned + by the ptwrite listener function or nullptr if no string is supposed to + be printed. */ + gdb::unique_xmalloc_ptr (*ptw_callback_fun) ( + const uint64_t *payload, + const uint64_t *ip, + const void *ptw_listener); + /* PyObject pointer to the ptwrite listener function. */ void *ptw_listener = nullptr; diff --git a/gdb/python/py-record-btrace.c b/gdb/python/py-record-btrace.c index 82f0e00d675..6ca94168655 100644 --- a/gdb/python/py-record-btrace.c +++ b/gdb/python/py-record-btrace.c @@ -776,6 +776,72 @@ recpy_bt_function_call_history (PyObject *self, void *closure) return btpy_list_new (tinfo, first, last, 1, &recpy_func_type); } +/* Helper function that calls the ptwrite listener PTW_LISTENER with + PAYLOAD and IP as arguments. Returns a pointer to the string that will + be printed or nullptr if nothing should be printed. IP can be nullptr, + PAYLOAD must point to a valid integer. */ +gdb::unique_xmalloc_ptr +recpy_call_listener (const uint64_t *payload, const uint64_t *ip, + const void *ptw_listener) +{ + if ((PyObject *) ptw_listener == Py_None) + return nullptr; + else if ((PyObject *) ptw_listener == nullptr) + error (_("No valid ptwrite listener.")); + + /* As Python is started as a seperate thread, we need to + acquire the GIL to safely call the listener function. */ + PyGILState_STATE gstate = PyGILState_Ensure (); + + PyObject *py_payload = PyLong_FromUnsignedLongLong (*payload); + PyObject *py_ip; + + if (ip == nullptr) + { + py_ip = Py_None; + Py_INCREF (Py_None); + } + else + py_ip = PyLong_FromUnsignedLongLong (*ip); + + PyObject *py_result = PyObject_CallFunctionObjArgs ((PyObject *) ptw_listener, + py_payload, py_ip, NULL); + + if (PyErr_Occurred ()) + { + gdbpy_print_stack (); + gdb_Py_DECREF (py_ip); + gdb_Py_DECREF (py_payload); + PyGILState_Release (gstate); + error (_("Error while executing Python code.")); + } + + gdb_Py_DECREF (py_ip); + gdb_Py_DECREF (py_payload); + + if (py_result == Py_None) + { + gdb_Py_DECREF (py_result); + PyGILState_Release (gstate); + return nullptr; + } + + gdb::unique_xmalloc_ptr resultstring = gdbpy_obj_to_string (py_result); + + if (PyErr_Occurred ()) + { + gdbpy_print_stack (); + gdb_Py_DECREF (py_result); + PyGILState_Release (gstate); + error (_("Error while executing Python code.")); + } + + gdb_Py_DECREF (py_result); + PyGILState_Release (gstate); + + return resultstring; +} + /* Helper function returning the current ptwrite listener. Returns nullptr in case of errors. */ @@ -810,6 +876,7 @@ recpy_initialize_listener (ptid_t inferior_ptid) process_stratum_target *proc_target = current_inferior ()->process_target (); struct thread_info * const tinfo = find_thread_ptid (proc_target, inferior_ptid); + tinfo->btrace.ptw_callback_fun = &recpy_call_listener; tinfo->btrace.ptw_listener = get_ptwrite_listener (); return (PyObject *) tinfo->btrace.ptw_listener; diff --git a/gdb/python/py-record-btrace.h b/gdb/python/py-record-btrace.h index 36389e99ab8..098d6701e97 100644 --- a/gdb/python/py-record-btrace.h +++ b/gdb/python/py-record-btrace.h @@ -97,4 +97,9 @@ extern PyObject *recpy_initialize_listener (ptid_t inferior_ptid); /* Helper function returning the current ptwrite listener. */ extern PyObject *get_ptwrite_listener (); +/* Callback function for the ptwrite listener. */ +extern gdb::unique_xmalloc_ptr +recpy_call_listener (const uint64_t *payload, const uint64_t *ip, + const void *ptw_listener); + #endif /* PYTHON_PY_RECORD_BTRACE_H */ -- 2.25.4 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928