Review request: 7003789 PTRACE_GETREGS problems with SA on Linux.
David Holmes
David.Holmes at oracle.com
Thu Dec 2 19:23:25 PST 2010
Kevin Walls said the following on 12/03/10 06:03:
> Thanks both for pointing out that I didn't notice I was smashing the
> 32-bit case. 8-)
>
> I can now build and test 32 and 64-bit OK with...
>
> #ifdef _LP64
> #ifdef PTRACE_GETREGS64
> #define PTRACE_GETREGS_REQ PTRACE_GETREGS64
> #elif defined(PTRACE_GETREGS)
> #define PTRACE_GETREGS_REQ PTRACE_GETREGS
> #elif defined(PT_GETREGS)
> #define PTRACE_GETREGS_REQ PT_GETREGS
> #endif
> #else
> #if defined(PTRACE_GETREGS) || defined(PT_GETREGS)
> #define PTRACE_GETREGS_REQ PTRACE_GETREGS
> #endif
> #endif /* _LP64 */
>
> My 64-bit system is Fedora and really needs to use PT_REGS as that's the
> only definition. My 32-bit system is a different RedHat and has
> PTRACE_GETREGS defined so the 32-bit build does work. Am tempted to
> change the 32-bit side of the ifdef to also use PT_GETREGS as a last
> resort...
I'd be tempted to do that too. This seems so inconsistent I wouldn't
trust what you might find on any particular linux.
If we knew that we'd never find PTRACE_GETREGS64 on a 32-bit system we
could make it somewhat simpler.
David
> Thanks
> Kevin
>
>
> On 02/12/2010 02:23, Yasumasa Suenaga wrote:
>> Thank you for the reply.
>>
>> I've read your patch on a webrev.
>> Your patch will work on AMD64 architecture.
>> However, this patch will not work on x86 (32bit) architecture.
>> Preprocessor in GCC for i386 does not define "_LP64" .
>>
>> -----------------
>> [root at RHEL4-4 test]# cat /etc/redhat-release
>> Red Hat Enterprise Linux ES release 4 (Nahant Update 4)
>> [root at RHEL4-4 test]# uname -a
>> Linux RHEL4-4 2.6.9-42.EL #1 Wed Jul 12 23:16:43 EDT 2006 i686 i686 i386 GNU/Linux
>> [root at RHEL4-4 test]# rpm -q glibc
>> glibc-2.3.4-2.25
>> [root at RHEL4-4 test]# rpm -q gcc
>> gcc-3.4.6-3
>> [root at RHEL4-4 test]# touch test.h
>> [root at RHEL4-4 test]# cpp -dM test.h | grep _LP64
>> [root at RHEL4-4 test]#
>> -----------------
>>
>>
>> So, you need to modify the patch as follows:
>>
>> -----------------
>> [root at Fedora13 OpenJDK7]# diff -u b118/openjdk/hotspot/agent/src/os/linux/ps_proc.c trunk/
>> openjdk/hotspot/agent/src/os/linux/ps_proc.c
>> --- a/agent/src/os/linux/ps_proc.c 2010-11-12 05:43:12.000000000 +0900
>> +++ b/agent/src/os/linux/ps_proc.c 2010-12-02 10:45:09.117050388 +0900
>> @@ -124,6 +124,8 @@
>> #ifdef _LP64
>> #ifdef PTRACE_GETREGS64
>> #define PTRACE_GETREGS_REQ PTRACE_GETREGS64
>> +#elif defined(PTRACE_GETREGS)
>> +#define PTRACE_GETREGS_REQ PTRACE_GETREGS
>> #endif
>> #else
>> #if defined(PTRACE_GETREGS) || defined(PT_GETREGS)
>> -----------------
>>
>>
>> Thanks.
>>
>>
>> (2010/12/02 1:41), Kevin Walls wrote:
>>> Sorry, there was actually a typo in that diff, although it was good
>>> enough to be a solution on my system.
>>>
>>> A webrev also:
>>>
>>> http://cr.openjdk.java.net/~kevinw/7003789/webrev.00/
>>>
>>> Thanks
>>> Kevin
>>>
>>>
>>> On 01/12/2010 16:01, Kevin Walls wrote:
>>>> Hi --
>>>>
>>>> I've just been hitting that as well.... I think it needs to be dealt
>>>> with as a separate bug as there may be a few which are similar - and
>>>> 6359295 is marked fixed in 5.0 long ago...
>>>>
>>>> I just found your message after I'd done some investigating... The patch
>>>> I was working with is to split one of the existing "if defined"
>>>> statements, as currently the bug is: if we have PT_GETREGS defined, we
>>>> use PTRACE_GETREGS to define PTRACE_GETREGS_REQ... We soon realise that
>>>> may NOT be defined and give the "unsupported" message. So I can log and
>>>> bug and get this done if it sounds good:
>>>>
>>>> [kevin at oldbox make]$ hg diff ../src/os/linux/ps_proc.c
>>>> diff --git a/agent/src/os/linux/ps_proc.c b/agent/src/os/linux/ps_proc.c
>>>> --- a/agent/src/os/linux/ps_proc.c
>>>> +++ b/agent/src/os/linux/ps_proc.c
>>>> @@ -124,9 +124,9 @@
>>>> #ifdef _LP64
>>>> #ifdef PTRACE_GETREGS64
>>>> #define PTRACE_GETREGS_REQ PTRACE_GETREGS64
>>>> -#endif
>>>> -#else
>>>> -#if defined(PTRACE_GETREGS) || defined(PT_GETREGS)
>>>> +#elif defined(PTRACE_GETREGS)
>>>> +#define PTRACE_GETREGS_REQ PTRACE_GETREGS
>>>> +#elif defined (PT_GETREGS)
>>>> #define PTRACE_GETREGS_REQ PTRACE_GETREGS
>>>> #endif
>>>> #endif /* _LP64 */
>>>>
>>>>
>>>>
>>>> Regards
>>>> Kevin
>>>>
>>>>
>>>>
>>>> On 15/11/2010 06:46, Yasumasa Suenaga wrote:
>>>>> Hi.
>>>>>
>>>>> I and co-worker use jstack for various trouble shooting.
>>>>>
>>>>> We mainly use Java on Linux with AMD64 architecture.
>>>>> However, jstack -F option doesn't work our platform.
>>>>>
>>>>> I ran jstack -F with LIBSAPROC_DEBUG=1 (environment variable),
>>>>> I got following messages:
>>>>>
>>>>>
>>>>> /***************/
>>>>> Thread 31933: (state = BLOCKED)
>>>>> libsaproc DEBUG: ptrace(PTRACE_GETREGS, ...) not supported
>>>>> Error occurred during stack walking:
>>>>> sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
>>>>> /***************/
>>>>>
>>>>>
>>>>> In order to fix this problem, I made a patch for preprocessor
>>>>> macro in "agent/src/os/linux/ps_proc.c" .
>>>>> The patch that attached this mail works well on Fedora 13 x86_64.
>>>>>
>>>>> Please merge this patch if you don't fix this problem yet.
>>>>>
>>>>>
>>>>> Best regards.
>>>>>
>>>>>
>
More information about the serviceability-dev
mailing list