Message ID | CALiEZtGq0tQG_ZtaLWLr_7u7hzdYqRoaPbC6aL0_LpSCyHjeBw@mail.gmail.com |
---|---|
State | New |
Headers | show |
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
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 +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" +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_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 InferiorThread.num"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 path fixes this bug and add test of this bug. 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 --- 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 +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" +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