Releases: SeeFlowerX/stackplz
stackplz_v2.0.7
相关改动与更新:
- 更灵活的数据获取能力(详见readme),命令示例:
./stackplz --name com.sfx.ebpf -w write[int,buf:x2,int]
./stackplz --name com.sfx.ebpf -w write[int,buf:32,int]
./stackplz --name com.sfx.ebpf -w write[int,buf:0x10,int]
./stackplz --name com.sfx.ebpf -w 0xA94E8[int:x1,ptr:sp+0x30-0x2c]
./stackplz --name com.sfx.ebpf -w 0xA94E8[int:x1,buf:8:sp+0x30-0x2c]
- sys_exit不打印堆栈
- 解析一些常见的FLAG,增强可读性
- 部分常见int参数转换,增强可读性
- 支持了进程类型分组追踪、批量追踪(详见readme)
./stackplz -n app --no-uid 10084 --point open[str,int] -o tmp.log
./stackplz -n com.starbucks.cn,iso --syscall openat -o tmp.log
- 支持了syscall分组追踪、批量追踪(详见readme)
./stackplz -n com.xingin.xhs -s %file,%net --no-syscall openat,recvfrom
- 一些bug修复,优化改进
部分命令命名进行了变更,请查看帮助;使用此版本,请至少执行一次./stackplz --prepare
stackplz_v2.0.6
- 改进了maps获取逻辑,现在--stack基本都可以解析到详细的堆栈
- 有一种特殊情况无法解析堆栈,例如程序在正常退出后,内核主动调用的exit
- 实现了
--stack-size
选项,可以自行指定要dump的堆栈数据大小 - 实现了
--iso
选项,即支持追踪isolated进程 - 实现了
--brk
选项,即支持硬件断点功能,同样可以大于调用栈;同时支持--brk-lib
指定动态库 - 实现了
--kill
选项,即支持在命中hook点时发送信号 - 原有的
--library
选项变更为--lib
- 其他优化改进,更新了README
相关新增功能命令示意:
./stackplz -n com.sfx.ebpf --lib libnative-lib.so -w _Z5func1v --stack --stack-size 10240
./stackplz -n com.sfx.ebpf --lib libnative-lib.so -w _Z5func1v --stack --kill SIGSTOP
./stackplz -p 9613 --brk 0x70ddfd63f0:x --stack
./stackplz -p 3102 --brk 0xf3a4:x --brk-lib libnative-lib.so --stack
./stackplz -n com.starbucks.cn --syscall execve,execveat --stack --iso
./stackplz -n com.starbucks.cn --syscall exit --kill SIGSTOP --stack
你好,不可以exit
./stackplz -n com.starbucks.cn --syscall exit --kill SIGSTOP --stack
小贴士:SIGSTOP之后可以用调试器附加到进程哟
坏消息: 在exit syscall发送SIGSTOP无法阻止原线程的退出 :(
好消息: 可以在用户态syscall调用的地方下断然后发送信号,就不怕了~~~
把调试器附加上去看看效果:
stackplz_v2.0.5
一点小bug修复和无用代码去除,减小了产物体积
stackplz_v2.0.4
bug修复,syscall支持--stack
选项
目前对于临时产生的子进程,--stack
还无法正常工作,后续优化
stackplz_v2.0.3
- 修复了一直被困扰的PERF_SAMPLE_RAW末尾padding导致的bug
- 采用了新的调用方式做unwind解析,后续用户可自行选择要解析的堆栈多少
- 【!!!】使用本版本,必须执行一次
./stackplz --prepare
目前新版stackplz已经进入了相对稳定的版本,接下来是各类细节上的优化和改进 ^_^
stackplz_v2.0.2
- 使用内置log,支持
--quiet
- 修复数据读取的bug
stackplz_v2.0.1
- 指定
--getoff
解析lr
和pc
偏移,废弃--getpc
和--getlr
- 支持追踪fork产生的子进程了
- 减少堆栈数据大小为8192字节
--syscall
可简写为-s
--point
可简写为-w
测试如下,输出在一行,放大图片看清晰点...
./stackplz -n com.starbucks.cn --syscall openat --getoff -o tmp.log --no-tnames mount,sh,getprop
./stackplz -n com.starbucks.cn -w __openat[int,str] --getoff -o tmp.log --no-tnames mount,sh,getprop --stack
stackplz_v2.0.0
虽然还没有完全完工,但是可以到发正式版的程度了。
内核版本要求:5.10+
示例命令:
- ./stackplz -n com.starbucks.cn --point strstr[str,str] --point open[str,int] -o tmp.log
- ./stackplz -n com.starbucks.cn --syscall connect,sendto,recvfrom -o tmp.log --dumphex
- ./stackplz -n com.xingin.xhs --point pthread_create[int,int,int,int] -o tmp.log --stack --tnames oaid
- ./stackplz --name io.github.vvb2060.mahoshojo --syscall all -o momo.log
- ./stackplz --uid 2000 --syscall getcwd -o tmp.log
其他功能还有:
- 线程号/进程号黑名单
- 线程名黑/白名单
- ...
具体--help
看下信息
Usage:
stackplz [flags]
Flags:
-b, --buffer uint32 perf cache buffer size, default 8M (default 8)
-c, --color enable color for log file
-d, --debug enable debug logging
--dumphex dump buffer as hex
--getlr try get lr info
--getpc try get pc info
-h, --help help for stackplz
-l, --library string full lib path (default "/apex/com.android.runtime/lib64/bionic/libc.so")
-n, --name string must set uid or package name
--no-pids string pid black list, max 20
--no-syscall string syscall black list, max 20
--no-tids string tid black list, max 20
--no-tnames string thread name black list, max 20
-o, --out string save the log to file (default "stackplz_tmp.log")
-p, --pid uint32 add pid to filter (default 1802529914)
--point stringArray hook point config, e.g. strstr+0x0[str,str] write[int,hex:128,int]
--prepare prepare libs
-q, --quiet wont logging to terminal when used
--reg string get the offset of reg
--regs show regs
--stack enable unwindstack
--syscall string filter syscalls
-t, --tid uint32 add tid to filter (default 1633905520)
--tnames string thread name white list, max 20
-u, --uid uint32 must set uid or package name (default 1937006947)
stackplz_v2.0.0_beta9
- 支持了线程名黑名单,
--no-tnames
- 数据解析的多种优化
- 支持了指针+结构体这样的参数解析,不过这需要慢慢适配
- 支持了参数和堆栈同时工作,可配合线程名黑名单使用,后续加入线程名白名单功能
stackplz_v2.0.0_beta8
beta8发布!
- 恢复了常规的uprobe hook,包括调用栈信息获取(暂时和获取参数冲突,稍后解决)
- uprobe hook支持了参数输出,hex打印,并且支持了批量hook
- 将buffer类数据最大获取长度增加到4096字节
- dev分支的readme也更新了,请查看
./stackplz -n com.starbucks.cn --point strstr[str,str] --point open[str,int] -o tmp.log
./stackplz -n com.starbucks.cn --syscall connect,sendto,recvfrom -o tmp.log --dumphex
即将更新的功能:
- 对单个进程的子进程一并加入追踪
- 更合理的堆栈信息获取