From patchwork Sun Nov 27 12:54:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philippe Waroquiers X-Patchwork-Id: 61128 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4A42B3858C1F for ; Sun, 27 Nov 2022 12:54:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4A42B3858C1F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1669553686; bh=P6aP6RYT4tWQ+YH3uD1deTiTSTfgqfYqwxhw/3pBEto=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=m8wys9gXw1SFEwC2TI6xi89Jq7IzLXRCTTB/SGW9qq/sq0yWuMCC47H5idbhKWK/q TbaWzS5YRi0hEHQu2fdv8twz8S49DQNHKE6hcwKNz6hTmQ/Lylg/1UlAK1Ugvh+kOd xTC2WKd8m08Opkzvh4+Vt8UPmraS3s04hTMI3VTY= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mailsec207.isp.belgacom.be (mailsec207.isp.belgacom.be [195.238.22.103]) by sourceware.org (Postfix) with ESMTPS id A385238518AA for ; Sun, 27 Nov 2022 12:54:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A385238518AA X-ExtLoop: 1 X-IPAS-Result: A2BYBAAyXYNj/1uGgG1aHgEBCxIMSYE7C5pynzUPAQEBAQEBAQEBCUQEAQGFBYUKJjcGDgECBAEBAQEDAgMBAQEBAQEDAQEGAQEBAQEBBgQBgRyFL0aCNSKDfysLAUaEToMjrm0zgQGEcJpmgWeBQAGLU4V5gVVEhA+EeYZ3BJkUAwkDBwVJQAMLGA0WMgoTMhtYDgkfHCUNBQYSAyBsBQc6DygvZCscGweBDCooFQMEBAMCBhMDIgINKTEUBCkTDSsnbwkCAyJqAwMEKCwDCSEfByckPAdWOgUDAg8gOAYDCQMCIlRyLxIUBQMLFSUIBUsECDkFBlISAgoRAxIPLEUOSD45FgYnQgEwDg4TA11LHYEBBIImCjEvnRZTKBMUbyRxZJJBEgGOT4QUnHw0B4NsgUkGDJ5iGjKDeJM8kWQBlzejJ4RRgXiBf22DO1EZD44pGY4vgS8CBwsBAQMJh0YCLYIqAQE IronPort-PHdr: A9a23:cloK4RYefU3LR89cIRprxSL/LTG60IqcDmcuAnoPtbtCf+yZ8oj4O wSHvLMx1gOPAt2Qt64My7KP9fy6AipYudfJmUtBWaQEbwUCh8QSkl5oK+++Imq/EsTXaTcnF t9JTl5v8iLzG0FUHMHjew+a+SXqvnYdFRrlKAV6OPn+FJLMgMSrzeCy/IDYbxlViDanbr5+M hq7oR/Tu8UKjodvJak8wQbNrndUZuha32xlKUydkhrm+su84Jtv+DlMtvw88MJNTb/0dLkiQ 7xCCzQmPWE15Mn1uhTGUACC+HgSXHgInxRRGwTK4w30UZn3sivhq+pywzKaMtHsTbA1Qjut8 aFmQwL1hSgdNj459GbXitFsjK9evRmsqQBzz5LSbYqIMvd1Y6HTcs4ARWdZXshfSTJMDJ6yY YUMCOQOMulWopLhq1YNtxayGROhCP/zxjJOm3T43bc60+MkEQzexgIgH9MOsHDVrNXtLKcdT /2+w6nSwjXZaPNWwCr96InWfRA7uvGHQLV9cdLRyUkuEwPFj02QqZT7MD+P2OUCqXKb7+15V eKyim4otRtxoiO0y8c3iYnIhoQVxU7Y9Slj24k6O8S1RUhmatGrDJVerTuVN5dqQsw8WWFov j43x7MbtJO6cyUG1ZQpyR7fZfGDcIWE/w/uWPifLzl3mn9rdq6zihS8/EW9y+DxWce63llUo yZbk9TAq38A2gDS58WBV/Bz/V+h1C6S2wzP7uxIO104mbTYJpI737I9mJUevV7HEyPrnkj9k bWYeV8++uey7uTqerDmppiBOIBqkgz+KaEumtCnAeQ/LwgOQ3CX+eSi273n+k30WLBKgeAsn qnZt5DaINoUqra4Aw9TzIkj9w6yAyq63Nkch3ULMUxJdRGdg4T0NVzDL+r0APOij1i0lTdk3 fHGPrnvApXXKXjDla/sfa59605dzAozzMhf54pKBb0bLvP8QFXxtNvBDh8kMgy73fznCM5m2 4MFWmKOAqmZP73OsVOS/e0gPfGAZIkOtznlMfgq++bujWMlmV8aZaSlw4MbaGqkEfR+P0WZf X3sj88OEWgXpQUyVfTqh0eeUTFPZ3a9Qbk86yogCIKhEIfDXJyij6KP3SihBJ1ZeHpKCleWE Xfnb4mEQesDaDqOIs99lTwJTaChS48g1RGqtQ/606JnIfTO9iwWr53jzt915/TOlREz6zN0F d+d3nqWT2F3nmIIQSE53LxlrUNm1FjQmZR/1vNUH5lL7u9CUgohHYXb0vZxBs/7QA+Hec2GG 3i8RdDzOTEwStMp29JGXE9nHMy/jx3ZxGL+G78Uk72THJFy7avG2GHsJstn0F7d17gngkVgS MYZZj7uvbJ26wWGX92BqE6ejav/Lcwh IronPort-Data: A9a23:yeRRa6DRdwkmsBVW/0viw5YqxClBgxIJ4kV8jS/XYbTApDMggjQDx zEaWmuAOK7fYjCgfdolaYq+oxsHuJLVm95jOVdlrnsFo1CmCSbm6XV1Cm+qYkt+++WaFBoPA /02M4WGdoZtJpPljk/FGqD7qnVh3r2/SLP5CerVUgh8XgYMpB0J0HqPoMZkxN826TSFK1nV4 4mr+peAYAbNNwNcawr41YrS8HuDg9yv4Fv0jnRmDdhXsVnXkWUiDZ53Dcld+FOhH+G4tsbjL wry5OnRElHxpn/BOfv5+lrPSXDmd5aJVeS4ZtW6bID56vRKjnRaPq/Wr5PwY28P49mCt4gZJ NmgKfVcRC9xVpAgltjxXDFXNTpbLK9MyITFAiiboeqtxFGdeHvzlqAG4EEeZeX0+85yDSdO8 vkVQNwPRknb1qTvmuL9E7IwwJV6RCXoFNp3VnVI1THYCfc+WZ2FXKzQ4sZF3ToqnehVHufYa tZfYzcHgBHoOkwXYA5GVslWcOGAuib6UR1nsWmsnK9w3mbC1ypT+uHXP4+AEjCNbYAP9qqCn UrJ8268GhgGP9yS0hKe9W+2jeLQlDn2HoUIG9WQ7v5rhFyL3mFVFxQMUkKmoPSjkWalWMNZJ lBS8CdGkEQp3B3yCICmA1jh+i7B50ZNHdNcCOl/5BCLjKvP+0CTC2wLRzVGbZosuafaWAAX6 7NApPuxbRQHjVFfYSv1Gmu8xd95BcTZwaLuq8PJocvpLuQPeL0Osy8= IronPort-HdrOrdr: A9a23:zS0fIqH2HrXZz9W7pLqFpZLXdLJyesId70hD6qkvc3ElFPBwxv rF7ZMmPEHP40d0ZJh5o6H0BEGBKUmsiKKdkrNhSYtKOzOW+ldATbsSrrcKpgeNJ8SQzJ8t6U 4NSdkENDS0NykJsS+Y2nj8Lz9D+qj2zEnAv463vhIdNHATV0gj1XYLNu/xKDwLeOAyP+tGKH Pq3Ls5m9PPQwVsUu2LQlYCRPbKvNDGmdboZwVuPW9E1CC+yRKh7Zj8H1y22AwBWyhDzbpn3m 7f+jaY2oyT99Cyzzna2yvywv1t6bjc4+oGJcSIrM8Ybg7hhSaEDb4OZ5Sy+BE8pcep5BIRuL D3zCsIDoBW0Tf8b2u1qRzi103LyzA18ULvzleenD/KvdH5bChSMbsHuatpNj/ir2YwttB116 xGm0iDsYBMMB/GlCPho/DVShBRkFauq3ZKq59Us5Ufa/pHVFcdxbZvpX+9Iq1wRh4S27pXTd WGOfusv8q/KTuhHizkVydUsYORtz8Ib2C7qwA5y7qoOm9t/UyRiXFogPD3s01wu67VcaM0qd jsI+BtjvVDX8UWZaVyCKMIRta2EHXERVbJPHiJKVrqGakbMzaVwqSHoIkd9aWvYtgF3ZEykJ POXBdRsnMzYVvnDYmL0IdQ+h7ATW2hVXDmy91Y5ZJ+prrgLYCbcBFqYzgV4oKdS3F1OLyWZx +eAuMaPxa4FxqkJW9g5Xy1Z3FzQUNuGPEohg== X-IronPort-Anti-Spam-Filtered: true Received: from 91.134-128-109.adsl-dyn.isp.belgacom.be (HELO md.home) ([109.128.134.91]) by relay.proximus.be with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Nov 2022 13:54:19 +0100 To: gdb-patches@sourceware.org Cc: Philippe Waroquiers Subject: [RFA] Fix leak in the dwarf reader Date: Sun, 27 Nov 2022 13:54:13 +0100 Message-Id: <20221127125413.2769629-1-philippe.waroquiers@skynet.be> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-Patchwork-Original-From: Philippe Waroquiers via Gdb-patches From: Philippe Waroquiers Reply-To: Philippe Waroquiers Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Valgrind reports a leak in the dwarf reader (see details below). The function dw2_get_file_names_reader is interning in the per_objfile all the file names it finds, except the name of 'fnd file name and directory'. Instead, it was xstrdup-ing the name. Fix the leaks by also interning the name. This was validated running the tests natively, and under valgrind. Leaks have decreased as mentionned below. Valgrind detected no error such as double free or use after free. Stack trace of the leak: ==4113266== 490,735 bytes in 17,500 blocks are definitely lost in loss record 7,061 of 7,074 ==4113266== at 0x483979B: malloc (vg_replace_malloc.c:393) ==4113266== by 0x25A454: xmalloc (alloc.c:57) ==4113266== by 0x7D1E1E: xstrdup (xstrdup.c:34) ==4113266== by 0x39D141: dw2_get_file_names_reader (read.c:2825) ==4113266== by 0x39D141: dw2_get_file_names(dwarf2_per_cu_data*, dwarf2_per_objfile*) (read.c:2851) ==4113266== by 0x39DD6C: dw_expand_symtabs_matching_file_matcher(dwarf2_per_objfile*, gdb::function_view) (read.c:4149) ==4113266== by 0x3BC8B5: cooked_index_functions::expand_symtabs_matching(objfile*, gdb::function_view, lookup_name_info const*, gdb::function_view, gdb::function_view, enum_flags, domain_enum, search_domain) (read.c:18688) ==4113266== by 0x5DD1EA: objfile::map_symtabs_matching_filename(char const*, char const*, gdb::function_view) (symfile-debug.c:207) ==4113266== by 0x5F04CC: iterate_over_symtabs(char const*, gdb::function_view) (symtab.c:633) ==4113266== by 0x477EE3: collect_symtabs_from_filename(char const*, program_space*) (linespec.c:3712) ==4113266== by 0x477FC1: symtabs_from_filename(char const*, program_space*) (linespec.c:3726) ==4113266== by 0x47A9B8: convert_explicit_location_spec_to_linespec(linespec_state*, linespec*, char const*, char const*, symbol_name_match_type, char const*, line_offset) (linespec.c:2329) ==4113266== by 0x47E86E: convert_explicit_location_spec_to_sals (linespec.c:2388) ==4113266== by 0x47E86E: location_spec_to_sals(linespec_parser*, location_spec const*) (linespec.c:3104) ==4113266== by 0x47EDAC: decode_line_full(location_spec*, int, program_space*, symtab*, int, linespec_result*, char const*, char const*) (linespec.c:3149) ... Without the fix, the top 10 leaks are: ./gdb/testsuite/outputs/gdb.base/condbreak-bad/gdb.log:345:==3213924== definitely lost: 130,937 bytes in 5,409 blocks ./gdb/testsuite/outputs/gdb.base/hbreak2/gdb.log:619:==3758919== definitely lost: 173,323 bytes in 7,204 blocks ./gdb/testsuite/outputs/gdb.mi/mi-var-cp/gdb.log:1320:==4152873== definitely lost: 172,826 bytes in 7,207 blocks ./gdb/testsuite/outputs/gdb.base/advance-until-multiple-locations/gdb.log:398:==2992643== definitely lost: 172,965 bytes in 7,211 blocks ./gdb/testsuite/outputs/gdb.mi/mi-var-cmd/gdb.log:2302:==4159476== definitely lost: 173,129 bytes in 7,211 blocks ./gdb/testsuite/outputs/gdb.cp/gdb2384/gdb.log:222:==3811851== definitely lost: 218,106 bytes in 7,761 blocks ./gdb/testsuite/outputs/gdb.cp/mb-templates/gdb.log:310:==3787344== definitely lost: 290,311 bytes in 10,340 blocks ./gdb/testsuite/outputs/gdb.mi/mi-var-rtti/gdb.log:2568:==4158350== definitely lost: 435,427 bytes in 15,507 blocks ./gdb/testsuite/outputs/gdb.mi/mi-catch-cpp-exceptions/gdb.log:1704:==4119722== definitely lost: 435,405 bytes in 15,510 blocks ./gdb/testsuite/outputs/gdb.mi/mi-vla-fortran/gdb.log:768:==4113266== definitely lost: 508,585 bytes in 18,109 blocks With the fix: ./gdb/testsuite/outputs/gdb.base/fork-running-state/gdb.log:1536:==2924193== indirectly lost: 13,848 bytes in 98 blocks ./gdb/testsuite/outputs/gdb.base/fork-running-state/gdb.log:1675:==2928777== indirectly lost: 13,848 bytes in 98 blocks ./gdb/testsuite/outputs/gdb.python/py-inferior-leak/gdb.log:4729:==3353335== definitely lost: 3,360 bytes in 140 blocks ./gdb/testsuite/outputs/gdb.base/kill-detach-inferiors-cmd/gdb.log:210:==2746927== indirectly lost: 13,246 bytes in 154 blocks ./gdb/testsuite/outputs/gdb.base/inferior-clone/gdb.log:179:==3034984== indirectly lost: 12,921 bytes in 161 blocks ./gdb/testsuite/outputs/gdb.base/interrupt-daemon/gdb.log:209:==3006248== indirectly lost: 20,683 bytes in 174 blocks ./gdb/testsuite/outputs/gdb.threads/watchpoint-fork/gdb.log:714:==3512403== indirectly lost: 20,707 bytes in 175 blocks ./gdb/testsuite/outputs/gdb.threads/watchpoint-fork/gdb.log:962:==3514498== indirectly lost: 20,851 bytes in 178 blocks ./gdb/testsuite/outputs/gdb.base/multi-forks/gdb.log:336:==2585839== indirectly lost: 53,630 bytes in 386 blocks ./gdb/testsuite/outputs/gdb.base/multi-forks/gdb.log:1338:==2592417== indirectly lost: 100,008 bytes in 1,154 blocks --- gdb/dwarf2/read.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 53a6a8b5e6d..87c0914d839 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -2822,7 +2822,7 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader, XOBNEWVEC (&per_objfile->per_bfd->obstack, const char *, qfn->num_file_names); if (offset != 0) - qfn->file_names[0] = xstrdup (fnd.get_name ()); + qfn->file_names[0] = per_objfile->objfile->intern (fnd.get_name ()); if (!include_names.empty ()) memcpy (&qfn->file_names[offset], include_names.data (),