From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by sourceware.org (Postfix) with ESMTPS id D4486386FC1D for ; Fri, 14 May 2021 10:21:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D4486386FC1D IronPort-SDR: fEkOugLppLqm6rAK9msLVwP+ifAFizxZd/dz8ZCEdc6IPrOaM8twbfBGcmWGyvukWxfaJDagBA yK+crMt+47xA== X-IronPort-AV: E=McAfee;i="6200,9189,9983"; a="197065383" X-IronPort-AV: E=Sophos;i="5.82,299,1613462400"; d="scan'208";a="197065383" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 May 2021 03:21:22 -0700 IronPort-SDR: sRYDBMzAJZOd7zRIYrcI+/5mLDZ1JTI8rLRNovuNi2i1RJfUS1SqiUU90MGUKdw42WUpmVykDw ajxzQnEU1Gsw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,299,1613462400"; d="scan'208";a="436330714" Received: from irvmail001.ir.intel.com ([10.43.11.63]) by fmsmga008.fm.intel.com with ESMTP; 14 May 2021 03:21:20 -0700 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id 14EALJMs030895; Fri, 14 May 2021 11:21:19 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id 14EALJp0017187; Fri, 14 May 2021 12:21:19 +0200 Received: (from taktemur@localhost) by ulvlx001.iul.intel.com with LOCAL id 14EALIRu017183; Fri, 14 May 2021 12:21:18 +0200 From: Tankut Baris Aktemur To: gdb-patches@sourceware.org Subject: [PATCH v3] gdb/python: add a 'connection_num' attribute to Inferior objects Date: Fri, 14 May 2021 12:21:12 +0200 Message-Id: <48cb6bfb672cfe5f175beda955b478c557bb2752.1620987564.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 1.7.0.7 X-Spam-Status: No, score=-12.9 required=5.0 tests=AC_FROM_MANY_DOTS, BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_NONE, SPF_NONE, 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: Fri, 14 May 2021 10:21:26 -0000 Define a 'connection_num' attribute for Inferior objects. The read-only attribute is the ID of the connection of an inferior, as printed by "info inferiors". In GDB's internal terminology, that's the process stratum target of the inferior. If the inferior has no target connection, the attribute is None. gdb/ChangeLog: 2021-05-14 Tankut Baris Aktemur * python/py-inferior.c (infpy_get_connection_num): New function. (inferior_object_getset): Add a new element for 'connection_num'. * NEWS: Mention the 'connection_num' attribute of Inferior objects. gdb/doc/ChangeLog: 2021-05-14 Tankut Baris Aktemur * python.texi (Inferiors In Python): Mention the 'connection_num' attribute. gdb/testsuite/ChangeLog: 2021-05-14 Tankut Baris Aktemur * gdb.python/py-inferior.exp: Add test cases for 'connection_num'. --- gdb/NEWS | 6 ++++++ gdb/doc/python.texi | 6 ++++++ gdb/python/py-inferior.c | 19 ++++++++++++++++++ gdb/testsuite/gdb.python/py-inferior.exp | 25 +++++++++++++++++++++++- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/gdb/NEWS b/gdb/NEWS index 6e147cb0318..ab678acec8b 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -211,6 +211,12 @@ QMemTags value-reference-value, value-rvalue-reference-value and value-const-value. +* Python API + + ** Inferior objects now contain a read-only 'connection_num' attribute that + gives the connection number as seen in 'info connections' and + 'info inferiors'. + *** Changes in GDB 10 * There are new feature names for ARC targets: "org.gnu.gdb.arc.core" diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 4865634537d..f1ca6f7ed12 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3065,6 +3065,12 @@ A @code{gdb.Inferior} object has the following attributes: ID of inferior, as assigned by GDB. @end defvar +@defvar Inferior.connection_num +ID of inferior's connection as assigned by @value{GDBN}, or None if +the inferior is not connected to a target. +@xref{Inferiors Connections and Programs}. +@end defvar + @defvar Inferior.pid Process ID of the inferior, as assigned by the underlying operating system. diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 94c2c2329e9..336c6426b8c 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -427,6 +427,23 @@ infpy_get_num (PyObject *self, void *closure) return gdb_py_object_from_longest (inf->inferior->num).release (); } +/* Return the connection number of the given inferior, or None if a + connection does not exist. */ + +static PyObject * +infpy_get_connection_num (PyObject *self, void *closure) +{ + inferior_object *inf = (inferior_object *) self; + + INFPY_REQUIRE_VALID (inf); + + process_stratum_target *target = inf->inferior->process_target (); + if (target == nullptr) + Py_RETURN_NONE; + + return PyLong_FromLong (target->connection_number); +} + static PyObject * infpy_get_pid (PyObject *self, void *closure) { @@ -943,6 +960,8 @@ gdbpy_initialize_inferior (void) static gdb_PyGetSetDef inferior_object_getset[] = { { "num", infpy_get_num, NULL, "ID of inferior, as assigned by GDB.", NULL }, + { "connection_num", infpy_get_connection_num, NULL, + "ID of inferior's connection, as assigned by GDB.", NULL }, { "pid", infpy_get_pid, NULL, "PID of inferior, as assigned by the OS.", NULL }, { "was_attached", infpy_get_was_attached, NULL, diff --git a/gdb/testsuite/gdb.python/py-inferior.exp b/gdb/testsuite/gdb.python/py-inferior.exp index 9df74e05182..2252215b721 100644 --- a/gdb/testsuite/gdb.python/py-inferior.exp +++ b/gdb/testsuite/gdb.python/py-inferior.exp @@ -51,6 +51,7 @@ gdb_py_test_silent_cmd "python i0 = inferiors\[0\]" "get first inferior" 0 gdb_test "python print ('result = %s' % (i0 == inferiors\[0\]))" " = True" "test equality comparison (true)" gdb_test "python print ('result = %s' % i0.num)" " = \[0-9\]+" "test Inferior.num" +gdb_test "python print ('result = %s' % i0.connection_num)" " = \[0-9\]+" "test Inferior.connection_num" gdb_test "python print ('result = %s' % i0.pid)" " = \[0-9\]+" "test Inferior.pid" gdb_test "python print ('result = %s' % i0.was_attached)" " = False" "test Inferior.was_attached" gdb_test "python print (i0.threads ())" "\\(,\\)" "test Inferior.threads" @@ -262,6 +263,8 @@ with_test_prefix "is_valid" { # correctly. gdb_test "python print (inf_list\[1\].num)" \ "RuntimeError: Inferior no longer exists.*" + gdb_test "python print (inf_list\[1\].connection_num)" \ + "RuntimeError: Inferior no longer exists.*" gdb_test "python print (inf_list\[1\].pid)" \ "RuntimeError: Inferior no longer exists.*" gdb_test "python print (inf_list\[1\].was_attached)" \ @@ -278,10 +281,30 @@ with_test_prefix "is_valid" { with_test_prefix "selected_inferior" { gdb_test "inferior 1" ".*" "switch to first inferior" gdb_test "py print (gdb.selected_inferior().num)" "1" "first inferior selected" + gdb_test "py print (gdb.selected_inferior().connection_num)" "1" \ + "first inferior's connection" + # Figure out if inf 1 has a native target. + set inf_1_is_native [gdb_is_target_native] - gdb_test "add-inferior" "Added inferior 3 on connection .*" "create new inferior" + gdb_test "add-inferior -no-connection" "Added inferior 3" "create new inferior" gdb_test "inferior 3" ".*" "switch to third inferior" gdb_test "py print (gdb.selected_inferior().num)" "3" "third inferior selected" + gdb_test "py print (gdb.selected_inferior().connection_num)" "None" \ + "third inferior's None connection" + gdb_test "target native" "Done. Use the \"run\" command to start a process." \ + "target for the third inferior" + + # If inf 1 has a native target, inf 3's target is shared with 1's. + # Otherwise, it must have created a new target with a new number. + if {$inf_1_is_native} { + set expected_connection_num 1 + } else { + set expected_connection_num 2 + } + gdb_test "py print (gdb.selected_inferior().connection_num)" \ + "$expected_connection_num" \ + "third inferior's native connection" + gdb_test "inferior 1" ".*" "switch back to first inferior" gdb_test_no_output "remove-inferiors 3" "remove second inferior" } -- 2.17.1