[PATCH] Fix SIGSEGV in cp_to_object_index on arm-sflt fastdebug builds
David Holmes
david.holmes at oracle.com
Mon Dec 10 21:54:04 UTC 2018
Hi Jakub,
This needs to be checked and fixed in mainline jdk/jdk first, and then a
backport request made for 11u.
Thanks,
David
On 11/12/2018 3:10 am, Jakub Vaněk wrote:
> Hi all,
>
> I have recently tried to compile OpenJDK 11 with debugging symbols
> enabled. The compilation succeeded, but the resulting Arm binary was
> crashing everywhere - on QEMU-user, QEMU-system and on the real
> hardware too. Any action triggered the crash - even java --version or
> java --help. This is what I have found:
>
> * Something calls InterpreterRuntime::resolve_ldc.
> * When ASSERT is enabled, this function calls
> ConstantPool::cp_to_object_index on costants() of the calling bytecode
> method.
> * This function calls this->reference_map() to get access to some
> cache.
>
> The problematic thing is that cp_to_object_index doesn't check if the
> returned pointer is not NULL. For some reason, the calling (bytecode?)
> method has constants()->_cache->_reference_map set to NULL. This causes
> a segmentation fault when the function tries to find the specified
> cp_index in that map.
>
> To fix this problem, I added a null check to cp_to_object_index. If the
> returned map is null, _no_index_sentinel is returned. However I'm only
> guessing that this is the right thing to do. I'm basing my guess on
> what is returned when the index wasn't found in an existing map.
>
> I don't know the reason why the reference map is null, if it is
> expected or if it is also a bug. This patch however fixes the issue and
> makes it possible again to debug HotSpot using gdb on arm-sflt.
>
> I have not tested if the same issue is present in JDK12 as well (i.e.
> if _reference_map is still being set to NULL), but the null check is
> still missing.
>
> Thanks,
>
> Jakub
>
> # HG changeset patch
> # User Jakub Vaněk <linuxtardis at gmail.com>
> # Date 1544311444 -3600
> # Sun Dec 09 00:24:04 2018 +0100
> # Node ID 87425963180285bfee8170afa07fb3989abeb1a1
> # Parent f94276ccc9fc9d6c5b00cf9bafa77d708e9c2e6b
> Fix crash on arm-sflt debug builds
>
> diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp
> --- a/src/hotspot/share/oops/constantPool.cpp
> +++ b/src/hotspot/share/oops/constantPool.cpp
> @@ -406,8 +406,12 @@
> }
>
> int ConstantPool::cp_to_object_index(int cp_index) {
> + Array<u2> *map = reference_map();
> + if (map == NULL)
> + return _no_index_sentinel;
> +
> // this is harder don't do this so much.
> - int i = reference_map()->find(cp_index);
> + int i = map->find(cp_index);
> // We might not find the index for jsr292 call.
> return (i < 0) ? _no_index_sentinel : i;
> }
>
More information about the hotspot-runtime-dev
mailing list