diff --git a/guider/guider.py b/guider/guider.py index 071b9bbf..16756557 100755 --- a/guider/guider.py +++ b/guider/guider.py @@ -7,7 +7,7 @@ __credits__ = "Peace Lee" __license__ = "GPLv2" __version__ = "3.9.8" -__revision__ = "241205" +__revision__ = "241206" __maintainer__ = "Peace Lee" __email__ = "iipeace5@gmail.com" __repository__ = "https://github.com/iipeace/guider" @@ -30576,6 +30576,8 @@ def execTopCmd(): # set handler for exit # SysMgr.setNormalSignal() + # -------------------- execute command -------------------- # + # thread # if SysMgr.checkMode("ttop"): SysMgr.processEnable = False @@ -30816,7 +30818,7 @@ def execTopCmd(): SysMgr.dltTopEnable = True SysMgr.dltTimeEnable = True - # ANDTOP # + # logcat # elif SysMgr.checkMode("andtop"): SysMgr.andTopEnable = True @@ -30847,12 +30849,12 @@ def execTopCmd(): # kernelcall # elif SysMgr.checkMode("ktop"): - SysMgr.doTrace("kernel") - - # kernelfunctioncall # - elif SysMgr.checkMode("kftop"): SysMgr.runKernelTop() + # kernel stack # + elif SysMgr.checkMode("kstop"): + SysMgr.doTrace("kernel") + # network # elif SysMgr.checkMode("ntop"): SysMgr.networkEnable = True @@ -38391,7 +38393,7 @@ def getCmdList(): "fetop": ("File", "Linux/Android"), "ftop": ("File", "Linux/Android/MacOS"), "irqtop": ("IRQ", "Linux/Android"), - "kftop": ("Function", "Linux/Android"), + "kstop": ("Stack", "Linux/Android"), "ktop": ("Function", "Linux/Android"), "mdtop": ("Memory", "Android"), "mtop": ("Memory", "Linux/Android"), @@ -40869,6 +40871,7 @@ def _getDesc(s, t=0): - {2:1} including specific kernel functions of all threads to guider.dat # {0:1} {1:1} -s . -d c -K "evt1:func*" + # {0:1} {1:1} -s . -d c -K "evt1:func*" -q "INCDOTSYM" # {0:1} {1:1} -s . -d c -K "evt1:func1:u32, evt2:0x1234:s16, evt3:func2:x16" # {0:1} {1:1} -s . -d c -K "open:do_sys_open:dfd=%ax filename=%bx;u64 flags=%cx;s32 mode=+4(\$stack):NONE" # {0:1} {1:1} -s . -d c -K "strace32:func1:%bp/u32.%sp/s64, strace:0x1234:\$stack:NONE" @@ -41148,8 +41151,8 @@ def _getDesc(s, t=0): + examStr ) - # kernel function top # - elif SysMgr.checkMode("kftop"): + # kernel call top # + elif SysMgr.checkMode("ktop"): desc = "Monitor kernel function calls" helpStr = _getDesc(desc, t=1) @@ -41191,9 +41194,9 @@ def _getDesc(s, t=0): ) # kernel top # - elif SysMgr.checkMode("ktop"): + elif SysMgr.checkMode("kstop"): helpStr = _getDesc( - "Monitor kernel function calls for specific threads", + "Monitor kernel stacks for specific threads", t=1, ) @@ -41221,7 +41224,7 @@ def _getDesc(s, t=0): """.format( cmd, mode, - "Monitor kernel function calls", + "Monitor kernel stacks", "for specific threads", "from the specific binary", ) @@ -41506,6 +41509,7 @@ def _getDesc(s, t=0): - {2:1} including specific kernel functions # {0:1} {1:1} -f -K "evt1:func*::NONE" + # {0:1} {1:1} -f -K "evt1:func*::NONE" -q INCDOTSYM # {0:1} {1:1} -f -K "evt1:func1:u32:NONE, evt2:0x1234:s16:NONE, evt3:func2:x16:NONE" # {0:1} {1:1} -f -K "openfile:getname::NONE, access:0x1234::NONE" @@ -43348,6 +43352,9 @@ def _getDesc(s, t=0): # {0:1} {1:1} -g a.out -q ONLYUSER # {0:1} {1:1} -g a.out -q ONLYKERNEL + - {2:1} for specific processes with stacks including thread comm + # {0:1} {1:1} -g a.out -q ADDCOMMCALL + - {2:1} with time filter # {0:1} {1:1} -a -q TRIM:0:1.3 @@ -43616,8 +43623,11 @@ def _getDesc(s, t=0): myStr = ( """ - - {2:1} from compressed files - # {0:1} {1:1} guider.out.gz -q DECODE + - {2:1} from a compressed file + # {0:1} {1:1} guider.out.gz + + - {2:1} without decoding + # {0:1} {1:1} guider.out.gz -q NODECODE - {2:1} and save samples to the specific file # {0:1} {1:1} guider.out.gz -q SAVESAMPLE @@ -44465,6 +44475,7 @@ def _getDesc(s, t=0): - {2:1} including specific kernel functions # {0:1} {1:1} -K "evt1:func*" + # {0:1} {1:1} -K "evt1:func*" -q INCDOTSYM # {0:1} {1:1} -K "evt1:func1:u32, evt2:0x1234:s16, evt3:func2:x16" # {0:1} {1:1} -K "open:do_sys_open:dfd=%ax filename=%bx;u64 flags=%cx;s32 mode=+4(\$stack):NONE" # {0:1} {1:1} -K "strace32:func1:%bp/u32.%sp/s64, strace:0x1234:\$stack:NONE" @@ -49580,6 +49591,9 @@ def writeKernelCmd(applyCmd=True, cmdList=[], clear=False): if UtilMgr.isValidStr(sym, [cmd[1]]) ] + if not "INCDOTSYM" in SysMgr.environList: + symList = [sym for sym in symList if not "." in sym] + for sym in symList: newCmd = list(cmd) if realname: @@ -51062,7 +51076,7 @@ def _getPacket(fd): raise Exception() yield packet except GeneratorExit: - return None + return except SystemExit: sys.exit(0) except: @@ -54296,6 +54310,10 @@ def sendOutput2Nodes(line, force=False): start = end end += udpSeg + @staticmethod + def printStr(string): + print(string) + @staticmethod def printPipe( line="", @@ -57166,7 +57184,6 @@ def isWritable(value): @staticmethod def isTopMode(): if len(sys.argv) > 1 and sys.argv[1] in ( - "top", "andtop", "atop", "attop", @@ -57181,7 +57198,7 @@ def isTopMode(): "fetop", "ftop", "irqtop", - "kftop", + "kstop", "ktop", "mdtop", "mtop", @@ -57192,6 +57209,7 @@ def isTopMode(): "slabtop", "stacktop", "systop", + "top", "tptop", "trtop", "ttop", @@ -58030,13 +58048,15 @@ def checkBgTopCond(): tmpPath = os.path.realpath(".") # apply output dir # - if os.path.isdir(logPath) and os.access(logPath, os.W_OK): - SysMgr.outPath = logPath - elif os.path.isdir(tmpPath) and os.access(tmpPath, os.W_OK): - SysMgr.outPath = tmpPath - else: - SysMgr.printErr("failed to get path to save output, use -o option") - return False + for d in (logPath, tmpPath, None): + if d is None: + SysMgr.printErr( + "failed to get path to save output, use -o option" + ) + return False + elif os.path.isdir(d) and os.access(d, os.W_OK): + SysMgr.outPath = d + break SysMgr.printInfo("save reporting files to '%s'" % SysMgr.outPath) return True @@ -59536,7 +59556,7 @@ def _printRes(statusDict): if SysMgr.hasEnvironVar(["GETPKGLIST", "GETPROCLIST"]): printFunc = SysMgr.printPipe else: - printFunc = print + printFunc = SysMgr.printStr printFunc(UtilMgr.convDict2Str(statusDict, pretty=False)) SysMgr.addExitFunc(_printRes, [statusDict]) @@ -60704,7 +60724,7 @@ def _getLine(scripts): yield idx, line.rstrip("\n") idx += 1 except GeneratorExit: - return idx, None + return except SystemExit: sys.exit(0) except: @@ -61266,6 +61286,7 @@ def _getSym(call): hasStackFilter = targetKernel or exceptKernel taskFilter = SysMgr.environList.get("TASKFILTER", []) procGroup = "PROCGROUP" in SysMgr.environList + addCommCall = "ADDCOMMCALL" in SysMgr.environList # get time filter # try: @@ -61282,6 +61303,7 @@ def _getSym(call): ) # parse lines # + comm = None current = 0 totalCnt = 0 totalSize = 0 @@ -61312,6 +61334,18 @@ def _getSym(call): if not sample: continue + # add comm to callchain # + if addCommCall and callchain: + try: + lastcall = callchain[-1] + lastcall[1] = ("<%s>" % comm) + lastcall[1] + except SystemExit: + sys.exit(0) + except: + SysMgr.printWarn( + "failed to add comm to callchain", True, True + ) + # save previous sample # sample["backtrace"] = callchain @@ -68208,7 +68242,7 @@ def _getPage(fd): raise Exception() yield page except GeneratorExit: - return None + return except SystemExit: sys.exit(0) except: @@ -100044,7 +100078,7 @@ def getCallStatsFile(logFile, verb=False): # check backtrace stacks # onlybt = "ONLYBTSTACK" in SysMgr.environList - needDecode = "DECODE" in SysMgr.environList + needDecode = False if "NODECODE" in SysMgr.environList else True for line in fd: # check encoding type ##