RFR(XS): 8056930: Output host info under some condition for core dump
Yumin Qi
yumin.qi at oracle.com
Tue Sep 9 04:59:08 UTC 2014
Thanks for quick review again!
Yumin
On 9/8/2014 9:57 PM, David Holmes wrote:
> Hi Yumin,
>
> Okay - thanks! We will see how this goes.
>
> David
>
> On 9/09/2014 2:52 PM, Yumin Qi wrote:
>> 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