From patchwork Sat Aug 5 05:57:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?0JzQsNC60YHQuNC8INCU0LfQsNCx0YDQsNC10LI=?= X-Patchwork-Id: 21930 Received: (qmail 112295 invoked by alias); 5 Aug 2017 05:58:50 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 111729 invoked by uid 89); 5 Aug 2017 05:57:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-io0-f170.google.com Received: from mail-io0-f170.google.com (HELO mail-io0-f170.google.com) (209.85.223.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 05 Aug 2017 05:57:03 +0000 Received: by mail-io0-f170.google.com with SMTP id o9so12392242iod.1 for ; Fri, 04 Aug 2017 22:57:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=C99LyWvMPWsq1tla9F4Y/weRszwrJzcKh9NdSH8tSUc=; b=rT2r+UcmHk0V8FxClAfmpns+4DAYwHwMB67iqRPCymQIFYTUFbSuMs1RXM00ilDUNL BM1clpCwr8oViuinRxBKfl3QXiyi0eaq8CxEtt9cb3Kl4devaEL14D/w9AuYj6kIDcjD FbRKaADr+pB+6unnknqGJapE/+USIANDTtDNqcq5HwMeJcQA+WQkpWdfVaGRyTEdZPnU n1JOGHOmvFgx+3M4J7YLuD9GjcjhLko1q/A4ycq9psZnfhdsxAJuvC3e/i7emfzEXCZL yRyOC46Joy2WOMjD9QGIGddUutMDe1l3Mv3KDMXX/QfW1fMA9c2bsLSVSXY0Sp8y4537 Ex2Q== X-Gm-Message-State: AHYfb5hKXmpbtZvQdLhc4lDDViJ9tt3RznTAdE91/bYQjAODpb6Hlvae b06MjsfUOR705H0+FH6vOA83IFjFTz67J9s= X-Received: by 10.107.6.78 with SMTP id 75mr5359210iog.136.1501912621063; Fri, 04 Aug 2017 22:57:01 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.84.7 with HTTP; Fri, 4 Aug 2017 22:57:00 -0700 (PDT) From: =?UTF-8?B?0JzQsNC60YHQuNC8INCU0LfQsNCx0YDQsNC10LI=?= Date: Sat, 5 Aug 2017 12:57:00 +0700 Message-ID: Subject: Garbarge collector eats gdb.selected_thread().inferior To: gdb-patches@sourceware.org If multiple time call gdb.selected_thread ().inferior, gdb throw exception: (gdb) pi gdb.selected_thread().inferior (gdb) pi gdb.selected_thread().inferior (gdb) pi gdb.selected_thread().inferior Python Exception '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 * gdb/python/py-infthread.c (hpy_get_inferior) * gdb/testsuite/gdb.python/py-infthread.exp: Fix bug 21213 and add test --- + + gdb_py_test_silent_cmd "python t0 = gdb.selected_thread ()" "test gdb.selected_thread" 1 gdb_test "python print (t0)" "\\" "verify InferiorThread object" gdb_test "python print ('result = %s' % t0.num)" " = 1" "test InferiorThread.num" Test Run By maksim on Sat Aug 5 10:48:22 2017 Native configuration is x86_64-pc-linux-gnu === gdb tests === Schedule of variations: unix Running target unix Using /usr/share/dejagnu/baseboards/unix.exp as board description file for target. Using /usr/share/dejagnu/config/unix.exp as generic interface file for target. Using /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/config/unix.exp as tool-and-target-specific interface file. Running /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.exp ... get_compiler_info: gcc-4-8-4 Executing on host: gcc -c -g -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c (timeout = 300) spawn gcc -c -g -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c Executing on host: gcc /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o -g -lm -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread (timeout = 300) spawn gcc /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o -g -lm -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread spawn /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory GNU gdb (GDB) 8.0.50.20170804-git Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". (gdb) set height 0 (gdb) set width 0 (gdb) dir Reinitialize source path to empty? (y or n) y Source directories searched: $cdir:$cwd (gdb) dir /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python Source directories searched: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd (gdb) kill The program is not being run. (gdb) file /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread Reading symbols from /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread...done. (gdb) spawn /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory GNU gdb (GDB) 8.0.50.20170804-git Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". (gdb) set height 0 (gdb) set width 0 (gdb) dir Reinitialize source path to empty? (y or n) y Source directories searched: $cdir:$cwd (gdb) dir /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python Source directories searched: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd (gdb) kill The program is not being run. (gdb) file /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread Reading symbols from /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread...done. (gdb) python print ('test') test (gdb) python print (sys.version_info[0]) 2 (gdb) python print (sys.version_info[1]) 7 (gdb) delete breakpoints (gdb) info breakpoints No breakpoints or watchpoints. (gdb) break main Breakpoint 1 at 0x40052b: file /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c, line 13. (gdb) run Starting program: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread warning: the debug information found in "/lib64/ld-2.19.so" does not match "/lib64/ld-linux-x86-64.so.2" (CRC mismatch). Breakpoint 1, main (argc=1, argv=0x7fffffffe108) at /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c:13 13 return f1 (1, 2); (gdb) python gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python import gc; gc.collect() (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior python gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python i0 = gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior python t0 = gdb.selected_thread () (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python print (t0) (gdb) PASS: gdb.python/py-infthread.exp: verify InferiorThread object python print ('result = %s' % t0.num) result = 1 (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.num python print ('result = %s' % t0.global_num) result = 1 (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.global_num python print ('result = %s' % str (t0.ptid)) result = (7890, 7890, 0) (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.ptid python print ('result = %s' % i0.num) result = 1 (gdb) PASS: gdb.python/py-infthread.exp: test Inferior.num python name = gdb.selected_thread().name (gdb) PASS: gdb.python/py-infthread.exp: get supplied name of current thread python gdb.selected_thread().name = 'hibob' (gdb) PASS: gdb.python/py-infthread.exp: set name of current thread python print (gdb.selected_thread().name) hibob (gdb) PASS: gdb.python/py-infthread.exp: check name of current thread python gdb.selected_thread().name = None (gdb) PASS: gdb.python/py-infthread.exp: reset name of current thread python print (gdb.selected_thread().name == name) True (gdb) PASS: gdb.python/py-infthread.exp: check name of current thread again python print ('result = %s' % t0.is_stopped ()) result = True (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.is_stopped python print ('result = %s' % t0.is_running ()) result = False (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.is_running python print ('result = %s' % t0.is_exited ()) result = False (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.is_exited python print ('result = %s' % t0.is_valid ()) result = True (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.is_valid kill inferior 1 (gdb) PASS: gdb.python/py-infthread.exp: kill inferior 1 python print ('result = %s' % t0.is_valid ()) result = False (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.is_valid testcase /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.exp completed in 2 seconds === gdb Summary === # of expected passes 23 Executing on host: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory --version (timeout = 300) spawn /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory --version GNU gdb (GDB) 8.0.50.20170804-git Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb version 8.0.50.20170804-git -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory runtest completed at Sat Aug 5 10:48:24 2017 Test Run By maksim on Sat Aug 5 10:41:15 2017 Native configuration is x86_64-pc-linux-gnu === gdb tests === Schedule of variations: unix Running target unix Using /usr/share/dejagnu/baseboards/unix.exp as board description file for target. Using /usr/share/dejagnu/config/unix.exp as generic interface file for target. Using /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/config/unix.exp as tool-and-target-specific interface file. Running /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.exp ... get_compiler_info: gcc-4-8-4 Executing on host: gcc -c -g -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c (timeout = 300) spawn gcc -c -g -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c Executing on host: gcc /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o -g -lm -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread (timeout = 300) spawn gcc /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread0.o -g -lm -o /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread spawn /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory GNU gdb (GDB) 8.0.50.20170804-git Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". (gdb) set height 0 (gdb) set width 0 (gdb) dir Reinitialize source path to empty? (y or n) y Source directories searched: $cdir:$cwd (gdb) dir /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python Source directories searched: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd (gdb) kill The program is not being run. (gdb) file /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread Reading symbols from /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread...done. (gdb) spawn /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory GNU gdb (GDB) 8.0.50.20170804-git Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". (gdb) set height 0 (gdb) set width 0 (gdb) dir Reinitialize source path to empty? (y or n) y Source directories searched: $cdir:$cwd (gdb) dir /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python Source directories searched: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd (gdb) kill The program is not being run. (gdb) file /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread Reading symbols from /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread...done. (gdb) python print ('test') test (gdb) python print (sys.version_info[0]) 2 (gdb) python print (sys.version_info[1]) 7 (gdb) delete breakpoints (gdb) info breakpoints No breakpoints or watchpoints. (gdb) break main Breakpoint 1 at 0x40052b: file /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c, line 13. (gdb) run Starting program: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/outputs/gdb.python/py-infthread/py-infthread warning: the debug information found in "/lib64/ld-2.19.so" does not match "/lib64/ld-linux-x86-64.so.2" (CRC mismatch). Breakpoint 1, main (argc=1, argv=0x7fffffffe108) at /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.c:13 13 return f1 (1, 2); (gdb) python import gc; gc.collect() (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior python gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python gdb.selected_thread ().inferior (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python import gc; gc.collect() (gdb) PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior python gdb.selected_thread ().inferior Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'inferior' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test gdb.selected_thread python gdb.selected_thread ().inferior Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'inferior' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test gdb.selected_thread python i0 = gdb.selected_thread ().inferior Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'inferior' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.inferior python t0 = gdb.selected_thread () (gdb) PASS: gdb.python/py-infthread.exp: test gdb.selected_thread python print (t0) None (gdb) FAIL: gdb.python/py-infthread.exp: verify InferiorThread object python print ('result = %s' % t0.num) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'num' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.num python print ('result = %s' % t0.global_num) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'global_num' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.global_num python print ('result = %s' % str (t0.ptid)) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'ptid' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.ptid python print ('result = %s' % i0.num) Traceback (most recent call last): File "", line 1, in NameError: name 'i0' is not defined Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test Inferior.num python name = gdb.selected_thread().name Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'name' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: get supplied name of current thread python gdb.selected_thread().name = 'hibob' Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'name' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: set name of current thread python print (gdb.selected_thread().name) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'name' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: check name of current thread python gdb.selected_thread().name = None Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'name' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: reset name of current thread python print (gdb.selected_thread().name == name) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'name' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: check name of current thread again python print ('result = %s' % t0.is_stopped ()) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'is_stopped' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_stopped python print ('result = %s' % t0.is_running ()) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'is_running' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_running python print ('result = %s' % t0.is_exited ()) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'is_exited' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_exited python print ('result = %s' % t0.is_valid ()) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'is_valid' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_valid kill inferior 1 (gdb) PASS: gdb.python/py-infthread.exp: kill inferior 1 python print ('result = %s' % t0.is_valid ()) Traceback (most recent call last): File "", line 1, in AttributeError: 'NoneType' object has no attribute 'is_valid' Error while executing Python code. (gdb) FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_valid testcase /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.exp completed in 0 seconds === gdb Summary === # of expected passes 6 # of unexpected failures 18 Executing on host: /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory --version (timeout = 300) spawn /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory --version GNU gdb (GDB) 8.0.50.20170804-git Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word". /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb version 8.0.50.20170804-git -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory runtest completed at Sat Aug 5 10:41:15 2017 Test Run By maksim on Sat Aug 5 10:48:22 2017 Native configuration is x86_64-pc-linux-gnu === gdb tests === Schedule of variations: unix Running target unix Running /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.exp ... PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: verify InferiorThread object PASS: gdb.python/py-infthread.exp: test InferiorThread.num PASS: gdb.python/py-infthread.exp: test InferiorThread.global_num PASS: gdb.python/py-infthread.exp: test InferiorThread.ptid PASS: gdb.python/py-infthread.exp: test Inferior.num PASS: gdb.python/py-infthread.exp: get supplied name of current thread PASS: gdb.python/py-infthread.exp: set name of current thread PASS: gdb.python/py-infthread.exp: check name of current thread PASS: gdb.python/py-infthread.exp: reset name of current thread PASS: gdb.python/py-infthread.exp: check name of current thread again PASS: gdb.python/py-infthread.exp: test InferiorThread.is_stopped PASS: gdb.python/py-infthread.exp: test InferiorThread.is_running PASS: gdb.python/py-infthread.exp: test InferiorThread.is_exited PASS: gdb.python/py-infthread.exp: test InferiorThread.is_valid PASS: gdb.python/py-infthread.exp: kill inferior 1 PASS: gdb.python/py-infthread.exp: test InferiorThread.is_valid === gdb Summary === # of expected passes 23 /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb version 8.0.50.20170804-git -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory Test Run By maksim on Sat Aug 5 10:41:15 2017 Native configuration is x86_64-pc-linux-gnu === gdb tests === Schedule of variations: unix Running target unix Running /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.python/py-infthread.exp ... PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: test gdb.selected_thread PASS: gdb.python/py-infthread.exp: test InferiorThread.inferior FAIL: gdb.python/py-infthread.exp: test gdb.selected_thread FAIL: gdb.python/py-infthread.exp: test gdb.selected_thread FAIL: gdb.python/py-infthread.exp: test InferiorThread.inferior PASS: gdb.python/py-infthread.exp: test gdb.selected_thread FAIL: gdb.python/py-infthread.exp: verify InferiorThread object FAIL: gdb.python/py-infthread.exp: test InferiorThread.num FAIL: gdb.python/py-infthread.exp: test InferiorThread.global_num FAIL: gdb.python/py-infthread.exp: test InferiorThread.ptid FAIL: gdb.python/py-infthread.exp: test Inferior.num FAIL: gdb.python/py-infthread.exp: get supplied name of current thread FAIL: gdb.python/py-infthread.exp: set name of current thread FAIL: gdb.python/py-infthread.exp: check name of current thread FAIL: gdb.python/py-infthread.exp: reset name of current thread FAIL: gdb.python/py-infthread.exp: check name of current thread again FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_stopped FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_running FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_exited FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_valid PASS: gdb.python/py-infthread.exp: kill inferior 1 FAIL: gdb.python/py-infthread.exp: test InferiorThread.is_valid === gdb Summary === # of expected passes 6 # of unexpected failures 18 /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../../gdb/gdb version 8.0.50.20170804-git -nw -nx -data-directory /home/maksim/sources/obj-binutils-gdb/gdb/testsuite/../data-directory 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)" "\\" "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) pi gdb.selected_thread().inferior (gdb) pi gdb.selected_thread().inferior Python Exception '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 * 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