thanks for your patient guidance!
rgds,
Dyno
On 3/31/15 8:07 AM, Dave Anderson wrote:
----- Original Message -----
> Dave,
> patch updated. please review, thanks.
> * converted all the FATAL to INFO.
> * the reason to "break" rather than "return FALSE" is that we
might still
> be able to read the "memory" group which is the only relevant
checkpoint
> group we care about.
Hi Dyno,
This patch looks OK, except for one minor thing.
I see that you removed the two CRASHDEBUG(1) messages in is_vmware_vmss()
as well. In the case of the failure to fopen() or fread() the passed-in
filename, it is OK to call error(INFO, ...), but they are essentially both
no-ops. Given that main() will reject any non-readable file, and several
earlier dumpfile-checking functions will call error(FATAL, ...) if the
dumpfile cannot be opened, those messages will never be displayed.
However, in this case:
@@ -47,8 +53,7 @@ is_vmware_vmss(char *filename)
hdr.id != CPTDUMP_PARTIAL_MAGIC_NUMBER &&
hdr.id != CPTDUMP_RESTORED_MAGIC_NUMBER &&
hdr.id != CPTDUMP_NORESTORE_MAGIC_NUMBER) {
- if (CRASHDEBUG(1))
- error(INFO, LOGPRX"Unrecognized .vmss file (magic
%x).\n", hdr.id);
+ error(INFO, LOGPRX"Unrecognized .vmss file (magic %x).\n",
hdr.id);
return FALSE;
}
The CRASHDEBUG(1) absolutely should be there. The is_vmware_vmss() function
is simply there to verify whether the passed-in filename is a .vmss file.
If it is not -- based upon the header contents -- then it should quietly return
FALSE. There will be other file formats in the future, and most likely will be placed
following the is_vmware_vmss() call in main(), and we won't want that irrelevant
message. So I've restored that particular CRASHDEBUG(1) qualifier.
Aside from that, the patch is queued for crash-7.1.1:
https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_crash-2Du...
Thanks,
Dave
> rgds,
> Dyno
>
> On 3/30/15 12:14 PM, Dave Anderson wrote:
>> ----- Original Message -----
>>> Dave,
>>> I've removed the assert now. please find the updated patch in
>>> attachment.
>>> thanks.
>>> rgds,
>>> Dyno
>> Hi Dyno,
>>
>> I should have combined this actual code review with my last
>> response re: the assert() calls, but there are just a few minor
>> things that still need adjustment.
>>
>> As I mentioned in an earlier response, during session initialization,
>> which is before RUNTIME gets set in pc->flags in main_loop(), any
>> error(FATAL, ...) call will print the error message and the crash
>> session immediately exits. And that's OK if that's what you want
>> to happen.
>>
>> But in vmware_vmss_init() you changed many of the previous error messages
>> that used fprintf(vmss.ofp, ...) to use a construct using FATAL error
>> messages like this:
>>
>> + error(FATAL, LOGPRX"%s: %s\n", filename,
strerror(errno));
>> + result = FALSE;
>> + goto exit;
>>
>> But that doesn't make sense since the error message will get printed and
>> crash will exit immediately, and therefore will not return back here in
>> memory_sources_init():
>>
>> + } else if (pc->flags & VMWARE_VMSS) {
>> + if (!vmware_vmss_init(pc->dumpfile, fp))
>> + error(FATAL, "%s: initialization
failed\n",
>> + pc->dumpfile);
>> + }
>>
>> So preferably the calls should be changed to error(INFO, ...) so that the
>> user
>> will get the specific message followed by the general "initialization
>> failed"
>> message.
>>
>> Also, it would make sense to add an error(INFO, ...) message here as you
>> have done for the other error scenarios:
>>
>> + if (fread(&hdr, sizeof(cptdumpheader), 1, fp) != 1) {
>> + result = FALSE;
>> + goto exit;
>> + }
>>
>> If that initial fread() of the header fails, then the session will exit
>> with
>> just the single somewhat-confusing "initialization failed" message.
>>
>> I also have a general question about vmware_vmss_init() which is not
>> specific to this patch. In the inner-most "for(;;)" loop, it appears
>> that it only legitimately breaks if it runs into a TAG_NULL:
>>
>> if (tag == NULL_TAG)
>> break;
>>
>> But there are a number of fread() failures in the loop that do an
>> fprintf(ofp, ...) and simply "break". If any of those failures occur,
>> it looks like vmware_vmss_init() will return success. But should it?
>>
>> Anyway, if you can clean up the error message handling, we can get this
>> patch
>> checked in.
>>
>> Thanks,
>> Dave
>>
>>
>>> On 3/27/15 11:05 AM, Dave Anderson wrote:
>>>> Dyno,
>>>>
>>>> I've got the sample multi-region dumpfile -- thanks for that.
>>>>
>>>> This latest patch tests OK on all three dumpfiles. But can you please
>>>> remove the remaining assert() calls as I requested in my previous email?
>>>>
>>>> Thanks,
>>>> Dave
>>>>
>>>>
>>>> ----- Original Message -----
>>>>> Dave,
>>>>>
>>>>> An assert i put caused the crash, workstation VM memory has more
block
>>>>> item
>>>>> than i thought.
>>>>> fixed it in the patch and tested against all the dump i have. i will
try
>>>>> to
>>>>> provide a 4GB memory dump later.
>>>>>
>>>>> ESX VM 3G Memory
>>>>> ================
>>>>> - Group: memory pos=0x1f6f6 size=0xc000090c
>>>>> ------------------------------------
>>>>> align_mask[0, 0] => 0x00ffff
>>>>> regionsCount => 0x000000
>>>>> Memory[0, 0] => BLOCK, pos=0x20000,
>>>>> size=0xc0000000
>>>>>
>>>>> ESX VM 4G Memory
>>>>> ================
>>>>> - Group: memory pos=0x1f6f6 size=0x10000090c
>>>>> -----------------------------------
>>>>> align_mask[0, 0] => 0x00ffff
>>>>> regionsCount => 0x000002
>>>>> regionPageNum[0] => 0x000000
>>>>> regionPPN[0] => 0x000000
>>>>> regionSize[0] => 0x0c0000
>>>>> regionPageNum[1] => 0x0c0000
>>>>> regionPPN[1] => 0x100000
>>>>> regionSize[1] => 0x040000
>>>>> Memory[0, 0] => BLOCK, pos=0x20000,
>>>>> size=0x100000000
>>>>>
>>>>> WS VM Memory
>>>>> ============
>>>>> - Group: memory pos=0x93b1 size=0x10098
>>>>> ----------------------------------------
>>>>> align_mask[0, 0] => 0x00ffff
>>>>> regionsCount => 0x000000
>>>>> hotSetSize => 0x040000
>>>>> hotSet => BLOCK, pos=0x9405,
>>>>> size=0x8000
>>>>> MainMemPageZeroStateSize => 0x040000
>>>>> MainMemKnownZero => BLOCK, pos=0x11447,
>>>>> size=0x8000
>>>>>
>>>>> rgds,
>>>>> Dyno
>>>>>
>>>>> On 3/26/15 1:12 PM, Dave Anderson wrote:
>>>>>> ----- Original Message -----
>>>>>>> Dave,
>>>>>>> updated the patch and please review. thanks.
>>>>>>> - the page_size/page_shift problem.
>>>>>>> - change type cast to union.
>>>>>>> - the read_vmware_vmss() regression.
>>>>>>>
>>>>>>> rgds,
>>>>>>> Dyno
>>>>>> Dyno,
>>>>>>
>>>>>> Since you cannot make any additional sample vmss2core-generated
>>>>>> dumpfiles available to me, I can only test this latest patch
>>>>>> on the two dumpfile/kernel pairs that you gave me in February:
>>>>>>
>>>>>> vmlinux-2.6.32-431.el6 CentOS6.5-11bd56db.vmss
>>>>>>
>>>>>> and
>>>>>>
>>>>>> vmlinux-3.13.0-39-generic Ubuntu1404_64bit-65993542.vmss
>>>>>> (with its companion Ubuntu1404_64bit-65993542.vmem file)
>>>>>>
>>>>>> The CentOS kernel works OK with your patch:
>>>>>>
>>>>>> $ crash vmlinux-2.6.32-431.el6 CentOS6.5-11bd56db.vmss
>>>>>>
>>>>>> crash 7.1.1rc13
>>>>>> Copyright (C) 2002-2014 Red Hat, Inc.
>>>>>> Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation
>>>>>> Copyright (C) 1999-2006 Hewlett-Packard Co
>>>>>> Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited
>>>>>> Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.
>>>>>> Copyright (C) 2005, 2011 NEC Corporation
>>>>>> Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.
>>>>>> Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux,
Inc.
>>>>>> This program is free software, covered by the GNU General
Public
>>>>>> License,
>>>>>> and you are welcome to change it and/or distribute copies of it
under
>>>>>> certain conditions. Enter "help copying" to see the
conditions.
>>>>>> This program has absolutely no warranty. Enter "help
warranty" for
>>>>>> details.
>>>>>>
>>>>>> GNU gdb (GDB) 7.6
>>>>>> Copyright (C) 2013 Free Software Foundation, Inc.
>>>>>> License GPLv3+: GNU GPL version 3 or later
>>>>>>
<
https://urldefense.proofpoint.com/v2/url?u=http-3A__gnu.org_licenses_gpl....
>>>>>> >
>>>>>> This is free software: you are free to change and redistribute
it.
>>>>>> There is NO WARRANTY, to the extent permitted by law. Type
"show
>>>>>> copying"
>>>>>> and "show warranty" for details.
>>>>>> This GDB was configured as
"x86_64-unknown-linux-gnu"...
>>>>>>
>>>>>> KERNEL: vmlinux-2.6.32-431.el6
>>>>>> DUMPFILE: CentOS6.5-11bd56db.vmss
>>>>>> CPUS: 4
>>>>>> DATE: Tue Feb 3 18:22:03 2015
>>>>>> UPTIME: 00:01:06
>>>>>> LOAD AVERAGE: 0.71, 0.22, 0.07
>>>>>> TASKS: 302
>>>>>> NODENAME:
promd-1s-dhcp37.eng.vmware.com
>>>>>> RELEASE: 2.6.32-431.el6.x86_64
>>>>>> VERSION: #1 SMP Fri Nov 22 03:15:09 UTC 2013
>>>>>> MACHINE: x86_64 (2394 Mhz)
>>>>>> MEMORY: 511.5 MB
>>>>>> PANIC: ""
>>>>>> PID: 0
>>>>>> COMMAND: "swapper"
>>>>>> TASK: ffffffff81a8d020 (1 of 4) [THREAD_INFO:
>>>>>> ffffffff81a00000]
>>>>>> CPU: 0
>>>>>> STATE: TASK_RUNNING (ACTIVE)
>>>>>> WARNING: panic task not found
>>>>>>
>>>>>> crash>
>>>>>>
>>>>>> But the Ubuntu1404_64bit-65993542.vmss fails miserably:
>>>>>>
>>>>>> $ crash Ubuntu1404_64bit-65993542.vmss
vmlinux-3.13.0-39-generic
>>>>>>
>>>>>> crash 7.1.1rc13
>>>>>> Copyright (C) 2002-2014 Red Hat, Inc.
>>>>>> Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation
>>>>>> Copyright (C) 1999-2006 Hewlett-Packard Co
>>>>>> Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited
>>>>>> Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.
>>>>>> Copyright (C) 2005, 2011 NEC Corporation
>>>>>> Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.
>>>>>> Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux,
Inc.
>>>>>> This program is free software, covered by the GNU General
Public
>>>>>> License,
>>>>>> and you are welcome to change it and/or distribute copies of it
under
>>>>>> certain conditions. Enter "help copying" to see the
conditions.
>>>>>> This program has absolutely no warranty. Enter "help
warranty" for
>>>>>> details.
>>>>>>
>>>>>> crash: vmware_vmss.c:169: vmware_vmss_init: Assertion
`__extension__
>>>>>> ({
>>>>>> size_t __s1_len, __s2_len; (__builtin_constant_p (name)
&&
>>>>>> __builtin_constant_p ("Memory") && (__s1_len
= strlen (name),
>>>>>> __s2_len
>>>>>> =
>>>>>> strlen ("Memory"), (!((size_t)(const void *)((name) +
1) -
>>>>>> (size_t)(const void *)(name) == 1) || __s1_len >= 4)
&&
>>>>>> (!((size_t)(const void *)(("Memory") + 1) -
(size_t)(const void
>>>>>> *)("Memory") == 1) || __s2_len >= 4)) ?
__builtin_strcmp (name,
>>>>>> "Memory") : (__builtin_constant_p (name) &&
((size_t)(const void
>>>>>> *)((name) + 1) - (size_t)(const void *)(name) == 1) &&
(__s1_len =
>>>>>> strlen (name), __s1_len < 4) ? (__builtin_constant_p
("Memory") &&
>>>>>> ((size_t)(const void *)(("Memory") + 1) -
(size_t)(const void
>>>>>> *)("Memory") == 1) ? __builtin_strcmp (name,
"Memory") :
>>>>>> (__extension__
>>>>>> ({ __const unsigned char *__s2 = (__const unsigned char *)
(__const
>>>>>> char
>>>>>> *) ("Memory"); register int __result = (((__const
unsigned char *)
>>>>>> (__const char *) (name))[0] - __s2[0]); if (__s1_len > 0
&& __result
>>>>>> ==
>>>>>> 0)
>>>>> { __result = (((__const unsigned char *) (__const char *) (name))[1]
-
>>>>> __s2[1]); if (__s1_len > 1 && __result == 0) { __result =
(((__const
>>>>> unsigned char *) (__const char *) (name))[2] - __s2[2]); if (__s1_len
>
>>>>> 2
>>>>> &&
>>>>> __result == 0) __result = (((__const unsigned char *) (__const char
*)
>>>>> (name))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
>>>>> ("Memory")
>>>>> && ((size_t)(const void *)(("Memory") + 1) -
(size_t)(const void
>>>>> *)("Memory") == 1) && (__s2_len = strlen
("Memory"), __s2_len < 4) ?
>>>>> (__builtin_constant_p (name) && ((size_t)(const void
*)((name) + 1) -
>>>>> (size_t)(const void *)(name) == 1) ? __builtin_strcmp (name,
"Memory") :
>>>>> (__extension__ ({ __const unsigned char *__s1 = (__const unsigned
char
>>>>> *)
>>>>> (__const char *) (name); register int __result = __s1[0] - ((__const
>>>>> unsigned char *) (__const char *) ("Memory"))[0]; if
(__s2_len > 0 &&
>>>>> __result == 0) { __result = (__s1[1] - ((__const unsigned char *)
>>>>> (__const
>>>>> char *) ("Memory"))[1]); if (__s2_len > 1 &&
__result == 0) { __resul
>>>>> t = (__s1[2] - ((__const unsigned char *) (__const char *)
>>>>> ("Memory"))[2]);
>>>>> if (__s2_len > 2 && __result == 0) __result = (__s1[3] -
((__const
>>>>> unsigned
>>>>> char *) (__const char *) ("Memory"))[3]); } } __result;
}))) :
>>>>> __builtin_strcmp (name, "Memory")))); }) == 0' failed.
>>>>>> Aborted (core dumped)
>>>>>> $
>>>>>>
>>>>>> Note that crash-7.1.0 works OK:
>>>>>>
>>>>>> $ /usr/bin/crash Ubuntu1404_64bit-65993542.vmss
>>>>>> vmlinux-3.13.0-39-generic
>>>>>>
>>>>>> crash 7.1.0
>>>>>> Copyright (C) 2002-2014 Red Hat, Inc.
>>>>>> Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation
>>>>>> Copyright (C) 1999-2006 Hewlett-Packard Co
>>>>>> Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited
>>>>>> Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.
>>>>>> Copyright (C) 2005, 2011 NEC Corporation
>>>>>> Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.
>>>>>> Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux,
Inc.
>>>>>> This program is free software, covered by the GNU General
Public
>>>>>> License,
>>>>>> and you are welcome to change it and/or distribute copies of it
under
>>>>>> certain conditions. Enter "help copying" to see the
conditions.
>>>>>> This program has absolutely no warranty. Enter "help
warranty" for
>>>>>> details.
>>>>>>
>>>>>> vmw: Memory dump is not part of this vmss file.
>>>>>> vmw: Try to locate the companion vmem file ...
>>>>>> vmw: vmem file: Ubuntu1404_64bit-65993542.vmem
>>>>>>
>>>>>> GNU gdb (GDB) 7.6
>>>>>> Copyright (C) 2013 Free Software Foundation, Inc.
>>>>>> License GPLv3+: GNU GPL version 3 or later
>>>>>>
<
https://urldefense.proofpoint.com/v2/url?u=http-3A__gnu.org_licenses_gpl....
>>>>>> >
>>>>>> This is free software: you are free to change and redistribute
it.
>>>>>> There is NO WARRANTY, to the extent permitted by law. Type
"show
>>>>>> copying"
>>>>>> and "show warranty" for details.
>>>>>> This GDB was configured as
"x86_64-unknown-linux-gnu"...
>>>>>>
>>>>>> KERNEL: vmlinux-3.13.0-39-generic
>>>>>> DUMPFILE: Ubuntu1404_64bit-65993542.vmss
>>>>>> CPUS: 1
>>>>>> DATE: Thu Nov 13 14:10:53 2014
>>>>>> UPTIME: 2 days, 03:40:33
>>>>>> LOAD AVERAGE: 0.00, 0.01, 0.05
>>>>>> TASKS: 669
>>>>>> NODENAME: ubuntu
>>>>>> RELEASE: 3.13.0-39-generic
>>>>>> VERSION: #66-Ubuntu SMP Tue Oct 28 13:30:27 UTC 2014
>>>>>> MACHINE: x86_64 (2693 Mhz)
>>>>>> MEMORY: 1 GB
>>>>>> PANIC: ""
>>>>>> PID: 0
>>>>>> COMMAND: "swapper/0"
>>>>>> TASK: ffffffff81c15480 [THREAD_INFO:
ffffffff81c00000]
>>>>>> CPU: 0
>>>>>> STATE: TASK_RUNNING
>>>>>> WARNING: panic task not found
>>>>>>
>>>>>> crash>
>>>>>>
>>>>>> Anyway, besides fixing whatever the problem is, please remove
the
>>>>>> assert()
>>>>>> calls entirely. They did not exist in the original vmware_vmss.c
file,
>>>>>> and shouldn't be added now.
>>>>>>
>>>>>> assert() is not used by the top-level crash sources (except for
qemu.c
>>>>>> and qemu-load.c, which came from a 3rd party, and I didn't
feel like
>>>>>> changing
>>>>>> all of them). Instead, please use the crash convention by
testing for
>>>>>> the
>>>>>> anomoly, and then send an appropriate error message to
error(FATAL,
>>>>>> ...),
>>>>>> which will kill the crash session if it's during session
>>>>>> initialization,
>>>>>> or kill the current command if it's during crash runtime.
>>>>>>
>>>>>> Thanks,
>>>>>> Dave
>>>>>>
>