SystemTap Errors Introduce
来源:互联网 发布:淘宝打印订单 编辑:程序博客网 时间:2024/06/07 15:39
SystemTap的常见错误大致可以分为两类.
一, 解析和语义阶段产生的错误
这类错误发生在systemtap解析stp脚本以及转换成C代码的阶段.
错误举例
1. 语义错误, 错误表现
parse error: expected foo, saw bar
例如, 缺失handler部分, 导致语义错误.
[root@db-172-16-3-150 share]# stap -e 'probe vfs.readprobe vfs.write'parse error: expected one of '. , ( ? ! { = +='saw: keyword at <input>:2:1source: probe vfs.write^parse error: expected one of '. , ( ? ! { = +='saw: <input> EOF2 parse errors.Pass 1: parse failed. [man error::pass1]
补充handler即可修正错误 :
[root@db-172-16-3-150 share]# stap -e 'probe vfs.read {}probe vfs.write {}'
2. 权限错误
parse error: embedded code in unprivileged script
例如, 在代码中使用了%{ embedded C code }%, 但是未使用stap -g选项会导致这个错误.
[root@db-172-16-3-150 share]# stap -e 'function square:long (i:long) %{STAP_RETVALUE = STAP_ARG_i * STAP_ARG_i;%}probe begin {i=square(9)println(i)exit()}'parse error: embedded code in unprivileged script; need stap -gsaw: embedded-code at <input>:2:31source: function square:long (i:long) %{^1 parse error.Pass 1: parse failed. [man error::pass1]
使用-g选项修正错误.
[root@db-172-16-3-150 share]# stap -g -e 'function square:long (i:long) %{STAP_RETVALUE = STAP_ARG_i * STAP_ARG_i;%}probe begin {i=square(9)println(i)exit()}'81
3. 类型匹配错误
semantic error: type mismatch for identifier 'foo' ... string vs. long
例如 :
[root@db-172-16-3-150 share]# stap -e 'probe begin {a = 10a = execname()println("a is:", a)exit()}'semantic error: type mismatch (long vs. string): identifier 'a' at <input>:3:3source: a = 10^semantic error: type was first inferred here (string): identifier 'a' at :3:3source: a = 10^Pass 2: analysis failed. [man error::pass2]
a开始=10, 是long类型, 后来又赋值execname(), 是string, 所以发生了不匹配的错误.
使用一致的类型修正即可.
[root@db-172-16-3-150 share]# stap -e 'probe begin {a = 10a = pid()println("a is:", a)exit()}'a is:23014
4. 不能推测出变量的类型时, 会报这个错误.
semantic error: unresolved type for identifier 'foo'
例如, 在printf函数中使用了一个未初始化的变量.
[root@db-172-16-3-150 share]# stap -e 'probe begin {println("v is:", v)exit()}'WARNING: never-assigned local variable 'v' : identifier 'v' at <input>:3:20source: println("v is:", v)^semantic error: unresolved type : identifier 'v' at :3:20source: println("v is:", v)^semantic error: unresolved type : identifier 'println' at :3:3source: println("v is:", v)^Pass 2: analysis failed. [man error::pass2]
变量初始化即可解决 :
[root@db-172-16-3-150 share]# stap -e 'probe begin {v = 100println("v is:", v)exit()}'v is:100
5. 当赋值对象不是一个有效的变量或数组元素时, 会报如下错误.
semantic error: Expecting symbol or array index expression.
例如 :
[root@db-172-16-3-150 share]# stap -e 'probe begin {println("hello") = 1exit()}'semantic error: Expecting symbol or array index expression: identifier 'println' at <input>:3:3source: println("hello") = 1^Pass 2: analysis failed. [man error::pass2]
6. 调用函数时, 传入的参数个数和函数参数个数不匹配.
或者是数组的索引个数不匹配时报错.
while searching for arity N function, semantic error: unresolved function call
例如 :
函数参数个数不匹配
[root@db-172-16-3-150 share]# stap -e 'function add:long (a:long, b:long) {return a+b}global arrprobe begin {println("add(10): ", add(10))exit()}'WARNING: mismatched arity-2 function found: identifier 'add' at <input>:2:10source: function add:long (a:long, b:long) {^semantic error: unresolved arity-1 function: identifier 'add' at :7:24source: println("add(10): ", add(10))^Pass 2: analysis failed. [man error::pass2]
数组索引个数不匹配
[root@db-172-16-3-150 share]# stap -e 'global arrprobe begin {arr[1,2,3]="hello"println("arr: ", arr[1,2])exit()}'semantic error: inconsistent arity (3 vs 2): identifier 'arr' at <input>:5:20source: println("arr: ", arr[1,2])^semantic error: arity 3 first inferred here: identifier 'arr' at :4:3source: arr[1,2,3]="hello"^Pass 2: analysis failed. [man error::pass2]
7. 当数组变量未定义为全局变量时报错,
semantic error: array locals not supported, missing global declaration?
例如 :
[root@db-172-16-3-150 share]# stap -e 'probe begin {arr[1,2]= "hello"exit()}'semantic error: unresolved arity-2 global array arr, missing global declaration?: identifier 'arr' at <input>:3:3source: arr[1,2]= "hello"^Pass 2: analysis failed. [man error::pass2]
8. 在foreach中, 不允许修改数组的值, 否则会报错. 这样的限制是为了提高stap 一个handler的运行速度. 减少带来的性能问题.
semantic error: variable ’foo’ modi?ed during ’foreach’ iteration
例如 :
[root@db-172-16-3-150 share]# stap -e 'global arrprobe begin {arr[1]="a"arr[2]="b"foreach(idx in arr)arr[idx]="new"exit()}'semantic error: variable 'arr' modified during 'foreach' iteration: identifier 'arr' at <input>:7:5source: arr[idx]="new"^Pass 2: analysis failed. [man error::pass2]
9. 当event不存在或者在tapset库中无法找到时, 会报如下错误
semantic error: probe point mismatch at position N, while resolving probe point foo
例如 :
[root@db-172-16-3-150 share]# stap -e 'probe test {}'semantic error: while resolving probe point: identifier 'test' at <input>:2:7source: probe test {^semantic error: probe point mismatch (alternatives: __nd_syscall __nfs __scheduler __signal __tcpmib __vm _linuxmib _nfs _signal _sunrpc _syscall _vfs begin begin(number) end end(number) error error(number) generic ioblock ioblock_trace ioscheduler ioscheduler_trace ipmib irq_handler java(number) java(string) kernel kprobe kprocess linuxmib module(string) nd_syscall netdev netfilter never nfs nfsd perf process process(number) process(string) procfs procfs(string) scheduler scsi signal socket softirq stap staprun sunrpc syscall tcp tcpmib timer tty udp vfs vm workqueue): identifier 'test' at :2:7source: probe test {^Pass 2: analysis failed. [man error::pass2]
10. 当探针中的函数不存在时, 报如下错误. 例如kernel.function("test"), test函数不存在.
semantic error: no match for probe point, while resolving probe point foo
例如 :
[root@db-172-16-3-150 share]# stap -e 'probe kernel.function("test") {}'semantic error: while resolving probe point: identifier 'kernel' at <input>:2:7source: probe kernel.function("test") {^semantic error: no match (similar functions: bs, del, dget, dput, eat)Pass 2: analysis failed. [man error::pass2]
11. 在handler中获取探针处的上下文变量(target variables)的值时, 可能由于变量值不可获取(或变量不存在等)报错 :
semantic error: unresolved target-symbol expression
例如 :
[root@db-172-16-3-150 share]# stap -e 'probe vfs.read {println($$vars)exit()}'file=0xffff8818169bc140 buf=0x7fff453edb70 count=0x2004 pos=0xffff88141aa27f48 ret=?
读取一个不存在的target variable将报错 :
[root@db-172-16-3-150 share]# stap -e 'probe vfs.read {println($abc)exit()}'semantic error: unable to find local 'abc', [man error::dwarf] dieoffset 0x125bd59 in kernel, near pc 0xffffffff81181610 in vfs_read fs/read_write.c (alternatives: $file $buf $count $pos $ret): identifier '$abc' at <input>:3:11source: println($abc)^Pass 2: analysis failed. [man error::pass2]
或者该变量的地址中无法获得相应的值.
[root@db-172-16-3-150 share]# stap -e 'probe vfs.read {println($ret)exit()}'semantic error: not accessible at this address [man error::dwarf] (0xffffffff81181610, dieoffset: 0x125bdbd): identifier '$ret' at <input>:3:11source: println($ret)^Pass 2: analysis failed. [man error::pass2]
这个错误也可能是由于代码优化导致的.
This may be a result of compiler optimization of the generated code.
12. 当安装的kernel-debuginfo包和运行的kernel版本不一致, 或者需要探针对应的包的debuginfo但是对应的debuginfo包版本不一致时可能产生如下类型的错误.
semantic error: libdw? failure
例如 :
[root@db-172-16-3-150 share]# uname -r2.6.32-358.el6.x86_64[root@db-172-16-3-150 share]# rpm -qa|grep kernel-debuginfokernel-debuginfo-2.6.32-358.23.2.el6.centos.plus.x86_64kernel-debuginfo-common-x86_64-2.6.32-358.23.2.el6.centos.plus.x86_64[root@db-172-16-3-150 share]# stap -e 'probe vfs.read {println($$vars)exit()}'semantic error: while resolving probe point: identifier 'kernel' at /opt/systemtap/share/systemtap/tapset/linux/vfs.stp:768:18source: probe vfs.read = kernel.function("vfs_read")^semantic error: missing x86_64 kernel/module debuginfo [man warning::debuginfo] under '/lib/modules/2.6.32-358.el6.x86_64/build'semantic error: while resolving probe point: identifier 'vfs' at <input>:2:7source: probe vfs.read {^semantic error: no matchPass 2: analysis failed. [man error::pass2]
安装与kernel版本对应的kernel-debuginfo包即可.
[root@db-172-16-3-150 share]# yum install -y kernel-debuginfo-2.6.32-358.el6.x86_64
或者本文第13条中的例子中如果使用了不同版本的debuginfo, 也是会报类似错误.
rpm -ivh coreutils-debuginfo.x86_64 0:8.4-19.el6_4.2[root@db-172-16-3-150 share]# rpm -qa|grep coreutilscoreutils-debuginfo-8.4-19.el6_4.2.x86_64coreutils-libs-8.4-19.el6.x86_64coreutils-8.4-19.el6.x86_64policycoreutils-2.0.83-19.30.el6.x86_64[root@db-172-16-3-150 share]# stap -d /bin/ls --ldd -e 'probe process("ls").function("xmalloc") {print_usyms(ubacktrace())}' -c "ls /"WARNING: cannot find module /bin/ls debuginfo: No DWARF information found [man warning::debuginfo]semantic error: while resolving probe point: identifier 'process' at <input>:1:7source: probe process("ls").function("xmalloc") {print_usyms(ubacktrace())}^semantic error: no matchPass 2: analysis failed. [man error::pass2]
13. 当需要探针对应的包的debuginfo时, 但是该包未安装. 会产生类似如下错误.
semantic error: cannot find foo debuginfo
例如 :
[root@db-172-16-3-150 pg93]# stap -d /bin/ls --ldd -e 'probe process("ls").function("xmalloc") {print_usyms(ubacktrace())}' -c "ls /"WARNING: cannot find module /bin/ls debuginfo: No DWARF information found [man warning::debuginfo]semantic error: while resolving probe point: identifier 'process' at <input>:1:7source: probe process("ls").function("xmalloc") {print_usyms(ubacktrace())}^semantic error: no matchPass 2: analysis failed. [man error::pass2]
安装对应的debuginfo即可解决
查找/bin/ls所在的包名
[root@db-172-16-3-150 pg93]# rpm -qf /bin/lscoreutils-8.4-19.el6.x86_64
安装coreutils对于的debuginfo包.
[root@db-172-16-3-150 pg93]# yum install -y coreutils-debuginfo-8.4-19.el6.x86_64
二, 生产模块后, 模块在内核中运行阶段产生的错误和警告.
这类错误发生在运行时, staprun通过模块与内核交互, 采集数据的阶段.
错误举例
1. 执行过程中产生了多少错误以及跳过了多少probe.
WARNING: Number of errors: N, skipped probes: M
例如
[root@db-172-16-3-150 share]# stap -e 'probe begin {error("1.error funn\n")}probe end {printf("2.end probe\n")}probe error {printf("3.error probe\n")}'ERROR: 1.error funn3.error probeWARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5]
2. 除数为0时报错
division by 0
例如
[root@db-172-16-3-150 share]# stap -e 'probe begin {println(10/0)exit()}'ERROR: division by 0 near operator '/' at <input>:3:13WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5]
3. 当统计类型变量中没有元素, 但是使用了@count, @sum以外的操作符(avg, min, max)时, 会报如下错误
aggregate element not found
例如
[root@db-172-16-3-150 share]# /usr/bin/stap -e 'global sprobe begin {println(@count(s))exit()}'WARNING: never assigned global variable 's' : identifier 's' at <input>:2:8source: global s^0[root@db-172-16-3-150 share]# /usr/bin/stap -e 'global sprobe begin {println(@sum(s))exit()}'WARNING: never assigned global variable 's' : identifier 's' at <input>:2:8source: global s^0avg, min, max报错[root@db-172-16-3-150 share]# /usr/bin/stap -e 'global sprobe begin {println(@avg(s))exit()}'WARNING: never assigned global variable 's' : identifier 's' at <input>:2:8source: global s^ERROR: empty aggregate near identifier '@avg' at <input>:4:11WARNING: Number of errors: 1, skipped probes: 0WARNING: /usr/bin/staprun exited with status: 1Pass 5: run failed. Try again with another '--vp 00001' option.[root@db-172-16-3-150 share]# /usr/bin/stap -e 'global sprobe begin {println(@min(s))exit()}'WARNING: never assigned global variable 's' : identifier 's' at <input>:2:8source: global s^ERROR: empty aggregate near identifier '@min' at <input>:4:11WARNING: Number of errors: 1, skipped probes: 0WARNING: /usr/bin/staprun exited with status: 1Pass 5: run failed. Try again with another '--vp 00001' option.[root@db-172-16-3-150 share]# /usr/bin/stap -e 'global sprobe begin {println(@max(s))exit()}'WARNING: never assigned global variable 's' : identifier 's' at <input>:2:8source: global s^ERROR: empty aggregate near identifier '@max' at <input>:4:11WARNING: Number of errors: 1, skipped probes: 0WARNING: /usr/bin/staprun exited with status: 1Pass 5: run failed. Try again with another '--vp 00001' option.
4. 数组中包含的索引个数超出数组初始化的元素个数时, 报错
aggregation overflowArray overflow
例如 :
[root@db-172-16-3-150 share]# stap -e 'global arr[10]probe timer.ms(1) {arr[gettimeofday_ms()] <<< gettimeofday_ms()}probe timer.s(1) {foreach (i in arr) {println(@count(arr[i]))}}'ERROR: Array overflow, check size limit (10) near identifier 'arr' at <input>:4:3WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5]
解决办法, 使用-D MAXMAPENTRIES=n 指定更大的元素初始值, 或者使用global arr[n] 定义更大的初始值.
5. 函数嵌套调用次数超出限制
MAXNESTING exceeded
例如
[root@db-172-16-3-150 share]# stap -e '> function fibonacci(i) {> if (i < 1) error ("bad number")> if (i == 1) return 1> if (i == 2) return 2> return fibonacci (i-1) + fibonacci (i-2)> }> probe begin {> println(fibonacci(10))> exit()> }> '89[root@db-172-16-3-150 share]# stap -e 'function fibonacci(i) {if (i < 1) error ("bad number")if (i == 1) return 1if (i == 2) return 2return fibonacci (i-1) + fibonacci (i-2)}probe begin {println(fibonacci(100))exit()}'ERROR: MAXNESTING exceeded near identifier 'fibonacci' at <input>:2:10WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5]
解决办法, 使用-D MAXNESTING=n指定更大的允许嵌套次数
6. 当handler执行的语句数超出限制时报错
MAXACTION exceeded
例如 :
[root@db-172-16-3-150 share]# stap -e '> probe begin {> for(i=0;i<10000;i++) {> }> exit()> }'ERROR: MAXACTION exceeded near keyword at <input>:3:3WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5]
解决办法, 使用-D MAXACTION=n 提高限制数.
7. 当地址不存在, 或者其他原因导致获取制定地址信息错误.
kernel/user string copy fault at ADDR
例如 :
[root@db-172-16-3-150 share]# stap -e '> probe begin {> println(user_string(123))> exit()> }'ERROR: user string copy fault -14 at 000000000000007b near identifier 'user_string_n' at /opt/systemtap/share/systemtap/tapset/uconversions.stp:120:10WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5][root@db-172-16-3-150 share]# stap -e 'probe begin {println(kernel_string(123))exit()}'ERROR: kernel string copy fault at 0x000000000000007b near identifier 'kernel_string' at /opt/systemtap/share/systemtap/tapset/linux/conversions.stp:18:10WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5][root@db-172-16-3-150 share]# stap -e 'probe begin {println(kernel_int(123))exit()}'ERROR: kernel int copy fault at 0x000000000000007b near identifier 'kernel_int' at /opt/systemtap/share/systemtap/tapset/linux/conversions.stp:198:10WARNING: Number of errors: 1, skipped probes: 0WARNING: /opt/systemtap/bin/staprun exited with status: 1Pass 5: run failed. [man error::pass5]
8. 取消引用上下文指针变量时的报错.
pointer dereference faultThere was a fault encountered during a pointer dereference operation such as a target variable evaluation.
1. https://sourceware.org/systemtap/SystemTap_Beginners_Guide/errors.html
2. https://sourceware.org/systemtap/SystemTap_Beginners_Guide/runtimeerror.html
3. https://sourceware.org/systemtap/wiki/TipExhaustedResourceErrors
0 0
- SystemTap Errors Introduce
- systemtap
- SystemTap
- SystemTap
- systemtap
- introduce
- Introduce
- introduce
- 【SystemTap】SystemTap的疑问
- Errors
- errors
- errors
- errors
- SystemTap Beginner
- SystemTap Beginner
- systemtap安装
- SystemTap Beginner
- SYSTEMTAP安装
- 图片上传-下载-删除等图片管理的若干经验总结3-单一业务场景的完整解决方案
- 再给我一次机会的话,我选择做一个安静的程序猴子--Laravel share
- Xcode7 免证书真机调试步骤分享
- 如何在El Capitan中为IntelliJ14安装Go插件
- MFC嵌入google map
- SystemTap Errors Introduce
- jQuery效果之页面窗口及jQuery插件开发
- POM.xml参考
- SQL注入(SQL Injection)
- javascript(二)对象的创建和访问
- ArcGIS教程:众数滤波 (Spatial Analyst)
- UILabel自适应内容高度总结
- 对学习编程者的忠告
- unity5.X 中的全局光照技术详解(建议收藏)