RFR: 8003348: SA can not read core file on OS X
serguei.spitsyn at oracle.com
serguei.spitsyn at oracle.com
Tue Mar 12 14:12:41 PDT 2013
Yumin,
It looks like Staffan is on vacation this week: Vacation: March 11 - 15
Thanks,
Serguei
On 3/12/13 2:09 PM, Yumin Qi wrote:
> Serguei,
>
> Thanks.
>
> Staffan, can you have a look at the new changes, concern?
>
> Thanks
> Yumin
> On 3/12/2013 12:52 PM, serguei.spitsyn at oracle.com wrote:
>> Yumin,
>>
>> The updated webrev looks good.
>> Just some simple cosmetic and debug comments below.
>>
>>
>> *agent/src/os/bsd/MacosxDebuggerLocal.m*
>>
>> Nice refactoring!
>>
>> 350 /** Only used for core file reading, set thread_id for threads which got after core file parsing.
>> 351 When parsing core file on Mac OS X, thread context is available but thread id.
>> 352 We identify them as java threads by checking if a thread's rsp or rbp within a java thread's
>> 353 stack(stack info is recoreded when it is created). Note Macosx uses unique_thread_id which is
>> 354 different from other platforms though printed ids are still pthread id.
>> 355 Function BsdDebuggerLocal.getJavaThreadsInfo returns an array of long integers to host
>> 356 all java threads' id, stack_start, stack_end as:
>> 357 [uid0, stack_start0, stack_end0, uid1, stack_start1, stack_end1, ...]
>> 358
>> 359 The work cannot be done at init0 since Threads is not available yet(VM not initialized yet).
>> 360 This function should be called only once if succeeded */
>> It'd be better to start lines 351-360 with the '*'.
>> The sentence at line 351 is not clear.
>>
>>
>> 393 /* core file only, called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0 */
>> 394 jlongArray getThreadIntegerRegisterSetFromCore(JNIEnv *env, jobject this_obj, long lwp_id) {
>> 395 // On Mac OS X, we can not get thread_id from x86Thread_State_t, but they are recorded in JavaThread of JVM
>> The comment lines 393 and 395 are two long and can be split in two.
>>
>> 440 regs[REG_INDEX(RDI)] = gregs.r_rdi;
>> 441 regs[REG_INDEX(RIP)] = gregs.r_rip;
>> 442 regs[REG_INDEX(CS)] = gregs.r_cs;
>> 443 regs[REG_INDEX(RSP)] = gregs.r_rsp;
>> 444 regs[REG_INDEX(SS)] = gregs.r_ss;
>> 445 regs[REG_INDEX(FSBASE)] = 0;
>> 446 regs[REG_INDEX(GSBASE)] = 0;
>> 447 regs[REG_INDEX(DS)] = gregs.r_ds;
>> 448 regs[REG_INDEX(ES)] = gregs.r_es;
>> 449 regs[REG_INDEX(FS)] = gregs.r_fs;
>> 450 regs[REG_INDEX(GS)] = gregs.r_gs;
>> 451 regs[REG_INDEX(TRAPNO)] = gregs.r_trapno;
>> 452 regs[REG_INDEX(RFL)] = gregs.r_rflags;
>>
>> At least, the lines 442, 444, 447-450 and 452 can be aligned as 440-441.
>>
>> 652 print_error("attach: Failed to correctly attach to VM. VM might HANG! [PTRACE_CONT failed, stopped by %d]\n", WSTOPSIG(status));
>> The line above is too long. You can split it like this:
>> 652 print_error("attach: Failed to correctly attach to VM. VM might HANG! "
>> "[PTRACE_CONT failed, stopped by %d]\n", WSTOPSIG(status));
>>
>> *agent/src/os/bsd/Makefile*
>>
>> The lines 25 and 55 are too long.
>>
>> |
>> |*agent/src/os/bsd/libproc_impl.c*
>>
>> | I see you've fixed many indents in this file.
>> |
>>
>>
>> || *agent/src/os/bsd/ps_core.c*
>>
>> 565 print_debug(" r_r15: 0x%" PRIx64 "\n", threadinfo->regs.r_r15);
>> 566 print_debug(" r_r14: 0x%" PRIx64 "\n", threadinfo->regs.r_r14);
>> 567 print_debug(" r_r13: 0x%" PRIx64 "\n", threadinfo->regs.r_r13);
>> 568 print_debug(" r_r12: 0x%" PRIx64 "\n", threadinfo->regs.r_r12);
>> 569 print_debug(" r_r11: 0x%" PRIx64 "\n", threadinfo->regs.r_r11);
>> 570 print_debug(" r_r10: 0x%" PRIx64 "\n", threadinfo->regs.r_r10);
>> 571 print_debug(" r_r9: 0x%" PRIx64 "\n", threadinfo->regs.r_r9);
>> 572 print_debug(" r_r8: 0x%" PRIx64 "\n", threadinfo->regs.r_r8);
>> 573 print_debug(" r_rdi: 0x%" PRIx64 "\n", threadinfo->regs.r_rdi);
>> 574 print_debug(" r_rsi: 0x%" PRIx64 "\n", threadinfo->regs.r_rsi);
>> 575 print_debug(" r_rbp: 0x%" PRIx64 "\n", threadinfo->regs.r_rbp);
>> 576 print_debug(" r_rbx: 0x%" PRIx64 "\n", threadinfo->regs.r_rbx);
>> 577 print_debug(" r_rdx: 0x%" PRIx64 "\n", threadinfo->regs.r_rdx);
>> 578 print_debug(" r_rcx: 0x%" PRIx64 "\n", threadinfo->regs.r_rcx);
>> 579 print_debug(" r_rax: 0x%" PRIx64 "\n", threadinfo->regs.r_rax);
>> 580 print_debug(" r_fs: 0x%" PRIx32 "\n", threadinfo->regs.r_fs);
>> 581 print_debug(" r_gs: 0x%" PRIx32 "\n", threadinfo->regs.r_gs);
>> 582 print_debug(" r_rip 0x%" PRIx64 "\n", threadinfo->regs.r_rip);
>> 583 print_debug(" r_cs: 0x%" PRIx64 "\n", threadinfo->regs.r_cs);
>> 584 print_debug(" r_rflags: 0x%" PRIx64 "\n", threadinfo->regs.r_rflags);
>> 585 print_debug(" r_rsp: 0x%" PRIx64 "\n", threadinfo->regs.r_rsp);
>>
>>
>> The lines can be aligned better and printed info will be more readable too:
>> 571-572,580-583
>>
>>
>> 622 print_debug("segment added: %" PRIu64 " 0x%" PRIx64 " %d\n", segcmd.fileoff, segcmd.vmaddr, segcmd.vmsize);
>> 816 print_debug("map_info %d: vmaddr = 0x%016" PRIx64 " fileoff = %" PRIu64 " vmsize = %" PRIu64 "\n", j, iter->vaddr, iter->offset, iter->memsz);
>> The print_debug lines are too long.
>>
>>
>> One empty line extra: 272-273.
>>
>>
>> 956 if (read_core_segments(ph) != true)
>> 957 goto err;
>> 958
>> 959 // allocate and sort maps into map_array, we need to do this
>> 960 // here because read_shared_lib_info needs to read from debuggee
>> 961 // address space
>> 962 if (sort_map_array(ph) != true)
>> 963 goto err;
>> 964
>> 965 if (read_shared_lib_info(ph) != true)
>> 966 goto err;
>> 967
>> 968 // sort again because we have added more mappings from shared objects
>> 969 if (sort_map_array(ph) != true)
>> 970 goto err;
>> 971
>> 972 if (init_classsharing_workaround(ph) != true)
>> 973 goto err;
>>
>> Probably have to print a debug error message for before "goto err;".
>>
>>
>> Thanks,
>> Serguei
>>
>> On 3/7/13 10:22 PM, Yumin Qi wrote:
>>> Serguei and Saffan,
>>>
>>> Please take look at the same link for new webrev.
>>>
>>> Thanks
>>> Yumin
>>>
>>> On 3/7/2013 4:01 PM, serguei.spitsyn at oracle.com wrote:
>>>> Thank you for making the suggested changes!
>>>> Serguei
>>>>
>>>> On 3/7/13 3:55 PM, Yumin Qi wrote:
>>>>> Hi, Serguei
>>>>>
>>>>> Thanks for the review, I reviewed the part of Pgrab_core, you
>>>>> are right, I now put the code into two chunks: APPLE and none APPLE.
>>>>> Will send another webrev for you tonight --- add all your concerns.
>>>>>
>>>>> See answers below:
>>>>>
>>>>> On 3/7/2013 3:32 PM, serguei.spitsyn at oracle.com wrote:
>>>>>> Hi Yumin,
>>>>>>
>>>>>> No insisting on refactoring, it is just desirable. :)
>>>>>>
>>>>>> *
>>>>>> agent/src/os/bsd/symtab.c*
>>>>>>
>>>>>> Need a cleanup:
>>>>>> 54 // #define NAMELEN 4096
>>>>>> 78 // dysymtab_command dysymtabcmd;
>>>>>> 114 // guarantee(symtab->hash_table, "unexpected failure: dbopen");
>>>>> Yes, will.
>>>>>>
>>>>>>
>>>>>> This function is too big, it would be nice to factor out some
>>>>>> of its body fragments as functions:
>>>>>> 55 struct symtab* build_symtab(int fd) {
>>>>> Will try to make it nice.
>>>>>> The line 137 is too long. You can do like this:
>>>>>> int size = symtabcmd.strsize * sizeof(char);
>>>>>> if (read(fd, (void *)(symtab->strs), size) != size) {
>>>>>> Space is missed:
>>>>>> 145 //fix size
>>>>>>
>>>>> OK, will change.
>>>>>> No point to start new line if similar fragments like that do not
>>>>>> have it:
>>>>>> 153 symtab->symbols[i].size =
>>>>>> 154 symtabcmd.strsize - symtab->symbols[i].size;
>>>>> Will change.
>>>>>> Empty line is needed after the structure definition:
>>>>>> 199 void *c_data;
>>>>>> 200 };
>>>>>> 201 // read symbol table from given fd.
>>>>>> 202 struct symtab* build_symtab(int fd) {
>>>>>>
>>>>> Will change.
>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/BsdVtblAccess.java*
>>>>>>
>>>>>> Need a consistent indentation (4?) as they are 2 and 3.
>>>>>> For instance, the BsdDebuggerLocal.java has indent == 4.
>>>>>>
>>>>> Will change to 4.
>>>>> The SA code has no consistent coding style, some place you will
>>>>> see 3, some place 2 or 4.
>>>>> For Java code, I will change them to have 4 spaces. For C, have
>>>>> done some with 2, but still large amount of code ended with 3.
>>>>> This needs future clean work.
>>>>>>
>>>>>> The flag name " newVT" does not match the comments, should it be
>>>>>> named "oldVT" ? :
>>>>>> 46 if (newVT) {
>>>>>> 47 // old C++ ABI
>>>>>> 48 vt = isDarwin ? "_vt_" : "__vt_";
>>>>>> 49 } else {
>>>>>> 50 // new C++ ABI
>>>>>> 51 vt = "_ZTV";
>>>>>> 52 }
>>>>> Oh, I see, the comments reversed.
>>>>>>
>>>>>> *agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThread.java*
>>>>>>
>>>>>> Incorrect indent, it must be 4:
>>>>>> 86 public long getUniqueThreadId() {
>>>>>> 87 return unique_thread_id;
>>>>>> 88 }
>>>>>>
>>>>> Yes.
>>>>>> Sorry for paying too much attention to indentation!
>>>>>> It is because the SA indentation is a real mess. :)
>>>>>>
>>>>>> But this project is a nice progress in the SA area!
>>>>>> In fact, it is a lot of work.
>>>>>> I bet, you spent a lot of time debugging this code.
>>>>>>
>>>>> My work is making SA reading core on Macosx work, now we have a
>>>>> working version! thanks.
>>>>>
>>>>> Yumin
>>>>>>
>>>>>> Thanks,
>>>>>> Serguei
>>>>>>
>>>>>> On 3/6/13 8:54 AM, Yumin Qi wrote:
>>>>>>> Thanks, Serguei
>>>>>>>
>>>>>>> Will take care what you have indicated but refactoring code
>>>>>>> for ps_core.c (Pgrab_core). Maybe in future, code cleaning
>>>>>>> should include this, the better choice I think is regroup code
>>>>>>> to detail in specific platform, such as with new file
>>>>>>> ps_core_darwin.c etc but not now.
>>>>>>>
>>>>>>> /Yumin
>>>>>>>
>>>>>>> On 3/5/2013 8:36 PM, serguei.spitsyn at oracle.com wrote:
>>>>>>>>
>>>>>>>> Hi Yumin,
>>>>>>>>
>>>>>>>>
>>>>>>>> A partial review below.
>>>>>>>>
>>>>>>>> *
>>>>>>>> agent/src/os/bsd/MacosxDebuggerLocal.m
>>>>>>>> *
>>>>>>>>
>>>>>>>> 152 listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
>>>>>>>> 153 CHECK_EXCEPTION;
>>>>>>>> 154 getJavaThreadsInfo_ID = (*env)->GetMethodID(env, cls, "getJavaThreadsInfo",
>>>>>>>> 155 "()[J");
>>>>>>>> 156
>>>>>>>> 157 init_libproc(getenv("LIBSAPROC_DEBUG") != NULL);
>>>>>>>>
>>>>>>>> Is CHECK_EXCEPTION needed after the line #154?
>>>>>>>>
>>>>>>>> The indent is 3 instead of 2:
>>>>>>>> Lines 360-410, 775-788
>>>>>>>>
>>>>>>>> ||*agent/src/os/bsd/libproc.h*
>>>>>>>> 36 #ifdef __APPLE__
>>>>>>>> . . .
>>>>>>>> 46 #ifndef bool
>>>>>>>> 47 typedef int bool;
>>>>>>>> 48 #define true 1
>>>>>>>> 49 #define false 0
>>>>>>>> 50 #endif // bool
>>>>>>>> . . .
>>>>>>>> 57 #else // __APPLE__
>>>>>>>> . . .
>>>>>>>> 76 // This C bool type must be int for compatibility with BSD calls and
>>>>>>>> 77 // it would be a mistake to equivalence it to C++ bool on many platforms
>>>>>>>> 78 typedef int bool;
>>>>>>>> 79 #define true 1
>>>>>>>> 80 #define false 0
>>>>>>>> 81
>>>>>>>> 82 #endif // __APPLE__
>>>>>>>> The bool, true and false are defined the same way for APPLE and
>>>>>>>> not APPLE.
>>>>>>>> Would it make sense to define it just once?
>>>>>>>>
>>>>>>>> ||*agent/src/os/bsd/ps_core.c*
>>>>>>>>
>>>>>>>> Need a clean up:
>>>>>>>> 869 // thread_command thrcmd;
>>>>>>>>
>>>>>>>> Space is missed after "if", wrong indent at line #873:
>>>>>>>> 872 if(read(fd, (void *)&fhead, sizeof(mach_header_64)) != sizeof(mach_header_64)) {
>>>>>>>> 873 goto err;
>>>>>>>> Lines 893, 1087 are too long.
>>>>>>>>
>>>>>>>> The function read_core_segments() is big and not well readable.
>>>>>>>> Would it make sense to consider to separate some of its
>>>>>>>> internals as a local functions.
>>>>>>>> For instance, the lines 921-950 are good candidates for it.
>>>>>>>>
>>>>>>>> The indent is 3:
>>>>>>>> 1015 if (exists(filepath)) {
>>>>>>>> 1016 strcpy(rpath, filepath);
>>>>>>>> 1017 return true;
>>>>>>>> 1018 }
>>>>>>>> I did not understand the comments, probably, some words are
>>>>>>>> missing:
>>>>>>>> 1070 mach_header_64 header; // used to check if a file header in segment
>>>>>>>> . . .
>>>>>>>> 1110 // this is the file begining to core file.
>>>>>>>>
>>>>>>>>
>>>>>>>> Not consistent, other fragments before used "goto err;" :
>>>>>>>> 1122 return false; // error
>>>>>>>> . . .
>>>>>>>> 1133 return false;
>>>>>>>>
>>>>>>>> Too many ifdef'ed fragments with __APPLE__
>>>>>>>> Is it possibler to combine them into bigger chunks or refactor
>>>>>>>> in a different way?
>>>>>>>> For instance, the function Pgrab_core() is not readable.
>>>>>>>> It'd be better to have two separated versions of the function
>>>>>>>> for apple and not apple.
>>>>>>>>
>>>>>>>>
>>>>>>>> Still to review:
>>>>>>>>
>>>>>>>> ||*agent/src/os/bsd/symtab.c*
>>>>>>>> ||*agent/src/os/bsd/symtab.h*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/BsdVtblAccess.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebuggerLocal.java*
>>>>>>>> *agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThread.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java*
>>>>>>>> ||*agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java*
>>>>>>>> ||*agent/src/share/native/sadis.c*
>>>>>>>> ||*make/bsd/makefiles/saproc.make*
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Serguei
>>>>>>>>
>>>>>>>>
>>>>>>>> On 3/2/13 11:57 PM, Yumin Qi wrote:
>>>>>>>>> Hi, all
>>>>>>>>>
>>>>>>>>> Please review at the new changes. Include
>>>>>>>>> 1) use unique_thread_id (which is a 64 bit integer on
>>>>>>>>> Macosx) to identify thread. Add a function in BsdDebuggerLocal
>>>>>>>>> to call the newly added function BsdThread.getUniqueThreadId
>>>>>>>>> to get this id. Meanwhile, move the code of forming threadList
>>>>>>>>> in native part to BsdDebuggerLocal.java since the thread ids
>>>>>>>>> of all java threads can be obtained from Threads and coding is
>>>>>>>>> much easier and clear.
>>>>>>>>>
>>>>>>>>> 2) To have better performance, get all java thread ids,
>>>>>>>>> stack infos (stack begin, stack end) into one array of long
>>>>>>>>> which is decoded in native code and used to set thread ids.
>>>>>>>>> This save much more time first time to fill java thread ids.
>>>>>>>>>
>>>>>>>>> 3) remove DarwinVtblAccess.java which added in last
>>>>>>>>> version , its functionality moved to BsdVtblAccess.java
>>>>>>>>>
>>>>>>>>> 4) BugSpotAgent.java no long exists, remove the changes.
>>>>>>>>>
>>>>>>>>> 5) remove unsupported platform defs.
>>>>>>>>>
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8003348/
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> Yumin
>>>>>>>>>
>>>>>>>>> On 1/22/2013 10:35 PM, Yumin Qi wrote:
>>>>>>>>>> Hi, Staffan (and Serguei)
>>>>>>>>>>
>>>>>>>>>> Made some clean for code.
>>>>>>>>>> 1) added mach-o file fat header parsing as you suggested.
>>>>>>>>>> 2) modified get_real_path as you indicated it could run
>>>>>>>>>> with jre/bin/java
>>>>>>>>>> 3) moved output information from CommandProcessor.java to
>>>>>>>>>> PStack.java for printing out pstack not available for Darwin.
>>>>>>>>>> 4) code clean, file header update.
>>>>>>>>>>
>>>>>>>>>> Please take a look at same location.
>>>>>>>>>>
>>>>>>>>>> Thanks
>>>>>>>>>> Yumin
>>>>>>>>>>
>>>>>>>>>> On 1/18/2013 3:58 AM, Staffan Larsen wrote:
>>>>>>>>>>> Thanks for doing this Yumin!
>>>>>>>>>>>
>>>>>>>>>>> I tried to apply you patch and run it, but I can't get SA to
>>>>>>>>>>> open a core file. You can see the exception I get below. Is
>>>>>>>>>>> there some kind of setup I need to do? This is against a
>>>>>>>>>>> jvmg build of Hotspot.
>>>>>>>>>>>
>>>>>>>>>>> I also noticed that you forgot to update BugSpotAgent.java
>>>>>>>>>>> with the same changes as in HotspotAgent.java. This makes
>>>>>>>>>>> the jstack tool fail.
>>>>>>>>>>>
>>>>>>>>>>> I will look at the changes more closely.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> /Staffan
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Opening core file, please wait...
>>>>>>>>>>> Unable to open core file
>>>>>>>>>>> /cores/core.79028:
>>>>>>>>>>>
>>>>>>>>>>> Doesn't appear to be a HotSpot VM (could not find symbol
>>>>>>>>>>> "gHotSpotVMTypes" in
>>>>>>>>>>> remote process)
>>>>>>>>>>> sun.jvm.hotspot.debugger.DebuggerException: Doesn't appear
>>>>>>>>>>> to be a HotSpot VM (could not find symbol "gHotSpotVMTypes"
>>>>>>>>>>> in remote process)
>>>>>>>>>>> at
>>>>>>>>>>> sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:385)
>>>>>>>>>>> at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:287)
>>>>>>>>>>> at
>>>>>>>>>>> sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:146)
>>>>>>>>>>> at sun.jvm.hotspot.CLHSDB.attachDebugger(CLHSDB.java:188)
>>>>>>>>>>> at sun.jvm.hotspot.CLHSDB.run(CLHSDB.java:55)
>>>>>>>>>>> at sun.jvm.hotspot.CLHSDB.main(CLHSDB.java:35)
>>>>>>>>>>> hsdb> Input stream closed.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On 17 jan 2013, at 22:23, Yumin Qi<yumin.qi at oracle.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hi,
>>>>>>>>>>>>
>>>>>>>>>>>> Please review for the changes for SA to read core file
>>>>>>>>>>>> on Mac OS X, this is feature is not implemented on previous
>>>>>>>>>>>> releases.
>>>>>>>>>>>> This change made for SA to work on core file on Darwin,
>>>>>>>>>>>> but still some function not fixed, such as 'pstack'. This
>>>>>>>>>>>> is intended to integrate into 8.
>>>>>>>>>>>>
>>>>>>>>>>>> http://cr.openjdk.java.net/~minqi/8003348/
>>>>>>>>>>>>
>>>>>>>>>>>> Please take some time since the code change is a
>>>>>>>>>>>> little bigger.
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks very much
>>>>>>>>>>>> Yumin
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20130312/4235d4e1/attachment-0001.html
More information about the serviceability-dev
mailing list