首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dtrace中的局部变量

Dtrace中的局部变量
EN

Stack Overflow用户
提问于 2017-03-28 10:04:31
回答 1查看 698关注 0票数 3

如何使用dtrace访问函数的本地变量?

例如,在下面的片段中,我想知道使用dtrace变量x的值。

代码语言:javascript
复制
void foo(int a){
     int x=some_fun(a);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-28 12:53:45

对于内核代码来说,跟踪局部变量是不可能的,因为没有检测任意内核指令的机制。即使在用户土地上,跟踪局部变量也有点复杂,因此,对于您所给出的具体示例来说,跟踪some_fun()的返回值更有意义。

如果必须跟踪任意局部变量,则需要确定其位置(通常是寄存器或内存中的位置)。对于简单的情况,您可以通过分解函数和检查输出来做到这一点。对于更复杂的情况,使用DIE构建对象,然后找到局部变量模具的DW_AT_location属性可能会有所帮助。

找到变量的位置时,需要用D表示;注意,寄存器是通过uregs[]数组公开的。此外,您需要使用函数中的偏移量来描述您的探测,因为dtrace(1)无法理解行号。有关更多信息,请参见Oracle Solaris动态跟踪指南中的“用户进程跟踪”一节。

作为一个例子,我编写了一个琐碎的程序

代码语言:javascript
复制
int
foo(int i)
{
    int x;
    ...
    for (x = 0; x < 10; x++)
        i += 2;

并以amd64可执行文件的形式,用侏儒.

代码语言:javascript
复制
cc -m64 -g -o demo demo.c

...before寻找foo()及其在dwarfdump demo输出中的x定义

代码语言:javascript
复制
< 1><0x000000e4>    DW_TAG_subprogram
                    DW_AT_name                  "foo"
                    ...
                    DW_AT_frame_base            DW_OP_reg6



< 2><0x00000121>      DW_TAG_variable
                      DW_AT_name                  "x"
                      ... 
                      DW_AT_location              DW_OP_fbreg -24

x被描述为DW_OP_fbreg -24,但是DW_OP_fbreg本身必须被父函数的DW_AT_frame_base属性(即DW_OP_reg6 )的结果所替代。侏儒使用它自己的架构--不可知的寄存器编号,到单个寄存器的映射符合适当的标准机构。在这种情况下,AMD64 ABI告诉我们矮人寄存器6对应于%rbp。因此,x存储在%rbp - 0x18中。(想了解更多关于侏儒本身的信息,我推荐迈克尔·埃奇的矮小调试格式简介。)

因此,如果您发现您感兴趣的源行位于偏移量0x32 (可能通过检查矮线表),那么您可以编写如下所示的探针:

代码语言:javascript
复制
pid$target:a.out:foo:32
{
    self->up = (uintptr_t)(uregs[R_RBP] - 0x18);
    self->kp = (int *)copyin(self->up, sizeof (int));
    printf("x = %d\n", *self->kp);
    self->up = 0;
    self->kp = 0;
}

这就是我在运行演示程序时所看到的:

代码语言:javascript
复制
# dtrace -q -s test.d -c /tmp/demo 
x = 1
x = 2
x = 3
x = 4
x = 5
x = 6
x = 7
x = 8
x = 9
x = 10

#
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43066579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档