From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 999E13857013 for ; Fri, 5 Jan 2024 11:48:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 999E13857013 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 999E13857013 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704455335; cv=none; b=oGgbcfZYo7llf5UbsKW3jP6N8szwb/Z0ZFq/5X8gRIJMrEJOCd1+/EhfccLdsXc0hBi9VhgyhTDKAnXKipHDFwD5Q2ex8glPQNlayM8uKadqnbhvwtyGz1DWVyA09oOybztWiZGFtQ7YLR1sjnDC5zhe8UvIabVp+7nNSLweWFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704455335; c=relaxed/simple; bh=DV4Dq0y6kSMhBLBc2Y5pmg1oKIQPFbFphHIszjqiRHM=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=wf7uQ8wi09Y/Dxe0a/GtGZNH/6afjb1D7yKP/GMq1SXL39LxeWrZ4IRtBl7HHWq9ytc6oQk1a8+KddED30x5Bqlcu0Beqrfq7sTIrns3ptbWnqDCqHaFGSb55cOM6p94ejA6d6zo21zfNX/FtoDel3nVp1HCMdVNw5slViPXIUQ= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704455332; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XxSGyzS/240RUKKdO2ui4cR3VRu5V8Wrb2zAJsnBtvE=; b=ErN45NB4YS2kDS1QUUvVNkB+liZpVrWE024XAzn1jecy6TcVPiHv+ET+Xof4TIWdzNh196 /UYydLvfcwNY2dFVo3lMkvUMmzv08knFtbklgznV4YDzGX0aKr9T7TSPnZ/gTgMVg8F7Mh pt1eKy4f4z8v4BynU9QHIm7VMpsZb9M= Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-619-zips7KKEMBWnHWDPikhZWg-1; Fri, 05 Jan 2024 06:48:51 -0500 X-MC-Unique: zips7KKEMBWnHWDPikhZWg-1 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-a28f6b75283so42333266b.1 for ; Fri, 05 Jan 2024 03:48:50 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704455329; x=1705060129; 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=XxSGyzS/240RUKKdO2ui4cR3VRu5V8Wrb2zAJsnBtvE=; b=EihOSB1JMbSbcA7b0Wzmi5tg0ihSdQTtMcpv70xwI5IB6AdZ3NYZWYNL179wOIbwnc Z54FxlYYcZrMsV0rCj3GzFgnMTO+hrpcOyXu4iWaK5kQCj3fNjFj1YpO2XJiIu2EhNZZ pU1W2G7WJkRKGbjFjiTw6+3pJH8mlh7pa7d3/HMAyX2ENlsjCt8UdWOgO3vOpAfrobX2 /6L3qJXvrUzxfbe2Vh1fezWM230NUMdSUIBWJfl5PQZC3qzBA3JNgeLrU2wuO9GZ3TeD bbUAj4fctzvtDNIYFyq3nci8lbg6j9f5oboCoIrj9s1fV6xNlrwBdilbsuhMxiq+nUuF lIWA== X-Gm-Message-State: AOJu0YxBTaZpZAmorJo8Q3Jm04NuM1Gn3PJ5/d7ju0XJjiquitSQRRNE gocK1M1rSvc6e9wJmKLrwFF706BcNp+eBYQ+hKY54y1AArEq9K3ParunlGEbOv2ifp7VmKPVVC0 s+lZZzzFaql1kOCyHAR+CwOca62khwqkMLjQz7ZdZtj7cL2pbjk044Vk4DgU05A7LNPbbNTtdH0 Z0pEW/5S0FO7BGvQ== X-Received: by 2002:a17:906:f80a:b0:a19:a19b:78a2 with SMTP id kh10-20020a170906f80a00b00a19a19b78a2mr1025868ejb.101.1704455329207; Fri, 05 Jan 2024 03:48:49 -0800 (PST) X-Google-Smtp-Source: AGHT+IFCh4bUpUtOeQiOUYk6fOYBBcgKu5FbI8O6rBlObZ+wilFnq2sHVuIMdCiCXfzh5npSqy/U9Q== X-Received: by 2002:a17:906:f80a:b0:a19:a19b:78a2 with SMTP id kh10-20020a170906f80a00b00a19a19b78a2mr1025863ejb.101.1704455328835; Fri, 05 Jan 2024 03:48:48 -0800 (PST) Received: from localhost (185.223.159.143.dyn.plus.net. [143.159.223.185]) by smtp.gmail.com with ESMTPSA id vr3-20020a170906bfe300b00a26e53be089sm799390ejb.44.2024.01.05.03.48.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Jan 2024 03:48:47 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH 5/6] gdb/python: Add gdb.Inferior.__dict__ attribute Date: Fri, 5 Jan 2024 11:48:34 +0000 Message-Id: <6eb215cd5252a70326d1ec5bd9c7d96e9a6d20e5.1704455158.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 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: The gdb.Objfile, gdb.Progspace, and gdb.Type Python types already have a __dict__ attribute, which allows users to create user defined attributes within the objects. This is useful if the user wants to cache information within an object. This commit adds the same functionality to the gdb.Inferior type. After this commit there is a new gdb.Inferior.__dict__ attribute, which is a dictionary. A user can, for example, do this: (gdb) pi >>> i = gdb.selected_inferior() >>> i._user_attribute = 123 >>> i._user_attribute 123 >>> There's a new test included. --- gdb/NEWS | 4 +++ gdb/doc/python.texi | 32 ++++++++++++++++++++++++ gdb/python/py-inferior.c | 13 +++++++++- gdb/testsuite/gdb.python/py-inferior.exp | 19 ++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/gdb/NEWS b/gdb/NEWS index 36443c38aca..500d5ab7160 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -92,6 +92,10 @@ show remote thread-options-packet objects can still be obtained through calling other API functions, for example 'gdb.current_progspace()'. + ** User defined attributes can be added to a gdb.Inferior object, + these will be stored in the object's new Inferior.__dict__ + attribute. + * Debugger Adapter Protocol changes ** GDB now emits the "process" event. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index d74defeec0c..721f0100178 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -3667,6 +3667,38 @@ string. @end defun +One may add arbitrary attributes to @code{gdb.Inferior} objects in the +usual Python way. This is useful if, for example, one needs to do +some extra record keeping associated with the inferior. + +In this contrived example we record the time when an inferior last +stopped: + +@smallexample +(gdb) python +import datetime + +def thread_stopped(event): + if event.inferior_thread is not None: + thread = event.inferior_thread + else: + thread = gdb.selected_thread() + inferior = thread.inferior + inferior._last_stop_time = datetime.datetime.today() + +gdb.events.stop.connect(thread_stopped) +(gdb) file /tmp/hello +Reading symbols from /tmp/hello... +(gdb) start +Temporary breakpoint 1 at 0x401198: file /tmp/hello.c, line 18. +Starting program: /tmp/hello + +Temporary breakpoint 1, main () at /tmp/hello.c:18 +18 printf ("Hello World\n"); +(gdb) python print(gdb.selected_inferior()._last_stop_time) +2024-01-04 14:48:41.347036 +@end smallexample + @node Events In Python @subsubsection Events In Python @cindex inferior events in Python diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 929d8bd17b5..3f14bc31459 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -46,6 +46,10 @@ struct inferior_object /* thread_object instances under this inferior. This owns a reference to each object it contains. */ thread_map_t *threads; + + /* Dictionary holding user-added attributes. + This is the __dict__ attribute of the object. */ + PyObject *dict; }; extern PyTypeObject inferior_object_type @@ -241,6 +245,9 @@ inferior_to_inferior_object (struct inferior *inferior) inf_obj->inferior = inferior; inf_obj->threads = new thread_map_t (); + inf_obj->dict = PyDict_New (); + if (inf_obj->dict == nullptr) + return nullptr; /* PyObject_New initializes the new object with a refcount of 1. This counts for the reference we are keeping in the inferior data. */ @@ -981,6 +988,8 @@ infpy_dealloc (PyObject *obj) function is called. */ gdb_assert (inf_obj->inferior == nullptr); + Py_XDECREF (inf_obj->dict); + Py_TYPE (obj)->tp_free (obj); } @@ -1038,6 +1047,8 @@ GDBPY_INITIALIZE_FILE (gdbpy_initialize_inferior); static gdb_PyGetSetDef inferior_object_getset[] = { + { "__dict__", gdb_py_generic_dict, nullptr, + "The __dict__ for this inferior.", &inferior_object_type }, { "arguments", infpy_get_args, infpy_set_args, "Arguments to this program.", nullptr }, { "num", infpy_get_num, NULL, "ID of inferior, as assigned by GDB.", NULL }, @@ -1135,7 +1146,7 @@ PyTypeObject inferior_object_type = 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ + offsetof (inferior_object, dict), /* tp_dictoffset */ 0, /* tp_init */ 0 /* tp_alloc */ }; diff --git a/gdb/testsuite/gdb.python/py-inferior.exp b/gdb/testsuite/gdb.python/py-inferior.exp index 5a221f800c3..0e00636fa1c 100644 --- a/gdb/testsuite/gdb.python/py-inferior.exp +++ b/gdb/testsuite/gdb.python/py-inferior.exp @@ -85,6 +85,15 @@ gdb_test "python print (i0.threads ())" \ gdb_test "python print (i0.progspace)" "" gdb_test "python print (i0.progspace == gdb.progspaces()\[0\])" "True" +# Add a user defined attribute to the inferior, and check the +# attribute can be read back. +gdb_test_no_output "python i0._user_attr = 123" \ + "add a user defined attribute to the inferior object" +gdb_test "python print(i0._user_attr)" \ + "123" "read back user defined attribute from i0" +gdb_test "python print(gdb.inferiors()\[0\]._user_attr)" \ + "123" "read back user defined attribute from gdb.inferiors" + # Test the number of inferior threads. gdb_breakpoint check_threads @@ -127,6 +136,16 @@ gdb_test "print str" " = \"hallo, testsuite\"" \ # correct inferior. set num [add_inferior] +# Confirm the new inferior doesn't have the user defined attribute, +# but that the first inferior does still have the attribute. +gdb_test "python print(gdb.inferiors()\[1\]._user_attr)" \ + [multi_line \ + "AttributeError: 'gdb\\.Inferior' object has no attribute '_user_attr'" \ + "Error while executing Python code\\."] \ + "check new inferior doesn't have user defined attribute" +gdb_test "python print(gdb.inferiors()\[0\]._user_attr)" \ + "123" "read back user defined attribute again" + # Test memory search. set hex_number {0x[0-9a-fA-F][0-9a-fA-F]*} -- 2.25.4