pykd

Форк
0
/
stkdelta.py 
103 строки · 3.1 Кб
1

2
from pykd import *
3
import sys
4

5
def printThreadInfo():
6

7
    nt = module("nt")
8
    
9
    thread = nt.typedVar( "_KTHREAD", getCurrentThread() )
10
    
11
    stackPointer = addr64( reg("rsp") if is64bitSystem() else reg("esp") )
12
    
13
    dprintln("")
14

15
    if stackPointer >= addr64(thread.StackLimit):
16
        dprintln( "Stack Base: %x Limit: %x Current: %x Used: %x Unused: %x" % 
17
             ( thread.InitialStack, thread.StackLimit, stackPointer, addr64(thread.InitialStack) - stackPointer, stackPointer - addr64(thread.StackLimit) ) )
18
    else:
19
        dprintln( "Stack Base: %x Limit: %x Current: %x Used: %x !!!Overflow!!!: %x" % 
20
             ( thread.InitialStack, thread.StackLimit, stackPointer, addr64(thread.InitialStack) - stackPointer, addr64(thread.StackLimit) - stackPointer ) )
21
        
22

23
def printDeltaStat():
24

25
    dprintln("")
26

27
    printThreadInfo()
28
    
29
    stk = getStack() 
30
    
31
    moduleLst = {}
32
    funcLst = {}
33
    
34
    for i in range( 0, len(stk) -1 ):
35
    
36
        try:
37
            mod = module( stk[i].ret )
38
        except BaseException:
39
            continue    
40
  
41
        delta = stk[i+1].fp - stk[i].fp
42
        if delta > 0:
43
       
44
            moduleName = mod.name()
45
       
46
            if moduleName in moduleLst:
47
                moduleLst[moduleName] = moduleLst[moduleName] + delta
48
            else:
49
                moduleLst[moduleName] = delta
50
                
51
            func = moduleName + "!" + mod.findSymbol( stk[i].ret, showDisplacement = False )
52

53
            if func in funcLst:
54
                funcLst[func] = funcLst[func] + delta
55
            else:
56
                funcLst[func] = delta    
57
                
58
    nt = module("nt")
59
    
60
    thread = nt.typedVar( "_KTHREAD", getThreadOffset( getCurrentThread() ) )
61
                
62
    stackSize = thread.InitialStack - thread.StackLimit
63
                
64
    dprintln("")
65
    dprintln( "%12s\t%s" % ("Stack usage:", "Module:" ) )
66
    dprintln( "="*30 )
67
    
68
    for mod,delta in sorted( moduleLst.iteritems(), key=lambda x: x[1], reverse=True ):
69
       dprintln( "%7d%5s\t%s" % (delta, "(%%%d)" % (delta*100/stackSize), mod ) )
70
   
71
    dprintln("")
72
    dprintln( "%12s\t%s" % ("Stack usage:", "Function" ) )
73
    dprintln( "="*30 )    
74
    
75
    for func,delta in sorted( funcLst.iteritems(), key=lambda x: x[1], reverse=True ):
76
       dprintln( "%7d%5s\t%s" % (delta, "(%%%d)" % (delta*100/stackSize), func ) )       
77

78
def printDeltaStack():
79
    
80
    printThreadInfo()
81

82
    stk = getStack()        
83
    
84
    dprintln( "Stack Delta:\tFunction:")
85
    
86
    for i in range( 0, len(stk) -1 ):
87
        dprint( "%12s\t" % long( stk[i+1].fp - stk[i].fp) )
88
        try:
89
            mod = module( stk[i].ret )
90
            dprintln( "%s!%s"% ( mod.name(), mod.findSymbol( stk[i].ret, showDisplacement = False ) ) )
91
        except BaseException:
92
            dprintln( findSymbol( stk[i].ret ) )        
93

94
def main():
95

96
    if len(sys.argv) > 1:
97
        if sys.argv[1] == "stat":
98
            printDeltaStat()
99
            return       
100

101
    printDeltaStack()
102
                    
103
if __name__ == "__main__":
104
    main()
105

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.