From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25072 invoked by alias); 3 Feb 2011 16:51:41 -0000 Received: (qmail 25060 invoked by uid 22791); 3 Feb 2011 16:51:36 -0000 X-SWARE-Spam-Status: No, hits=1.7 required=5.0 tests=AWL,BAYES_50,FSL_RU_URL,TW_BJ,TW_FC,TW_FD,TW_JC,TW_XF X-Spam-Check-By: sourceware.org Received: from mail.apical.co.uk (HELO srv1.office.apical.co.uk) (213.106.251.44) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 03 Feb 2011 16:51:27 +0000 Received: from [10.250.148.115] (23.nat.acronis.net [91.195.22.23]) (authenticated bits=0) by srv1.office.apical.co.uk (8.14.4/8.14.4) with ESMTP id p13GpI5P011895 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 3 Feb 2011 16:51:20 GMT Message-ID: <4D4AD9C0.7080709@sw.ru> Date: Thu, 03 Feb 2011 16:51:00 -0000 From: Vladimir Simonov User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100430 Fedora/3.0.4-2.fc11 Thunderbird/3.0.4 MIME-Version: 1.0 To: Paul Pluzhnikov CC: gdb-patches@sourceware.org Subject: Re: gdb: Incorrect stack unwinding if compressed debug info is used References: <1296238472.3009.ezmlm@sourceware.org> <4D46D872.6080407@sw.ru> In-Reply-To: Content-Type: multipart/mixed; boundary="------------060204060804070204020204" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-02/txt/msg00045.txt.bz2 This is a multi-part message in MIME format. --------------060204060804070204020204 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 7bit Content-length: 4360 On 02/02/2011 10:55 PM, Paul Pluzhnikov wrote: > On Mon, Jan 31, 2011 at 7:42 AM, Vladimir Simonov wrote: > >> If I create -Od -g3 executable with -Wl,compressed-debug-sections=zlib > > What is '-Od' ? > > And you mean '-Wl,--compress-debug-sections=zlib', not > '-Wl,compressed-debug-sections=zlib' Sorry, to the end of day cl/gcc options are messed in my head. "-g -O0" are used as gcc options, "objcopy --compress-debug-sections --only-keep-debug" is used to compress debug info. You can see build procedure in attached b.sh file. > >> using gold linker or compress debug-info via objcopy I have problems with >> local variables and bacttraces in gdb. > > Can you construct a small example showing the problem? I haven't been able > to reproduce it. > >> Something like this: >> gdb: bt >> .... >> #11 0xb2356a74 in Core::WorkerImpl::WorkerThread (this=Could not find >> the frame base for "Core::WorkerImpl::WorkerThread()". >> ) >> .... >> >> I've spend some time and, looks like, found the problem. It is in >> dwarf2_symbol_mark_computed function (dwarf2read.c). Check >> "DW_UNSND (attr)< dwarf2_per_objfile->loc.size" >> is incorrect if compressed section is used. In this case >> loc.size contains compressed section size, not decompressed one. >> It happens if the section has not been read via dwarf2_read_section yet. >> But dwarf2_locate_sections has been done. > > I am curious how your GDB avoids dwarf2_read_section(). As far as I can > tell, it should always be called (indirectly) by dwarf2_initialize_objfile(). Please see gdb_old_log - session of debug original gdb using real program. "b dwarf2read.c:14367" means breakpoint in the head of dwarf2_symbol_mark_computed. When break is reached (gdb) p dwarf2_per_objfile->loc $1 = {asection = 0x91effc0, buffer = 0x0, size = 56165, was_mmapped = 0, readin = 0} (gdb) p (attr)->u.unsnd $2 = 83336 You can see: 1. dwarf2_per_objfile->loc is not read (readin = 0) 2. (attr)->u.unsnd > dwarf2_per_objfile->loc.size As result the code goes into lowest part of dwarf2_symbol_mark_computed, complaint and set baton->size = 0, baton->data = 0. gdb_debug_log - session of debug patched gdb using dbg_info_test. In it we see that _real_ section read will be done if check "DW_UNSND (attr)< dwarf2_per_objfile->loc.size" is _passed_. #0 dwarf2_read_section (objfile=0x849a2c8, info=0x849eed0) #1 0x081ac376 in fill_in_loclist_baton (cu=0x8491130, baton=0x84a7354, #2 0x081ac5a7 in dwarf2_symbol_mark_computed (attr=0x84a3328, sym=0x84a7328, cu=0x8491130) ... This answers your curiosity - GDB avoids dwarf2_read_section because of incorrect (for compressed sections) "DW_UNSND (attr)< dwarf2_per_objfile->loc.size" check. Unfortunately I was not able to force (attr)->u.unsnd to be greater than compressed size in simple example. But hope above analysis unveils the problem. In real life it leads to situation when if you are unlucky and set breakpoint on function which attr outside of loc.size you'll never see its local variables in current debug session. > >> As result symbols not passed above verification are left with >> size==0 and data==NULL after dwarf2_symbol_mark_computed function. >> >> The patch idea is to introduce uncompressed_size field in >> struct dwarf2_section_info. And fill it in dwarf2_locate_sections. >> Check in dwarf2_symbol_mark_computed function takes into >> account uncompressed_size. The patch is quite large cause I >> try to avoid code duplication with zlib_decompress section. > > > Assuming the patch makes sense (which I am not yet convinced) ... > > +static void > +fill_dwarf2_section_info (struct dwarf2_section_info* info, > + bfd *abfd, asection *sectp) > +{ > + bfd_size_type size; > + > + info->asection = sectp; > + info->size = bfd_get_section_size (sectp); > + info->uncompressed_size = 0; > + if (!is_compressed_section_name (sectp->name)) > + return; > + read_uncompressed_size (abfd, sectp,&info->uncompressed_size); > +} > > Would it make sense to just set uncompressed_size to size if the section > is not compressed? I think that would simplify the patch a bit. > > + fill_dwarf2_section_info(&dwarf2_per_objfile->info, abfd, sectp); > > Missing space before '('. > > Your patch is also missing ChangeLog entry. Thank you for comments. Attaching new version of the patch. Regards Vladimir Simonov --------------060204060804070204020204 Content-Type: application/x-sh; name="b.sh" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="b.sh" Content-length: 468 #!/bin/bash #PREF=../crosstools/opt/crosstool/i686-unknown-linux-gnu/gcc-4.4.3-glibc-2.11.1/bin/i686-unknown-linux-gnu- PREF=/opt/crosstool64/i686-unknown-linux-gnu/gcc-4.4.3-glibc-2.11.1/bin/i686-unknown-linux-gnu- ${PREF}gcc -g -O0 -o dbg_info_test dbg_info_test.c ${PREF}objcopy --compress-debug-sections --only-keep-debug dbg_info_test dbg_info_test.dbg ${PREF}strip --strip-all dbg_info_test ${PREF}objcopy --add-gnu-debuglink=dbg_info_test.dbg dbg_info_test --------------060204060804070204020204 Content-Type: text/plain; name="dbg_info_test.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="dbg_info_test.c" Content-length: 826 #include #define INSTANTIATE_FUNC(callee, name) int name(int argc, char **argv) \ { \ printf("%s: argc=%d, call %s\n", #name, argc, #callee); \ return callee(argc, argv); \ } int func1(int argc, char **argv) { printf("%s: argc=%d\n", "func1", argc); return 0; } INSTANTIATE_FUNC(func1, func2) INSTANTIATE_FUNC(func2, func3) INSTANTIATE_FUNC(func3, func4) INSTANTIATE_FUNC(func4, func5) INSTANTIATE_FUNC(func5, func6) INSTANTIATE_FUNC(func6, func7) INSTANTIATE_FUNC(func7, func8) INSTANTIATE_FUNC(func8, func9) INSTANTIATE_FUNC(func9, func10) INSTANTIATE_FUNC(func10, func11) INSTANTIATE_FUNC(func11, func12) INSTANTIATE_FUNC(func12, func13) INSTANTIATE_FUNC(func13, func14) INSTANTIATE_FUNC(func14, func15) INSTANTIATE_FUNC(func15, func16) INSTANTIATE_FUNC(func16, func17) INSTANTIATE_FUNC(func17, main) --------------060204060804070204020204 Content-Type: text/plain; name="gdb_old_log" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gdb_old_log" Content-length: 5722 IyAuL3Rlc3RfZ2RiL2dkYl9vbGQgLi90ZXN0X2dkYi9nZGJfb2xkCkdOVSBn ZGIgKEdEQikgNy4yLjUwLjIwMTEwMTI0LWN2cwpDb3B5cmlnaHQgKEMpIDIw MTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BM djMrOiBHTlUgR1BMIHZlcnNpb24gMyBvciBsYXRlciA8aHR0cDovL2dudS5v cmcvbGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMgaXMgZnJlZSBzb2Z0d2FyZTog eW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LgpU aGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQg YnkgbGF3LiAgVHlwZSAic2hvdyBjb3B5aW5nIgphbmQgInNob3cgd2FycmFu dHkiIGZvciBkZXRhaWxzLgpUaGlzIEdEQiB3YXMgY29uZmlndXJlZCBhcyAi aTY4Ni11bmtub3duLWxpbnV4LWdudSIuCkZvciBidWcgcmVwb3J0aW5nIGlu c3RydWN0aW9ucywgcGxlYXNlIHNlZToKPGh0dHA6Ly93d3cuZ251Lm9yZy9z b2Z0d2FyZS9nZGIvYnVncy8+Li4uClJlYWRpbmcgc3ltYm9scyBmcm9tIC90 bXAvcm9vdC90ZXN0X2dkYi9nZGJfb2xkLi4uZG9uZS4KKGdkYikgIGIgZHdh cmYycmVhZC5jOjE0MzY3CkJyZWFrcG9pbnQgMSBhdCAweDgxYWMyZjc6IGZp bGUgL2J1aWxkX3Jvb3Q2NF9uZXcvaTY4Ni1nY2MtNC40LjMtZ2xpCmJjLTIu MTEuMS0wLjQzL2J1aWxkL2dkYi13ZWVrbHktQ1ZTLTcuMi41MC4yMDExMDEy NS9nZGIvZHdhcmYycmVhZC5jLCBsaW5lIDE0MzY3Ci4KKGdkYikgc2V0IGFy Z3MgL2Jpbi9wcm9kdWN0CihnZGIpIHIKU3RhcnRpbmcgcHJvZ3JhbTogL3Rt cC9yb290L3Rlc3RfZ2RiL2dkYl9vbGQgL2Jpbi9wcm9kdWN0CkdOVSBnZGIg KEdEQikgNy4yLjUwLjIwMTEwMTI0LWN2cwpDb3B5cmlnaHQgKEMpIDIwMTEg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BMdjMr OiBHTlUgR1BMIHZlcnNpb24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcv bGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91 IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmlidXRlIGl0LgpUaGVy ZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkg bGF3LiAgVHlwZSAic2hvdyBjb3B5aW5nIgphbmQgInNob3cgd2FycmFudHki IGZvciBkZXRhaWxzLgpUaGlzIEdEQiB3YXMgY29uZmlndXJlZCBhcyAiaTY4 Ni11bmtub3duLWxpbnV4LWdudSIuCkZvciBidWcgcmVwb3J0aW5nIGluc3Ry dWN0aW9ucywgcGxlYXNlIHNlZToKPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0 d2FyZS9nZGIvYnVncy8+Li4uClJlYWRpbmcgc3ltYm9scyBmcm9tIC9iaW4v cHJvZHVjdC4uLihubyBkZWJ1Z2dpbmcgc3ltYm9scyBmb3VuZCkuLi5kb25l LgooZ2RiKSByClN0YXJ0aW5nIHByb2dyYW06IC9iaW4vcHJvZHVjdApbVGhy ZWFkIGRlYnVnZ2luZyB1c2luZyBsaWJ0aHJlYWRfZGIgZW5hYmxlZF0KW05l dyBUaHJlYWQgMHhiNzI1ZGI3MCAoTFdQIDMwOTIpXQpbTmV3IFRocmVhZCAw eGI2YTVjYjcwIChMV1AgMzA5MyldCltOZXcgVGhyZWFkIDB4YjVjNWJiNzAg KExXUCAzMDk0KV0KW05ldyBUaHJlYWQgMHhiNTIyZmI3MCAoTFdQIDMwOTUp XQpbTmV3IFRocmVhZCAweGI0OTczYjcwIChMV1AgMzA5NildCltOZXcgVGhy ZWFkIDB4YjQxNzJiNzAgKExXUCAzMDk3KV0KW05ldyBUaHJlYWQgMHhiMTdm ZmI3MCAoTFdQIDMxMTApXQpbTmV3IFRocmVhZCAweGIwZmZlYjcwIChMV1Ag MzExMSldCltOZXcgVGhyZWFkIDB4YjA3ZmRiNzAgKExXUCAzMTE0KV0KW05l dyBUaHJlYWQgMHhhZmZmY2I3MCAoTFdQIDMxMTUpXQpbTmV3IFRocmVhZCAw eGE5ZGI5YjcwIChMV1AgMzExNyldCltUaHJlYWQgMHhhOWRiOWI3MCAoTFdQ IDMxMTcpIGV4aXRlZF0KW05ldyBUaHJlYWQgMHhhOWRiOWI3MCAoTFdQIDMx MjApXQpbTmV3IFRocmVhZCAweGE5NWI4YjcwIChMV1AgMzEyMSldCltOZXcg VGhyZWFkIDB4YThkYWJiNzAgKExXUCAzMTIyKV0KW05ldyBUaHJlYWQgMHhh NzE3N2I3MCAoTFdQIDMxMjMpXQpbTmV3IFRocmVhZCAweGE2OTc2YjcwIChM V1AgMzEyNCldCltOZXcgVGhyZWFkIDB4YTYxNzViNzAgKExXUCAzMTI1KV0K W05ldyBUaHJlYWQgMHhhNTk3NGI3MCAoTFdQIDMxMjYpXQpbTmV3IFRocmVh ZCAweGE1MDU1YjcwIChMV1AgMzEyNyldCltOZXcgVGhyZWFkIDB4YTQ4NTRi NzAgKExXUCAzMTI4KV0KW05ldyBUaHJlYWQgMHhhMzg1MmI3MCAoTFdQIDMx MzApXQpbTmV3IFRocmVhZCAweGE0MDUzYjcwIChMV1AgMzEyOSldCltUaHJl YWQgMHhhNDA1M2I3MCAoTFdQIDMxMjkpIGV4aXRlZF0KW05ldyBUaHJlYWQg MHhhMzA1MWI3MCAoTFdQIDMxMzEpXQpbTmV3IFRocmVhZCAweGEyODUwYjcw IChMV1AgMzEzMildCltOZXcgVGhyZWFkIDB4YTIwNGZiNzAgKExXUCAzMTMz KV0KXkMKUHJvZ3JhbSByZWNlaXZlZCBzaWduYWwgU0lHSU5ULCBJbnRlcnJ1 cHQuCjB4ZmZmZmU0MjQgaW4gX19rZXJuZWxfdnN5c2NhbGwgKCkKKGdkYikg YiBHckdldEV2ZW50CgpCcmVha3BvaW50IDEsIGR3YXJmMl9zeW1ib2xfbWFy a19jb21wdXRlZCAoYXR0cj0weGZlMzM4YWMsIHN5bT0weGZlNDY3NmMsCiAg ICBjdT0weGQyMTRjYTgpCiAgICBhdCAvYnVpbGRfcm9vdDY0X25ldy9pNjg2 LWdjYy00LjQuMy1nbGliYy0yLjExLjEtMC40My9idWlsZC9nZGItCndlZWts eS1DVlMtNy4yLjUwLjIwMTEwMTI1L2dkYi9kd2FyZjJyZWFkLmM6MTQzNjcK MTQzNjcgICAvYnVpbGRfcm9vdDY0X25ldy9pNjg2LWdjYy00LjQuMy1nbGli Yy0yLjExLjEtMC40My9idWlsZC9nZGIKLXdlZWtseS1DVlMtNy4yLjUwLjIw MTEwMTI1L2dkYi9kd2FyZjJyZWFkLmM6IE5vIHN1Y2ggZmlsZSBvciBkaXJl Y3RvcnkuCiAgICAgICAgaW4gL2J1aWxkX3Jvb3Q2NF9uZXcvaTY4Ni1nY2Mt NC40LjMtZ2xpYmMtMi4xMS4xLTAuNDMvYnVpbGQvCmdkYi13ZWVrbHktQ1ZT LTcuMi41MC4yMDExMDEyNS9nZGIvZHdhcmYycmVhZC5jCihnZGIpIHAgZHdh cmYyX3Blcl9vYmpmaWxlLT5sb2MKJDEgPSB7YXNlY3Rpb24gPSAweDkxZWZm YzAsIGJ1ZmZlciA9IDB4MCwgc2l6ZSA9IDU2MTY1LCB3YXNfbW1hcHBlZCA9 IDAsCiAgcmVhZGluID0gMH0KKGdkYikgcCAoYXR0ciktPnUudW5zbmQKJDIg PSA4MzMzNgooZ2RiKSBuCjE0MzYzICAgaW4gL2J1aWxkX3Jvb3Q2NF9uZXcv aTY4Ni1nY2MtNC40LjMtZ2xpYmMtMi4xMS4xLTAuNDMvYnVpbGQvCmdkYi13 ZWVrbHktQ1ZTLTcuMi41MC4yMDExMDEyNS9nZGIvZHdhcmYycmVhZC5jCihn ZGIpCjE0MzY3ICAgaW4gL2J1aWxkX3Jvb3Q2NF9uZXcvaTY4Ni1nY2MtNC40 LjMtZ2xpYmMtMi4xMS4xLTAuNDMvYnVpbGQvCmdkYi13ZWVrbHktQ1ZTLTcu Mi41MC4yMDExMDEyNS9nZGIvZHdhcmYycmVhZC5jCihnZGIpCjE0MzYzICAg aW4gL2J1aWxkX3Jvb3Q2NF9uZXcvaTY4Ni1nY2MtNC40LjMtZ2xpYmMtMi4x MS4xLTAuNDMvYnVpbGQvCmdkYi13ZWVrbHktQ1ZTLTcuMi41MC4yMDExMDEy NS9nZGIvZHdhcmYycmVhZC5jCihnZGIpCjE0Mzg4ICAgaW4gL2J1aWxkX3Jv b3Q2NF9uZXcvaTY4Ni1nY2MtNC40LjMtZ2xpYmMtMi4xMS4xLTAuNDMvYnVp bGQvCmdkYi13ZWVrbHktQ1ZTLTcuMi41MC4yMDExMDEyNS9nZGIvZHdhcmYy cmVhZC5jCihnZGIpIGRpc2EgMQooZ2RiKSBjCkNvbnRpbnVpbmcuCkJyZWFr cG9pbnQgMSBhdCAweGI3ODNhZTMzOiBmaWxlIC93L2N1cnJlbnQvZ3JhcGhh cGkvZXZlbnRfbC5jcHAsIGxpbmUgNTQuCihnZGIpIHNldCBjb21wbGFpbnRz IDEwCihnZGIpIGMKQ29udGludWluZy4KW05ldyBUaHJlYWQgMHhhMTg0ZWI3 MCAoTFdQIDMxNDApXQpbTmV3IFRocmVhZCAweGEwODRjYjcwIChMV1AgMzE0 MildCltOZXcgVGhyZWFkIDB4YTAwNGJiNzAgKExXUCAzMTQzKV0KW05ldyBU aHJlYWQgMHg5Zjg0YWI3MCAoTFdQIDMxNDQpXQpbTmV3IFRocmVhZCAweDlm MDQ5YjcwIChMV1AgMzE0NSldCltOZXcgVGhyZWFkIDB4OWU4NDhiNzAgKExX UCAzMTQ2KV0KCkJyZWFrcG9pbnQgMSwgR3JHZXRFdmVudCAoZXZlbnQ9Q291 bGQgbm90IGZpbmQgdGhlIGZyYW1lIGJhc2UgZm9yICJHckdldEV2ZW50KEdy CkV2ZW50JiwgdGltZXZhbCopIi4KKSBhdCAvdy9jdXJyZW50L2dyYXBoYXBp L2V2ZW50X2wuY3BwOjU0CjU0ICAgICAgICBHcktleWJvYXJkKiBEZWZhdWx0 ID0gR3JLZXlib2FyZDo6R2V0RGVmYXVsdCgpOwooZ2RiKQ== --------------060204060804070204020204 Content-Type: text/plain; name="gdb_debug_log" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="gdb_debug_log" Content-length: 7734 # ./gdb ./gdb GNU gdb (GDB) 7.2.50.20110124-cvs Copyright (C) 2011 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 "i686-unknown-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /tmp/root/test_gdb/gdb...done. (gdb) b dwarf2read.c:1435 Breakpoint 1 at 0x8193fd3: file dwarf2read.c, line 1435. (gdb) b check_attr_location Breakpoint 2 at 0x81ac40a: file dwarf2read.c, line 14391 (gdb) set args ./dbg_info_test (gdb) r Starting program: /tmp/root/test_gdb/gdb ./dbg_info_test GNU gdb (GDB) 7.2.50.20110124-cvs Copyright (C) 2011 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 "i686-unknown-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /tmp/root/test_gdb/dbg_info_test...Reading symbols from /tmp/root/test_gdb/dbg_info_test.dbg... Breakpoint 1, dwarf2_locate_sections (abfd=0x8479b60, sectp=0x8498960, ignore_ptr=0x0) at dwarf2read.c:1435 (gdb) p sectp->name $1 = 0x84907ab ".zdebug_loc" (gdb) n 1471 in dwarf2read.c (gdb) p dwarf2_per_objfile->loc $2 = {asection = 0x8498960, buffer = 0x0, size = 245, was_mmapped = 0, readin = 0, uncompressed_size = 792} (gdb) c Continuing. done. done. (gdb) b func1 Breakpoint 2, check_attr_location (info=0x849eed0, attr=0x84a3328) at dwarf2read.c:14391 14391 in dwarf2read.c (gdb) p *info $3 = {asection = 0x8498960, buffer = 0x0, size = 245, was_mmapped = 0, readin = 0, uncompressed_size = 792} (gdb) b dwarf2_read_section Breakpoint 3 at dwarf2read.c, line 1554. (gdb) disa 2 (gdb) c Continuing. Breakpoint 3, dwarf2_read_section (objfile=0x849a2c8, info=0x849eed0) at dwarf2read.c:1554 1554 dwarf2read.c (gdb) p *info $4 = {asection = 0x8498960, buffer = 0x0, size = 245, was_mmapped = 0, readin = 0, uncompressed_size = 792} (gdb) bt #0 dwarf2_read_section (objfile=0x849a2c8, info=0x849eed0) at dwarf2read.c:1554 #1 0x081ac376 in fill_in_loclist_baton (cu=0x8491130, baton=0x84a7354, attr=0x84a3328) at dwarf2read.c:14376 #2 0x081ac5a7 in dwarf2_symbol_mark_computed (attr=0x84a3328, sym=0x84a7328, cu=0x8491130) at dwarf2read.c:14411 #3 0x0819bfde in read_func_scope (die=0x84a32b0, cu=0x8491130) at dwarf2read.c:5652 #4 0x0819a3ce in process_die (die=0x84a32b0, cu=0x8491130) at dwarf2read.c:4669 #5 0x0819b38f in read_file_scope (die=0x84a2f50, cu=0x8491130) at dwarf2read.c:5303 #6 0x0819a3a0 in process_die (die=0x84a2f50, cu=0x8491130) at dwarf2read.c:4662 #7 0x0819a26d in process_full_comp_unit (per_cu=0x84a11a4) at dwarf2read.c:4616 #8 0x08199be9 in process_queue (objfile=0x849a2c8) at dwarf2read.c:4381 #9 0x081949b2 in dw2_do_instantiate_symtab (objfile=0x849a2c8, per_cu=0x84a11a4) at dwarf2read.c:1777 #10 0x08199dbe in psymtab_to_symtab_1 (pst=0x84a1330) at dwarf2read.c:4457 #11 0x08199afc in dwarf2_psymtab_to_symtab (pst=0x84a1330) at dwarf2read.c:4338 #12 0x0812eca9 in psymtab_to_symtab (pst=0x84a1330) at psymtab.c:623 #13 0x0812e784 in lookup_symbol_aux_psymtabs (objfile=0x849a2c8, block_index=0, name=0xbffff480 "func1", domain=VAR_DOMAIN) at psymtab.c:429 #14 0x08128dac in lookup_symbol_aux_quick (objfile=0x849a2c8, kind=0, name=0xbffff480 "func1", domain=VAR_DOMAIN) at symtab.c:1383 #15 0x08128fb8 in lookup_symbol_global (name=0xbffff480 "func1", block=0x0, domain=VAR_DOMAIN) at symtab.c:1504 #16 0x08128ed5 in basic_lookup_symbol_nonlocal (name=0xbffff480 "func1", block=0x0, domain=VAR_DOMAIN) at symtab.c:1461 #17 0x0812896b in lookup_symbol_aux (name=0xbffff480 "func1", block=0x0, domain=VAR_DOMAIN, language=language_c, is_a_field_of_this=0x0) at symtab.c:1170 #18 0x08128789 in lookup_symbol_in_language (name=0xbffff480 "func1", block=0x0, domain=VAR_DOMAIN, lang=language_c, is_a_field_of_this=0x0) at symtab.c:1077 #19 0x081287d1 in lookup_symbol (name=0xbffff480 "func1", block=0x0, domain=VAR_DOMAIN, is_a_field_of_this=0x0) at symtab.c:1091 #20 0x081de795 in find_imps (symtab=0x0, block=0x0, method=0x8434192 "func1", syms=0x0, nsym=0xbffff550, ndebug=0xbffff54c) at objc-lang.c:1339 #21 0x0813a80d in decode_objc (argptr=0xbffff7d4, funfirstline=1, file_symtab=0x0, canonical=0xbffff748, saved_arg=0x8434192 "func1") at linespec.c:1146 #22 0x08139f2c in decode_line_1 (argptr=0xbffff7d4, funfirstline=1, default_symtab=0x0, default_line=0, canonical=0xbffff748, not_found_ptr=0xbffff734) at linespec.c:778 #23 0x080f621f in parse_breakpoint_sals (address=0xbffff7d4, sals=0xbffff770, addr_string=0xbffff748, not_found_ptr=0xbffff734) at breakpoint.c:7493 #24 0x080f6408 in do_captured_parse_breakpoint (ui=0x8471b10, data=0xbffff738) at breakpoint.c:7563 #25 0x081574af in catch_exception (uiout=0x8471b10, func=0x80f63d0 , func_args=0xbffff738, mask=6) at exceptions.c:471 #26 0x080f6a15 in create_breakpoint (gdbarch=0x846ae18, arg=0x8434192 "func1", cond_string=0x0, thread=0, parse_condition_and_thread=1, tempflag=0, type_wanted=bp_breakpoint, ignore_count=0, pending_break_support=AUTO_BOOLEAN_AUTO, ops=0x0, from_tty=1, enabled=1, internal=0) at breakpoint.c:7746 #27 0x080f70d9 in break_command_1 (arg=0x8434192 "func1", flag=0, from_tty=1) at breakpoint.c:7977 #28 0x080f7257 in break_command (arg=0x8434192 "func1", from_tty=1) at breakpoint.c:8050 #29 0x080c3b67 in do_cfunc (c=0x844a318, args=0x8434192 "func1", from_tty=1) at cli-decode.c:67 #30 0x080c6215 in cmd_func (cmd=0x844a318, args=0x8434192 "func1", from_tty=1) at cli-decode.c:1777 #31 0x08055e6d in execute_command (p=0x8434196 "1", from_tty=1) at top.c:428 #32 0x0815e241 in command_handler (command=0x8434190 "b func1") at event-top.c:499 #33 0x0815e7a5 in command_line_handler (rl=0x8478f40 "\330\371I\b\350\371I\b") at event-top.c:704 #34 0x08259fc2 in rl_callback_read_char () #35 0x0815da03 in rl_callback_read_char_wrapper (client_data=0x0) at event-top.c:177 #36 0x0815e139 in stdin_event_handler (error=0, client_data=0x0) at event-top.c:434 #37 0x0815cecc in handle_file_event (data=...) at event-loop.c:831 #38 0x0815c710 in process_event () at event-loop.c:402 #39 0x0815c7d4 in gdb_do_one_event (data=0x0) at event-loop.c:467 #40 0x0815766d in catch_errors (func=0x815c71e , func_args=0x0, errstring=0x832e051 "", mask=6) at exceptions.c:521 #41 0x080d9950 in tui_command_loop (data=0x0) at tui-interp.c:172 #42 0x08157d38 in current_interp_command_loop () at interps.c:291 #43 0x0804d0ee in captured_command_loop (data=0x0) at main.c:228 #44 0x0815766d in catch_errors (func=0x804d0e3 , func_args=0x0, errstring=0x830e1ff "", mask=6) at exceptions.c:521 #45 0x0804dfad in captured_main (data=0xbffffca0) at main.c:933 #46 0x0815766d in catch_errors (func=0x804d124 , func_args=0xbffffca0, errstring=0x830e1ff "", mask=6) at exceptions.c:521 #47 0x0804dfe3 in gdb_main (args=0xbffffca0) at main.c:942 #48 0x0804ce73 in main (argc=2, argv=0xbffffd64) at gdb.c:35 (gdb) --------------060204060804070204020204 Content-Type: text/plain; name="gdb-7.2-compressed-section-4.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="gdb-7.2-compressed-section-4.patch" Content-length: 10092 diff -ruN gdb-weekly-CVS-7.2.50.20110125.orig/gdb/ChangeLog gdb-weekly-CVS-7.2.50.20110125/gdb/ChangeLog --- gdb-weekly-CVS-7.2.50.20110125.orig/gdb/ChangeLog 2011-01-25 00:34:18.000000000 +0300 +++ gdb-weekly-CVS-7.2.50.20110125/gdb/ChangeLog 2011-02-03 19:26:39.231295100 +0300 @@ -1,3 +1,19 @@ +2011-02-03 Vladimir Simonov + + Compressed debug info sections handling improved. + + * dwarf2read.c (struct dwarf2_section_info) (uncompressed_size): New + field. + (is_compressed_section_name, parse_zlib_section_header) + (parse_zlib_section_header, read_uncompressed_size) + (fill_dwarf2_section_info): New function. + (dwarf2_locate_sections): Use fill_dwarf2_section_info instead of + inline assignment. + (zlib_decompress_section): Prototype changed. Cleanup with reuse + parse_zlib_section_header. + (dwarf2_read_section): Cleanup with reuse read_uncompressed_size. + (dwarf2_symbol_mark_computed): Use uncompressed_size instead of size. + 2011-01-24 Kevin Buettner * configure.tgt (mips*-*-elf): New; just like mips*-*-*, but diff -ruN gdb-weekly-CVS-7.2.50.20110125.orig/gdb/dwarf2read.c gdb-weekly-CVS-7.2.50.20110125/gdb/dwarf2read.c --- gdb-weekly-CVS-7.2.50.20110125.orig/gdb/dwarf2read.c 2011-01-12 19:16:20.000000000 +0300 +++ gdb-weekly-CVS-7.2.50.20110125/gdb/dwarf2read.c 2011-02-03 18:29:50.999859400 +0300 @@ -136,6 +136,7 @@ int was_mmapped; /* True if we have tried to read this section. */ int readin; + bfd_size_type uncompressed_size; }; /* All offsets in the index are of this type. It must be @@ -1357,6 +1358,59 @@ && strcmp (section_name + 2, name) == 0))); } +static int +is_compressed_section_name (const char *section_name) +{ + return (section_name[0] == '.' && section_name[1] == 'z'); +} + +static int +parse_zlib_section_header (bfd_byte *compressed_buffer, bfd_size_type *size) +{ + bfd_size_type uncompressed_size; + + /* Read the zlib header. In this case, it should be "ZLIB" followed + by the uncompressed section size, 8 bytes in big-endian order. */ + if (strncmp (compressed_buffer, "ZLIB", 4) != 0) + return FALSE; + uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8; + uncompressed_size += compressed_buffer[11]; + *size = uncompressed_size; + return TRUE; +} + +static int +read_uncompressed_size (bfd *abfd, asection *sec, bfd_size_type *size) +{ + bfd_byte compressed_buffer [12]; + bfd_size_type uncompressed_size; + + if (sec->size < 12 || !bfd_get_section_contents (abfd, sec, + compressed_buffer, 0, 12)) + return FALSE; + return parse_zlib_section_header (compressed_buffer, size); +} + +static void +fill_dwarf2_section_info (struct dwarf2_section_info* info, + bfd *abfd, asection *sectp) +{ + bfd_size_type size; + + info->asection = sectp; + info->size = bfd_get_section_size (sectp); + info->uncompressed_size = info->size; + if (!is_compressed_section_name (sectp->name)) + return; + read_uncompressed_size (abfd, sectp, &info->uncompressed_size); +} + /* This function is mapped across the sections and remembers the offset and size of each of the debugging sections we are interested in. */ @@ -1366,38 +1420,31 @@ { if (section_is_p (sectp->name, INFO_SECTION)) { - dwarf2_per_objfile->info.asection = sectp; - dwarf2_per_objfile->info.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->info, abfd, sectp); } else if (section_is_p (sectp->name, ABBREV_SECTION)) { - dwarf2_per_objfile->abbrev.asection = sectp; - dwarf2_per_objfile->abbrev.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->abbrev, abfd, sectp); } else if (section_is_p (sectp->name, LINE_SECTION)) { - dwarf2_per_objfile->line.asection = sectp; - dwarf2_per_objfile->line.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->line, abfd, sectp); } else if (section_is_p (sectp->name, LOC_SECTION)) { - dwarf2_per_objfile->loc.asection = sectp; - dwarf2_per_objfile->loc.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->loc, abfd, sectp); } else if (section_is_p (sectp->name, MACINFO_SECTION)) { - dwarf2_per_objfile->macinfo.asection = sectp; - dwarf2_per_objfile->macinfo.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->macinfo, abfd, sectp); } else if (section_is_p (sectp->name, STR_SECTION)) { - dwarf2_per_objfile->str.asection = sectp; - dwarf2_per_objfile->str.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->str, abfd, sectp); } else if (section_is_p (sectp->name, FRAME_SECTION)) { - dwarf2_per_objfile->frame.asection = sectp; - dwarf2_per_objfile->frame.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->frame, abfd, sectp); } else if (section_is_p (sectp->name, EH_FRAME_SECTION)) { @@ -1405,24 +1452,20 @@ if (aflag & SEC_HAS_CONTENTS) { - dwarf2_per_objfile->eh_frame.asection = sectp; - dwarf2_per_objfile->eh_frame.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->eh_frame, abfd, sectp); } } else if (section_is_p (sectp->name, RANGES_SECTION)) { - dwarf2_per_objfile->ranges.asection = sectp; - dwarf2_per_objfile->ranges.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->ranges, abfd, sectp); } else if (section_is_p (sectp->name, TYPES_SECTION)) { - dwarf2_per_objfile->types.asection = sectp; - dwarf2_per_objfile->types.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->types, abfd, sectp); } else if (section_is_p (sectp->name, GDB_INDEX_SECTION)) { - dwarf2_per_objfile->gdb_index.asection = sectp; - dwarf2_per_objfile->gdb_index.size = bfd_get_section_size (sectp); + fill_dwarf2_section_info (&dwarf2_per_objfile->gdb_index, abfd, sectp); } if ((bfd_get_section_flags (abfd, sectp) & SEC_LOAD) @@ -1435,7 +1478,7 @@ static void zlib_decompress_section (struct objfile *objfile, asection *sectp, - gdb_byte **outbuf, bfd_size_type *outsize) + gdb_byte **outbuf) { bfd *abfd = objfile->obfd; #ifndef HAVE_ZLIB_H @@ -1452,26 +1495,19 @@ int rc; int header_size = 12; + if (compressed_size < header_size) + error (_("Dwarf Error: Too small DWARF ZLIB header from '%s'"), + bfd_get_filename (abfd)); + if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0 || bfd_bread (compressed_buffer, compressed_size, abfd) != compressed_size) error (_("Dwarf Error: Can't read DWARF data from '%s'"), bfd_get_filename (abfd)); - /* Read the zlib header. In this case, it should be "ZLIB" followed - by the uncompressed section size, 8 bytes in big-endian order. */ - if (compressed_size < header_size - || strncmp (compressed_buffer, "ZLIB", 4) != 0) + if (!parse_zlib_section_header (compressed_buffer, &uncompressed_size)) error (_("Dwarf Error: Corrupt DWARF ZLIB header from '%s'"), bfd_get_filename (abfd)); - uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8; - uncompressed_size += compressed_buffer[11]; /* It is possible the section consists of several compressed buffers concatenated together, so we uncompress in a loop. */ @@ -1505,7 +1541,6 @@ do_cleanups (cleanup); *outbuf = uncompressed_buffer; - *outsize = uncompressed_size; #endif } @@ -1519,7 +1554,6 @@ bfd *abfd = objfile->obfd; asection *sectp = info->asection; gdb_byte *buf, *retbuf; - unsigned char header[4]; if (info->readin) return; @@ -1530,18 +1564,12 @@ if (info->asection == NULL || info->size == 0) return; - /* Check if the file has a 4-byte header indicating compression. */ - if (info->size > sizeof (header) - && bfd_seek (abfd, sectp->filepos, SEEK_SET) == 0 - && bfd_bread (header, sizeof (header), abfd) == sizeof (header)) + /* Check if the file has a 12-byte header indicating compression. */ + if (read_uncompressed_size (abfd, sectp, &info->uncompressed_size)) { - /* Upon decompression, update the buffer and its size. */ - if (strncmp (header, "ZLIB", sizeof (header)) == 0) - { - zlib_decompress_section (objfile, sectp, &info->buffer, - &info->size); - return; - } + zlib_decompress_section (objfile, sectp, &info->buffer); + info->size = info->uncompressed_size; + return; } #ifdef HAVE_MMAP @@ -14364,7 +14392,7 @@ /* ".debug_loc" may not exist at all, or the offset may be outside the section. If so, fall through to the complaint in the other branch. */ - && DW_UNSND (attr) < dwarf2_per_objfile->loc.size) + && DW_UNSND (attr) < dwarf2_per_objfile->loc.uncompressed_size) { struct dwarf2_loclist_baton *baton; --------------060204060804070204020204--