[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-hotspot-dev
Subject: Re: RFR: 8242181: [Linux] Show source information when printing native stack traces in hs_err files
From: Christian Hagedorn <chagedorn () openjdk ! java ! net>
Date: 2022-02-28 16:22:31
Message-ID: 5YeksetlUoja6cRgWtaorVsXCDLEQRw8s7B9W5UJOUE=.22f23a33-8877-4c3a-9b6d-f648fb1c4fc3 () github ! com
[Download RAW message or body]
On Tue, 22 Feb 2022 09:59:36 GMT, Thomas Schatzl <tschatzl@openjdk.org> wrote:
> > Christian Hagedorn has updated the pull request incrementally with one additional \
> > commit since the last revision:
> > Make dwarf tag NOT_PRODUCT
>
> src/hotspot/share/utilities/elfFile.cpp line 319:
>
> > 317: }
> > 318: log_develop_info(dwarf)("No separate .debuginfo file for library %s. It \
> > already contains the required DWARF sections.", _filepath);
> > 319: _dwarf_file = new (std::nothrow) DwarfFile(_filepath);
>
> Would it be useful to explicitly bail out on a `nullptr` value here to avoid \
> crashes below?
Yes, I think that's the right way. I changed other allocations as well to bail out.
> src/hotspot/share/utilities/elfFile.cpp line 357:
>
> > 355: }
> > 356:
> > 357: strcpy(debug_pathname, _filepath);
>
> I'm always a bit uneasy using "raw" `strcpy` instead of `strncpy` and friends. The \
> code seems to be correct though.
Yes that's true. I updated usages while introducing a new helper class \
`DwarfFilePath`.
> src/hotspot/share/utilities/elfFile.cpp line 784:
>
> > 782: }
> > 783:
> > 784: if (!_reader.read_byte(&_header._address_size) || \
> > NOT_LP64(_header._address_size != 4) LP64_ONLY( _header._address_size != 8)) {
>
> Since this is the second time for the clause `|| NOT_LP64(_header._address_size != \
> 4) LP64_ONLY( _header._address_size != 8)` maybe it is useful to make a constant \
> out of the accepted address size somewhere instead of repeating this over and over. \
> It's value could even be something like `sizeof(intptr_t)` or so.
I agree, I introduced a new constant `DwarfFile::ADDRESS_SIZE`.
> src/hotspot/share/utilities/elfFile.cpp line 1070:
>
> > 1068: // reason, GCC is currently using version 3 as specified in the DWARF 3 \
> > spec for the line number program even though GCC should
> > 1069: // be using version 4 for DWARF 4 as it emits DWARF 4 by default.
> > 1070: return false;
>
> According to the specification (pg112):
>
> > `version (uhalf)`
> > A version number (see Appendix F). This number is specific to the line number \
> > information and is independent of the DWARF version number.
>
> So this is just fine - actually things may break if the code accepted version 4 \
> here assuming that there are breaking differences. On the other hand Appendix F \
> mentions that DWARF4 contains .debug_line information in version 4.
The `LineNumberProgram` class should be able to handle both version 3 and 4. There \
are some differences (see `_dwarf_version` checks). But I found that GCC even mixes \
version 3 and 4: https://github.com/chhagedorn/jdk/blob/820f0da65ab06b28ac75eec96d35269addda0246/src/hotspot/share/utilities/elfFile.cpp#L1302-L1308
> src/hotspot/share/utilities/elfFile.hpp line 211:
>
> > 209:
> > 210: // Load the DWARF file (.debuginfo) that belongs to this file.
> > 211: bool load_dwarf_file();
>
> It would be nice to summarize from which places this methods tries to load the \
> debug info to prevent the need for digging for it in the method implementation.
Good suggestion. I added a summary and refactored the different loading attempts into \
separate methods together with a new class `DwarfFilePath` which makes it easier to \
prepare the different paths.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7126
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic