Skip to content

Commit

Permalink
Merge pull request #1 from alliaoaoo/master
Browse files Browse the repository at this point in the history
添加OpenglServer和SysmontapServer分别获取GPU/FPS/CPU/MEM相关数据
  • Loading branch information
aoliaoaoaojiao authored Jun 20, 2022
2 parents cfbfd75 + 68a751d commit 7a12b09
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 0 deletions.
4 changes: 4 additions & 0 deletions idevice.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ type Instruments interface {
// SysMonStart(cfg ...interface{}) (_ interface{}, err error)

registerCallback(obj string, cb func(m libimobiledevice.DTXMessageResult))

OpenglServer() (out <-chan interface{}, cancel context.CancelFunc, err error)

SysmontapServer() (out <-chan interface{}, cancel context.CancelFunc, err error)
}

type Testmanagerd interface {
Expand Down
117 changes: 117 additions & 0 deletions instruments.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package giDevice

import (
"context"
"encoding/json"
"fmt"
"github.com/electricbubble/gidevice/pkg/libimobiledevice"
Expand Down Expand Up @@ -257,6 +258,122 @@ func (i *instruments) registerCallback(obj string, cb func(m libimobiledevice.DT
i.client.RegisterCallback(obj, cb)
}

func (i *instruments) SysmontapServer() (out <-chan interface{}, cancel context.CancelFunc, err error) {
var id uint32
_, cancelFunc := context.WithCancel(context.TODO())
_out := make(chan interface{})
if id, err = i.requestChannel("com.apple.instruments.server.services.sysmontap"); err != nil {
return _out, cancelFunc, err
}

selector := "setConfig:"
args := libimobiledevice.NewAuxBuffer()

var config map[string]interface{}
config = make(map[string]interface{})
{
config["bm"] = 0
config["cpuUsage"] = true
// 输出所有进程信息字段,字段顺序与自定义相同(全量自字段,按需使用)
//config["procAttrs"] = []string{
// "memVirtualSize", "cpuUsage", "procStatus", "appSleep",
// "uid", "vmPageIns", "memRShrd", "ctxSwitch", "memCompressed",
// "intWakeups", "cpuTotalSystem", "responsiblePID", "physFootprint",
// "cpuTotalUser", "sysCallsUnix", "memResidentSize", "sysCallsMach",
// "memPurgeable", "diskBytesRead", "machPortCount", "__suddenTerm", "__arch",
// "memRPrvt", "msgSent", "ppid", "threadCount", "memAnon", "diskBytesWritten",
// "pgid", "faults", "msgRecv", "__restricted", "pid", "__sandbox"}

config["procAttrs"] = []string{
"memVirtualSize", "cpuUsage", "ctxSwitch", "intWakeups",
"physFootprint", "memResidentSize", "memAnon", "pid"}

config["sampleInterval"] = 1000000000
// 系统信息字段
config["sysAttrs"] = []string{
"vmExtPageCount", "vmFreeCount", "vmPurgeableCount",
"vmSpeculativeCount", "physMemSize"}
// 刷新频率
config["ur"] = 1000
}

args.AppendObject(config)
if _, err = i.client.Invoke(selector, args, id, true); err != nil {
return _out, cancelFunc, err
}
ctx, cancelFunc := context.WithCancel(context.TODO())
selector = "start"
args = libimobiledevice.NewAuxBuffer()

if _, err = i.client.Invoke(selector, args, id, true); err != nil {
return _out, cancelFunc, err
}

i.registerCallback("", func(m libimobiledevice.DTXMessageResult) {
_out <- m.Obj
})

go func() {
i.registerCallback("_Golang-iDevice_Over", func(_ libimobiledevice.DTXMessageResult) {
cancelFunc()
})

<-ctx.Done()
// time.Sleep(time.Second)
close(_out)
return
}()
return _out, cancelFunc, err
}

func (i *instruments) OpenglServer() (out <-chan interface{}, cancel context.CancelFunc, err error) {
var id uint32
ctx, cancelFunc := context.WithCancel(context.TODO())
_out := make(chan interface{})
if id, err = i.requestChannel("com.apple.instruments.server.services.graphics.opengl"); err != nil {
return _out, cancelFunc, err
}

selector := "availableStatistics"
args := libimobiledevice.NewAuxBuffer()

if _, err = i.client.Invoke(selector, args, id, true); err != nil {
return _out, cancelFunc, err
}

selector = "setSamplingRate:"
if err = args.AppendObject(10); err != nil {
return _out, cancelFunc, err
}
if _, err = i.client.Invoke(selector, args, id, true); err != nil {
return _out, cancelFunc, err
}

selector = "startSamplingAtTimeInterval:"
args = libimobiledevice.NewAuxBuffer()
if err = args.AppendObject(0); err != nil {
return _out, cancelFunc, err
}
if _, err = i.client.Invoke(selector, args, id, true); err != nil {
return _out, cancelFunc, err
}

i.registerCallback("", func(m libimobiledevice.DTXMessageResult) {
_out <- m.Obj
})
go func() {
i.registerCallback("_Golang-iDevice_Over", func(_ libimobiledevice.DTXMessageResult) {
cancelFunc()
})

<-ctx.Done()
// time.Sleep(time.Second)
close(_out)
return
}()
return _out, cancelFunc, err
}

type Application struct {
AppExtensionUUIDs []string `json:"AppExtensionUUIDs,omitempty"`
BundlePath string `json:"BundlePath"`
Expand Down

0 comments on commit 7a12b09

Please sign in to comment.