在systemtap中检查用户空间应用程序的局部变量时遇到了问题。
我写了一个像这样的test.c:
#include <stdio.h>
int func(int *p, int val)
{
printf("p=%p val=%d\n", p, val);
return 1;
}
int main()
{
int a = 7;
func(&a, a);
return 0;
}
并使用-g
# gcc -g -o test test.c
Systemtap可以看到func()
的变量:p
和val
# stap -L 'process("./test").function("func")'
process("/home/ryan/Public/test").function("func@/home/ryan/Public/test.c:3") $p:int* $val:int
所以我用这个stp来观察变量:
# stap -e 'probe process("./test").function("func") {printf("%s(%p, %d)\n", probefunc(), $p, $val)}'
但是当测试程序执行时,局部变量在结果中不正确,它显示:
func(0x0, 0)
我正在使用fedora19:
kernel-3.11.9-200.fc19.x86_64
systemtap-sdt-devel-2.3-1.fc19.x86_64
systemtap-2.3-1.fc19.x86_64
systemtap-client-2.3-1.fc19.x86_64
systemtap-devel-2.3-1.fc19.x86_64
systemtap-runtime-2.3-1.fc19.x86_64
gcc-4.8.2-7.fc19.x86_64
有人可以解决这个问题或给我一个解决方案吗?
答案 0 :(得分:4)
.function probe定义为在函数入口处触发。如果要查找局部变量的值,则需要使用.statement探测器,标识源文件:line-number。但在这种情况下,您正在寻找函数的参数(恰好基于另一个函数的本地函数)。在这种情况下,.function探测是合适的。
您似乎遇到了GCC错误。在普通的-g模式(具有讽刺意味)中,矮调试信息有时对于传入的函数参数是不准确的。请尝试使用“gcc -g -O”或“gcc -g -O2”。 Systemtap序言搜索(stap -P)可能有所帮助。另请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51358,https://sourceware.org/bugzilla/show_bug.cgi?id=13420
如果“stap -P”无效,您可能需要在所有情况下采用语句级探测:
probe process("./test").statement("func@test.c:5") { println($$parms) }
(第5行:指printf)