If catching the exception is done with "except Exception as e:" this
will work only from 2.6. To maintain backward compatibility with 2.4 I
have used sys.exc_info(). A bit of a wart, but it works.
It's a function call in 3.x and redundant parentheses around an
expression on 2.x. This works fine as long as all prints have just a
single argument. One print statement with two arguments was changed to
use % formatting instead.
If '-t' is specified and a filter such as '-U me' is specified, the
pid total displayed is the total number of pids instead of the number
of filtered pids.
I was getting an error with pie charts on some systems
with very small memory usage.
$ smem -S data.tar --pie=command
Traceback (most recent call last):
File "/usr/local/bin/smem", line 636, in <module>
showpids()
File "/usr/local/bin/smem", line 246, in showpids
showtable(pt.keys(), fields, columns.split(), options.sort or 'pss')
File "/usr/local/bin/smem", line 455, in showtable
showpie(l, sort)
File "/usr/local/bin/smem", line 498, in showpie
while values and (t + values[-1 - c] < (tm * .02) or
IndexError: list index out of range
I traced it to a bug in showpie, where there's some confused
usage of a list index and list popping.
In showpie, c is used to index into the values in a while
loop that removes entries from the end of a sorted list,
and aggregates their values for use in an "other" entry,
added to the list before display.
Moving (and using) the index is wrong because the list is being
chopped from the end as we go. This warps the value of 'other',
but under normal circumstances would probably not be noticeable
because these items have very small values.
However, if several items are popped, and the list is very short,
it can result in the list index error above.
Also, truncating the values and labels in the subsequent
conditional is redundant with the pop in the loop.
Below is a patch to fix these problems.
-- Tim
---
smem | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
- totalmem should return kB when provided manually
- firmware size never goes below zero
- add comments
- calculate kernel portion of cached by subtracting mapped rather than
anonymous
- get rid of sum() bits for silly column totals
Jeff Schroeder wrote:
> Awesome tool! I learned about this from the LWN article and
> immediately (stupidly) tried it out on a centos 5 host. Here is a
> patch to add a kernel version check.
This is a nice fix, but the version check should be done against
the proc data being used (which is not necessarily that of the
local kernel). This required moving kernel_version_check to
after where the src data is read.
I do "smem -w -K a.txt -R 2048M" and got following error:
zhichyu@w-shpd-zcyu:~/sftw4ubuntu$ smem-0.1/smem -w -K a.txt -R 2048M
size: 'a.txt': No such file
Traceback (most recent call last):
File "smem-0.1/smem", line 607, in <module>
showsystem()
File "smem-0.1/smem", line 361, in showsystem
k = kernelsize()
File "smem-0.1/smem", line 77, in kernelsize
d = os.popen("size %s" % options.kernel).readlines()[1]
IndexError: list index out of range
The root cause is that os.popen("size a.txt") returns only one line.
If the user provides an invalid kernel image file path, I think it's
better to assume the image size is zero than raise an exception.
There are two minor bugs on physical memory size computing:
(1) fromunits() returns wrong value for "2001844kB", which consists of
more than one digits.
(2) memory()['memtotal'] is in kB. If "--realmem" is not provided at
CLI, totalmem() returns number in MB and the "firmware/hardware"
amount will be minus. totalmem() needs to always return value in kB.
Here is how to test this patch:
(1) Do "smem -w" , the "firmware/hardware" amount should not be minus.
(2) Do "smem -w -R 2001844kB" (change 2001844kB per your PC, note to
keep it in kB unit) , the "firmware/hardware" amount should not be
minus.
Here's a patch to fix these issues.
Awesome tool! I learned about this from the LWN article and
immediately (stupidly) tried it out on a centos 5 host. Here is a
patch to add a kernel version check.