[Crash-utility] [PATCH] add -s option to vm to display one vma at a time
Dave Anderson
anderson at redhat.com
Fri Mar 16 20:28:17 UTC 2012
----- Original Message -----
> At 2012-3-15 3:06, Dave Anderson wrote:
> >
> >
> > ----- Original Message -----
> >> At 2012-3-14 4:45, Dave Anderson wrote:
> >>>
> >>>
> >>> ----- Original Message -----
> >>>> At 2012-3-13 17:56, qiaonuohan wrote:
> >>>>
> >>>> Hello Dave,
> >>>>
> >>>> When I am using "vm -p" command, I feel it is chaotic when too
> >>>> much data is printed. I think it is clear to display one vma
> >>>> each time.
> >>>>
> >>>> In the patch, I compare all vmas with the argument of -s option.
> >>>> If an equal vma is found, it will be printed like below.
> >>>>
> >>>> crash> vm -ps ffff88028ff7d3a0
> >>>> VMA START END FLAGS FILE
> >>>> ffff88028ff7d3a0 7fff29b71000 7fff29b87000 100173
> >>>> VIRTUAL PHYSICAL
> >>>> 7fff29b71000 (not mapped)
> >>>> 7fff29b72000 (not mapped)
> >>>> 7fff29b73000 (not mapped)
> >>>> 7fff29b74000 (not mapped)
> >>>> 7fff29b75000 (not mapped)
> >>>> 7fff29b76000 (not mapped)
> >>>> 7fff29b77000 27faad000
> >>>> 7fff29b78000 2807aa000
> >>>> 7fff29b79000 280781000
> >>>> 7fff29b7a000 280787000
> >>>> 7fff29b7b000 280776000
> >>>> 7fff29b7c000 280786000
> >>>> 7fff29b7d000 27f2df000
> >>>> 7fff29b7e000 27f2e0000
> >>>> 7fff29b7f000 27f2e1000
> >>>> 7fff29b80000 27f2d7000
> >>>> 7fff29b81000 28b1ac000
> >>>> 7fff29b82000 28ecc1000
> >>>> 7fff29b83000 28c5c2000
> >>>> 7fff29b84000 28aaf4000
> >>>> 7fff29b85000 28aaf9000
> >>>> 7fff29b86000 289566000
> >>>> crash>
> >>>
> >>> Seems like a reasonable request.
> >>>
> >>> However, I don't like your mixing it with the "-R reference" usage,
> >>> because it confuses things like this simple example:
> >>>
> >>> crash> vm -p -s ffff810ec9f57818
> >>> VMA START END FLAGS FILE
> >>> ffff810ec9f57818 4010d000 40110000 101877
> >>> /usr/local/java/jdk1.5.0_19/bin/java
> >>> VIRTUAL PHYSICAL
> >>> 4010d000 ec89b1000
> >>> 4010e000 FILE: /usr/local/java/jdk1.5.0_19/bin/java OFFSET: e000
> >>> 4010f000 e99803000
> >>> crash>
> >>>
> >>> If the command above were to be qualified with a "-R 4010e000" reference
> >>> check, it results in a nonsensical error message:
> >>>
> >>> crash> vm -p -s ffff810ec9f57818 -R 4010e000
> >>> vm: only one -R option allowed
> >>> Usage:
> >>> vm [-p | -v | -m | [-R reference] | [-f vm_flags]] [pid |
> >>> taskp] ...
> >>> Enter "help vm" for details.
> >>> crash>
> >>>
> >>> A few suggestions:
> >>>
> >>> (1) Don't even bother to tie it in with the "vm -v" option, because if
> >>> you already know the vm_area_struct address, then just print it with
> >>> "vm_area_struct<address>".
> >>>
> >>> (2) Then, since it *only* applies with the -p functionality, make it
> >>> a new "-P<vmaddr>" option, where the help page explains that the
> >>> <vmaddr> argument must be a vm_area_struct of the current context:
> >>>
> >>> Usage:
> >>> vm [-p | -P vmaddr | -v | -m | [-R reference] | [-f
> >>> vm_flags]] [pid | taskp] ...
> >>>
> >>> (3) Make -P mutually exclusive with all of the other options.
> >>>
> >>> (4) Do not use the reference structure for this feature. Just use your new
> >>> flag, and pass the vma address in the 3rd "vaddr" argument to vm_area_dump(),
> >>> since it's not even being used by cmd_vm().
> >>
> >> I have modified the patch, please check.
> >
> > OK, these are my suggestions to finalize this patch. First, fix this:
> >
> > # make warn
> > ...
> > cc -c -g -DX86_64 -DGDB_7_3_1 memory.c -Wall -O2
> > -Wstrict-prototypes -Wmissing-prototypes -fstack-protector
> > memory.c: In function "vm_area_dump":
> > memory.c:3503:7: warning: "single_vma" may be used uninitialized
> > in this function [-Wuninitialized]
> > ...
> >
> > Secondly, this command is no different from the other context-sensitive
> > "vm" command options, so please always print the task header like they
> > do. Just remove the three restrictions in cmd_vm() that do this:
> >
> > - if (!ref)
> > + if (!(ref || (flag& PRINT_SINGLE_VMA)))
> > print_task_header(fp, CURRENT_CONTEXT(),
> > 0);
> >
> > Third, the option is either going to work OK or fail to find the VMA.
> > Your patch does this if an invalid vm_area_struct address is
> > entered:
> >
> > crash> vm -P ffff880617e7af44
> > VMA START END FLAGS FILE
> > crash>
> >
> > Regardless of success or failure, the print_task_header() call in cmd_vm()
> > should always show the task information. Then, if you actually find the VMA,
> > print the "VMA START ..." header along with its data:
> >
> > crash> vm -P ffff880284cf87e0
> > PID: 13318 TASK: ffff8806294f2690 CPU: 11 COMMAND: "crash"
> > VMA START END FLAGS FILE
> > ffff880284cf87e0 400000 9fa000 8001875
> > /root/crash-6.0.4/crash
> > VIRTUAL PHYSICAL
> > 400000 28c7fa000
> > 401000 29470a000
> > 402000 29470b000
> > 403000 29470c000
> > 404000 29470d000
> > 405000 29470e000
> > 406000 29470f000
> > ...
> >
> > But if the command fails to find the VMA, then indicate that under
> > the task header:
> >
> > crash> vm -P ffff880284cf87e8
> > PID: 13318 TASK: ffff8806294f2690 CPU: 11 COMMAND: "crash"
> > (not found)
> > crash>
> >
> > Lastly, please don't use subterfuge to accomplish the task at
> > hand. The setting of PHYSADDR in the vm_area_dump() function
> > makes no sense at all:
> >
> > + single_vma_header = 0;
> > + if (flag& PRINT_SINGLE_VMA) {
> > + flag |= PHYSADDR;
> > + single_vma = vaddr;
> > + vaddr = 0;
> > + }
> >
> > It may "work" by doing the above, but I'm sure you can accomplish
> > it just as easily using your PRINT_SINGLE_VMA flag and/or your new
> > local variables, making it both easier to understand and more
> > maintainable.
>
> The patch is modified. I think I need to pay more attention to
> maintainable and thanks for your patience.
I reworded the help page a little, but other than that the patch
looks good, and is queued for crash-6.0.5.
Thanks,
Dave
More information about the Crash-utility
mailing list