This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Garbarge collector eats gdb.selected_thread().inferior
- From: Simon Marchi <simon dot marchi at polymtl dot ca>
- To: Максим Дзабраев <dzabraew at gmail dot com>
- Cc: gdb-patches at sourceware dot org, Tom Tromey <tom at tromey dot com>
- Date: Mon, 07 Aug 2017 22:56:37 +0200
- Subject: Re: Garbarge collector eats gdb.selected_thread().inferior
- Authentication-results: sourceware.org; auth=none
- References: <CALiEZtGq0tQG_ZtaLWLr_7u7hzdYqRoaPbC6aL0_LpSCyHjeBw@mail.gmail.com>
Hi Maksim,
The fix looks right, and Tom also said so in Bugzilla.
However, I'm unable to apply your patch to look at the test case. The
long lines have been wrapped, presumably by your email client. Can you
send it again using the "git send-email" command? I'll still make the
comments I can about the current version.
On 2017-08-05 07:57, Максим Дзабраев wrote:
If multiple time call gdb.selected_thread ().inferior, gdb throw
exception:
(gdb) pi gdb.selected_thread().inferior
<gdb.Inferior object at 0x7f1952bea698>
(gdb) pi gdb.selected_thread().inferior
<gdb.Inferior object at 0x7f1952bea698>
(gdb) pi gdb.selected_thread().inferior
Python Exception <type 'exceptions.AttributeError'> 'NoneType' object
has no attribute 'inferior':
Error while executing Python code.
(gdb) info threads
Id Target Id Frame
* 1 Thread 0x7f54f0474740 (LWP 584) "mc" 0x00007f54ef055c33 in
select () from /lib/x86_64-linux-gnu/libc.so.6
I report about this bug here:
https://sourceware.org/bugzilla/show_bug.cgi?id=21213
Following patch fixes this bug and add test of this bug. In attachment
I add gdb.log and gdb.sum before and after apply patch to
thpy_get_inferior.
ChangeLog
2017.08.05 Maksim Dzabraev <dzabraew@gmail.com>
* gdb/python/py-infthread.c (hpy_get_inferior)
* gdb/testsuite/gdb.python/py-infthread.exp: Fix bug 21213 and
add test
Please consult this page for details about the ChangeLog entries.
https://sourceware.org/gdb/wiki/ContributionChecklist
In short, each change should be documented in the ChangeLog closest to
it (then for each file you write the relative path to it), and should
describe what changed a bit more precisely. For example:
gdb/ChangeLog:
* python/py-infthread.c (thpy_get_inferior): Increment reference
of inferior before returning it.
gdb/testsuite/ChangeLog:
* gdb.python/py-infthread.exp: Test calling
InferiorThread.inferior () multiple times in a row.
---
diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c
index 626c15c..31d576f 100644
--- a/gdb/python/py-infthread.c
+++ b/gdb/python/py-infthread.c
@@ -162,6 +162,7 @@ thpy_get_inferior (PyObject *self, void *ignore)
thread_object *thread_obj = (thread_object *) self;
THPY_REQUIRE_VALID (thread_obj);
+ Py_INCREF (thread_obj->inf_obj);
return thread_obj->inf_obj;
}
diff --git a/gdb/testsuite/gdb.python/py-infthread.exp
b/gdb/testsuite/gdb.python/py-infthread.exp
index a5fed8d..dcb7e26 100644
--- a/gdb/testsuite/gdb.python/py-infthread.exp
+++ b/gdb/testsuite/gdb.python/py-infthread.exp
@@ -39,6 +39,14 @@ if ![runto_main] then {
# Test basic gdb.Inferior attributes and methods.
+#testing https://sourceware.org/bugzilla/show_bug.cgi?id=21213
It's nice to give a bit of context so that readers don't have to visit
the PR to have an idea of what it's about. I suggest:
# Make sure that InferiorThread.inferior returns a new reference (see PR
21213).
+gdb_py_test_silent_cmd "python gdb.selected_thread ().inferior" "test
gdb.selected_thread" 1
+gdb_py_test_silent_cmd "python gdb.selected_thread ().inferior" "test
gdb.selected_thread" 1
+gdb_test_no_output "python import gc; gc.collect()" "test
InferiorThread.inferior" "test InferiorThread.inferior"
You have one too many parameter to gdb_test_no_output. Also, the test
name should probably be something like "call Python garbage collection".
+gdb_py_test_silent_cmd "python gdb.selected_thread ().inferior" "test
gdb.selected_thread" 1
+gdb_py_test_silent_cmd "python gdb.selected_thread ().inferior" "test
gdb.selected_thread" 1
All tests (here one line == one test) should have a unique name, so you
could name them "test InferiorThread.inferior #" where # is 1, 2, 3, 4.
+
+
gdb_py_test_silent_cmd "python t0 = gdb.selected_thread ()" "test
gdb.selected_thread" 1
gdb_test "python print (t0)" "\\<gdb.InferiorThread object at
0x\[\[:xdigit:\]\]+>" "verify InferiorThread object"
gdb_test "python print ('result = %s' % t0.num)" " = 1" "test
Thanks!
Simon