如何在systemtap中检查用户空间函数的变量?

Jin*_*iao 5 gcc dwarf systemtap

在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;
}
Run Code Online (Sandbox Code Playgroud)

并用它编译 -g

# gcc -g -o test test.c
Run Code Online (Sandbox Code Playgroud)

Systemtap可以看到变量func():pval

# stap -L 'process("./test").function("func")'
process("/home/ryan/Public/test").function("func@/home/ryan/Public/test.c:3") $p:int* $val:int
Run Code Online (Sandbox Code Playgroud)

所以我使用这个stp来观察变量:

# stap -e 'probe process("./test").function("func") {printf("%s(%p, %d)\n", probefunc(), $p, $val)}'
Run Code Online (Sandbox Code Playgroud)

但是当测试程序执行时,局部变量在结果中是不正确的,它显示:

func(0x0, 0)
Run Code Online (Sandbox Code Playgroud)

我正在使用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
Run Code Online (Sandbox Code Playgroud)

有人可以解决这个问题或给我一个解决方案吗?

fch*_*che 4

.function 探针被定义为在函数入口处触发。如果您正在查找局部变量的值,则需要使用 .statement 探针来识别源文件:行号。但在这种情况下,您正在寻找函数的参数(它恰好基于另一个函数的局部变量)。在这种情况下,.function 探针是合适的。

您似乎遇到了 GCC 错误。在普通 -g 模式下(讽刺的是),dwarf debuginfo 有时对于传入的函数参数不准确。请尝试“gcc -g -O”或“gcc -g -O2”。Systemtap 序言搜索(stap -P)可能会有所帮助。另请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51358https://sourceware.org/bugzilla/show_bug.cgi?id=13420

如果“stap -P”没有帮助,您可能最终需要诉诸语句级探测:

probe process("./test").statement("func@test.c:5") { println($$parms) }
Run Code Online (Sandbox Code Playgroud)

(第 5 行指 printf)