RFR(XS): 8056930: Output host info under some condition for core dump

Yumin Qi yumin.qi at oracle.com
Tue Sep 9 04:52:36 UTC 2014


David,

I have done some test with following c++ code:

#include "windows.h"
#include "tchar.h"
void StackOverflow(int depth)
{
     char blockdata[10000];
     printf("Overflow: %d\n", depth);
     StackOverflow(depth+1);
}

int _tmain(int argc, _TCHAR* argv[])
{
     for (;;)
     {
         __try
         {
             StackOverflow(0);
         }
         __except(EXCEPTION_EXECUTE_HANDLER)
         {
             LPBYTE lpPage;
             static SYSTEM_INFO si;
             static MEMORY_BASIC_INFORMATION mi;
             static DWORD dwOldProtect;

             _TCHAR buffer[1024];
             DWORD size = sizeof(buffer);
             if (GetComputerNameEx(ComputerNameDnsHostname, buffer, 
&size)) {
                 printf("Computer Name: %s\n", buffer);
             } else {
                 printf("Computer Name: N/A\n");
             }
             // Get page size of system
             GetSystemInfo(&si);

             // Find SP address
             _asm mov lpPage, esp;

             // Get allocation base of stack
             VirtualQuery(lpPage, &mi, sizeof(mi));

             // Go to page beyond current page
             lpPage = (LPBYTE)(mi.BaseAddress)-si.dwPageSize;

             // Free portion of stack just abandoned
             if (!VirtualFree(mi.AllocationBase,
                             (LPBYTE)lpPage - (LPBYTE)mi.AllocationBase,
                              MEM_DECOMMIT))
                 {
                 // If we get here, exit
                 exit(1);
             }

                 // Reintroduce the guard page
                 if (!VirtualProtect(lpPage, si.dwPageSize,
                                 PAGE_GUARD | PAGE_READWRITE,
                                 &dwOldProtect))
                 {
                 exit(1);
             }
                 printf("Exception handler %lX\n", _exception_code());
             Sleep(2000);
         }
     }
     return 0;
}

Tested on my PC (Windows 7), still can call GetComputerNameEx and return 
correct computer name.
Under java stack overflow, we hit yellow pages. Which should be similar 
in this example.

Thanks
Yumin

On 9/8/2014 4:41 PM, David Holmes wrote:
> Hi Yumin,
>
> I'd overlooked the local buffer issue. Even a 1K buffer may be an 
> issue if the crash we are trying to report about related to 
> stackoverflow.
>
> David
>
> On 9/09/2014 6:35 AM, Yumin Qi wrote:
>> Thanks for review again.
>>
>> Yumin
>> On 9/8/2014 12:19 PM, Calvin Cheung wrote:
>>> On 9/8/2014 11:43 AM, Yumin Qi wrote:
>>>> Calvin,
>>>>
>>>>   Thanks for the review, yes, it is webrev01 (now updated with buffer
>>>> len to 1024, see below).
>>>>
>>>> /lpBuffer/[out]
>>>>
>>>>     A pointer to a buffer that receives the computer name or the
>>>>     cluster virtual server name.
>>>>
>>>>     The length of the name may be greater than
>>>>     MAX_COMPUTERNAME_LENGTH characters because DNS allows longer
>>>>     names. To ensure that this buffer is large enough, set this
>>>>     parameter to*NULL*and use the required buffer size returned in
>>>>     the/lpnSize/parameter.
>>>>
>>>> /lpnSize/[in, out]
>>>>
>>>>     On input, specifies the size of the buffer, in*TCHARs*. On
>>>>     output, receives the number of*TCHARs*copied to the destination
>>>>     buffer, not including the terminating*null*character.
>>>>
>>>>     If the buffer is too small, the function fails and*GetLastError*
>>>>
>>>> <http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx>returns 
>>>>
>>>>
>>>>     ERROR_MORE_DATA. This parameter receives the size of the buffer
>>>>     required, including the terminating*null*character.
>>>>
>>>>     If/lpBuffer/is*NULL*, this parameter must be zero.
>>>>
>>>> In winbase.h:
>>>>
>>>> #ifndef _MAC
>>>> #define MAX_COMPUTERNAME_LENGTH 15
>>>> #else
>>>> #define MAX_COMPUTERNAME_LENGTH 31
>>>> #endif
>>>>
>>>> So it is 15 in most case, but it is not enough for most cases in
>>>> network name, I put 4K here think that is enough for most of the 
>>>> cases.
>>> The length of 15 is for the NetBios name. In this case, we want to get
>>> the DNS host name. That's why 15 won't be sufficient.
>>>
>>>> According to the description, I set buffer = NULL, and size to 0, the
>>>> call failed.
>>> Yes, the call should fail with the return code of ERROR_MORE_DATA and
>>> the third parameter ( _Inout_  LPDWORD lpnSize) will contain the
>>> number of bytes required to receive the name. This way, the caller can
>>> dynamically allocate a buffer large enough for the name.
>>>>
>>>> I updated again, and set the buffer len as 1K, 1024 bytes, which I
>>>> think should be enough.
>>> Yes, I think it's large enough for this fix.
>>>
>>> Calvin
>>>> The specs in MSDN are confusing some time and not consistent in their
>>>> pages.
>>>>
>>>> Thanks
>>>> Yumin
>>>>
>>>>
>>>>
>>>>
>>>> On 9/8/2014 10:29 AM, Calvin Cheung wrote:
>>>>> Yumin,
>>>>>
>>>>> os_windows.cpp
>>>>>
>>>>> 1592   char buffer[4096];
>>>>>
>>>>> Why do you need a 4k buffer?
>>>>>
>>>>> According to:
>>>>> http://msdn.microsoft.com/en-us/library/windows/desktop/ms724220(v=vs.85).aspx 
>>>>>
>>>>>
>>>>> "Each name can be up to 255 bytes total. "
>>>>>
>>>>> So maybe 256 is sufficient?
>>>>>
>>>>> btw, is your new webrev located at:
>>>>> http://cr.openjdk.java.net/~minqi/8056930/webrev01/ ?
>>>>>
>>>>> thanks,
>>>>> Calvin
>>>>>
>>>>> On 9/8/2014 10:17 AM, Yumin Qi wrote:
>>>>>> Hi,
>>>>>>
>>>>>>   I made a small change to Windows part, when GetComputerNameEx
>>>>>> fails, instead of do nothing, output "N/A".
>>>>>>
>>>>>> Thanks
>>>>>> Yumin
>>>>>>
>>>>>> On 9/5/2014 2:46 PM, Yumin Qi wrote:
>>>>>>> Please review
>>>>>>>
>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8056930
>>>>>>> Webrev: http://cr.openjdk.java.net/~minqi/8056930/webrev00
>>>>>>>
>>>>>>>   After java crashed, we would like to know the host on which it
>>>>>>> failed especially when doing parallel testing on multiple
>>>>>>> machines. The most useful for knowing host name is telling if the
>>>>>>> test is hardware related, that the test can only repeat on it.
>>>>>>> This piece of code help to print out host name in debug mode.
>>>>>>>
>>>>>>>   Test: manually tested on Unix/Linux/Windows with
>>>>>>> -XX:+CrashGCForDumpingJavaThread.
>>>>>>>    JPRT
>>>>>>>
>>>>>>> Thanks
>>>>>>> Yumin
>>>>>>
>>>>>
>>>>
>>>
>>



More information about the hotspot-runtime-dev mailing list