demo diffpstack

pull/3/head
q191201771 4 years ago
parent 254171716b
commit ca71a3107f

@ -0,0 +1,133 @@
package main
import (
"fmt"
"io/ioutil"
"strconv"
"strings"
"github.com/q191201771/naza/pkg/nazalog"
)
// 分析c++程序pstack的两次结果的差异
type PstackInfo struct {
tis []ThreadInfo
tim map[string]ThreadInfo
}
type ThreadInfo struct {
Num int
P string
Id int
RawLine string
RawStackLines string
}
func NewPstackInfo(filename string) PstackInfo {
var tis []ThreadInfo
contents, err := ioutil.ReadFile(filename)
nazalog.Assert(nil, err)
content := string(contents)
lines := strings.Split(content, "\n")
//nazalog.Debugf("len(lines)=%d", len(lines))
var ti *ThreadInfo
for _, line := range lines {
if strings.HasPrefix(line, "Thread") {
if ti != nil {
tis = append(tis, *ti)
}
ti = &ThreadInfo{}
//nazalog.Debugf("%s", line)
ti.RawLine = line
ti.Num, ti.P, ti.Id, err = parseThreadLine(line)
nazalog.Assert(nil, err)
continue
}
ti.RawStackLines += line + "\n"
}
if ti != nil {
tis = append(tis, *ti)
}
nazalog.Debugf("len(tis)=%d", len(tis))
tim := make(map[string]ThreadInfo)
for _, ti := range tis {
tim[ti.Uk()] = ti
}
return PstackInfo{
tis: tis,
tim: tim,
}
}
func (pi *PstackInfo) Find(uk string) (ThreadInfo, bool) {
ti, exist := pi.tim[uk]
return ti, exist
}
func (ti *ThreadInfo) Uk() string {
return fmt.Sprintf("%s_%d", ti.P, ti.Id)
}
func parseThreadLine(line string) (num int, p string, id int, err error) {
p1 := strings.Index(line, "Thread")
p2 := strings.Index(line, "(Thread")
num, err = strconv.Atoi(line[p1+7 : p2-1])
if err != nil {
return
}
p3 := strings.Index(line, "(LWP")
p = line[p2+8 : p3-1]
p4 := strings.Index(line, "))")
id, err = strconv.Atoi(line[p3+5 : p4-1])
return
}
func main() {
_ = nazalog.Init(func(option *nazalog.Option) {
option.LevelFlag = false
option.ShortFileFlag = false
option.TimestampFlag = false
})
pi1 := NewPstackInfo("old.txt")
pi2 := NewPstackInfo("new.txt")
for _, ti2 := range pi2.tis {
var pre, suf string
suf = "\033[0m"
ti1, exist := pi1.Find(ti2.Uk())
if exist {
if ti2.RawStackLines == ti1.RawStackLines {
// 1, 2都有但是堆栈没变 没色
pre = ""
suf = ""
nazalog.Debugf("%s-------------------------------------------------------------------------%s", pre, suf)
nazalog.Debugf("%s%s%s", pre, ti2.RawLine, suf)
nazalog.Debugf("%s%s%s", pre, ti2.RawStackLines, suf)
} else {
// 1, 2都有但是堆栈变化 红色
// 注意,断站有变化也可能是函数参数变化了
pre = "\033[22;31m"
nazalog.Debugf("%s-------------------------------------------------------------------------%s", pre, suf)
nazalog.Debugf("%s%s%s", pre, ti2.RawLine, suf)
nazalog.Debugf("%s%s%s", pre, ti2.RawStackLines, suf)
}
} else {
// 只在2有 绿色
pre = "\033[22;36m"
nazalog.Debugf("%s-------------------------------------------------------------------------%s", pre, suf)
nazalog.Debugf("%s%s%s", pre, ti2.RawLine, suf)
nazalog.Debugf("%s%s%s", pre, ti2.RawStackLines, suf)
}
}
}

@ -33,11 +33,11 @@ const (
levelFatalString = "FATAL "
levelPanicString = "PANIC "
levelTraceColorString = "\033[22;32mTRACE\033[0m "
levelDebugColorString = "\033[22;34mDEBUG\033[0m "
levelInfoColorString = "\033[22;36m INFO\033[0m "
levelWarnColorString = "\033[22;33m WARN\033[0m "
levelErrorColorString = "\033[22;31mERROR\033[0m "
levelTraceColorString = "\033[22;32mTRACE\033[0m " // 浅绿,亮绿
levelDebugColorString = "\033[22;34mDEBUG\033[0m " // 深蓝
levelInfoColorString = "\033[22;36m INFO\033[0m " // 暗绿,青
levelWarnColorString = "\033[22;33m WARN\033[0m " // 黄
levelErrorColorString = "\033[22;31mERROR\033[0m " // 红
levelFatalColorString = "\033[22;31mFATAL\033[0m " // 颜色和 error 级别一样
levelPanicColorString = "\033[22;31mPANIC\033[0m " // 颜色和 error 级别一样
)

Loading…
Cancel
Save