Dtrace 中的局部变量

2024-04-14

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

例如,在下面的代码片段中,我想使用 dtrace 了解变量 x 的值。

void foo(int a){
     int x=some_fun(a);
}

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

如果必须跟踪任意局部变量,那么您将需要确定其在特定感兴趣点的位置(通常是寄存器或内存中的位置)。对于简单的情况,您可以通过反汇编函数并检查输出来完成此操作。对于更复杂的情况,使用 DWARF 构建对象然后找到DW_AT_location局部变量 DIE 的属性。

找到变量的位置后,需要用 D 来表达它;请注意,寄存器是通过公开的uregs[]大批。此外,您需要使用函数内的偏移量来描述探针,因为dtrace(1)无法理解行号。请参阅《用户进程跟踪》中的“用户进程跟踪”部分Oracle Solaris 动态 追踪指南 https://docs.oracle.com/cd/E53394_01/html/E53395/index.html了解更多。

作为一个例子,我写了一个简单的程序,其中包含

int
foo(int i)
{
    int x;
    ...
    for (x = 0; x < 10; x++)
        i += 2;

并使用 DWARF 将其构建为 amd64 可执行文件...

cc -m64 -g -o demo demo.c

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

< 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 but DW_OP_fbreg其本身一定是 替换为父函数的结果DW_AT_frame_base属性,即DW_OP_reg6。 DWARF 使用自己的与架构无关的 寄存器的编号以及到各个寄存器的映射最多可达 适当的标准机构。在这种情况下,AMD64 ABI https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf告诉 DWARF 寄存器 6 对应于我们%rbp. Thus x存储在%rbp - 0x18。 (有关 DWARF 本身的更多信息,我推荐 Michael Eager 的DWARF 调试格式简介 http://dwarfstd.org/doc/Debugging%20using%20DWARF-2012.pdf.)

因此,如果您发现您所在的源代码行 感兴趣的是偏移量 0x32(也许通过检查 DWARF 行表),那么你可以编写一个如下的探针:

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;
}

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

# 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

#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dtrace 中的局部变量 的相关文章

随机推荐

  • 如何格式化 JSON 日期?

    所以 我需要这种格式的 JSON 日期格式 9 30 2010 12 00 00 AM 是月 日 年 时 分 秒像这样格式化 日 月 年 所以我不需要有关小时 分钟和秒的信息 并且我需要从 json 替换月份和日期 我尝试了一些不同的方法
  • Xcode 6.1:发现多个名为“count”的方法,其结果、参数类型或属性不匹配

    我越来越构建应用程序时发现多个名为 count 的方法结果 参数类型或属性错误不匹配 该应用程序在 32 位中运行良好 我已将其更改为 64 位苹果指南 https developer apple com news id 12172014b
  • 如何在couchdb中实现复杂的搜索过滤器?我应该避免暂时的观点吗?

    我想在网格中管理我的用户实体 我想对它们进行排序 并且我想为每一列都有一个搜索过滤器 我的动态生成的临时视图工作正常 function doc if doc type User Dynamic filters WHERE firstName
  • 无法进入由汇总插件替换定义的对象

    在 Svelte 组件中 我尝试访问我在汇总配置文件中设置的对象 我的rollup config js文件看起来像这样 import replace from rollup plugin replace export default rep
  • ASP.NET MVC3 Razor 模型内部查询(foreach 内 foreach)

    我在视图中遇到从不同实体提取数据的问题 基本上我有一个桥接实体 CategoryProduct 将类别和产品数据汇集在一起 我想要最终显示的是产品列表以及每个产品的类别 然而 我完全不知道如何实现最后一部分 显示类别 发生 这是我的模型的代
  • Spring 会话范围的 bean 作为原型 bean 中的依赖项?

    我多次阅读了有关这个主题的 spring 文档 但有些事情我仍然不清楚 文件指出 例如 如果要将 HTTP 请求作用域 bean 注入到另一个 bean 中 则必须注入 AOP 代理来代替该作用域 bean 也就是说 您需要注入一个代理对象
  • Perl IPC::Run3:如何为子进程模拟标准输入的 pty?

    这是一个后续问题IPC Open3 并确定子进程是否正在等待输入 https stackoverflow com questions 41454627 ipcopen3 and determining if child is waiting
  • D3 JS - Force Graph - 删除节点后不重新启动布局

    更新 现在 删除节点后图表可以正常运行 但是 当我有条件地删除非顺序节点 例如 4 5 10 时 图表不会显示正确的节点 请查看下面更新的点击处理程序 大量调试 我试图删除所有具有 d source 值 news24 的节点 它们都是大的蓝
  • 由于 poppler 无法在 Windows 上安装 pdftotext

    我正在尝试在 Windows 上安装 pdftotext pip install pdftotext 它最初失败是因为缺少 MS Visual Studio 现已安装 现在它因 poppler 问题而失败 我已经下载了 poppler 并安
  • Objective-C 中带有扫描过滤器的 dynamodb scanexpression

    AWSDynamoDBObjectMapper dynamoDBObjectMapper AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper AWSDynamoDBScanExpressi
  • 更新属性包装器(如 @StateObject)会影响不使用该属性的其他视图渲染

    当使用与视图更新关联的不同属性包装器时 一处的更改会影响不使用该属性的视图的呈现 struct ContentView View StateObject var viewModel MyViewModel State var thirdTi
  • PHP比较相等、空字符串、“0”和0

    我了解到 空字符串 0和 0 在php中都表示错误 我想知道 php 在比较相等性时是否考虑到这一点 str echo str 0 yes no prints no A echo str 0 yes no prints yes B A 行表
  • 如何在java中转换wav文件

    如何在java中转换wav文件 AudioFormat targetFormat new AudioFormat sourceFormat getEncoding fTargetFrameRate 16 sourceFormat getCh
  • 实体“HTML.Version”的声明必须以“>”结尾

    我是 XML 解析和 DTD 的新手 我试图创建一个简单的 SpringBean 程序并使用 Spring xml 实例化一个类 Triangle java 我的 DrawingApp java 如下所示 import org spring
  • .NET 中的防篡改配置文件?

    我们提供带有关联配置文件的 NET 应用程序 我们的顾问在安装过程中创建配置文件 我们希望让客户端很难篡改配置文件 我们有哪些途径 目前 我正在考虑使用我们的私钥对配置文件进行签名 并在应用程序启动时根据公钥对其进行验证 然后我将公钥隐藏在
  • 让 HTML5 视频适合父元素大小

    我在 中有一个 元素 当页面上的其他元素动态调整 添加 删除时 该元素会自动调整大小 我希望视频元素也能自动调整大小 以便它始终包含在其背景 div 中 如果我将视频元素的 CSS 高度和宽度设置为 100 这种方法就有效 因此它的大小始终
  • 具有动态排序依据的 LINQ 查询

    我有一个查询 我需要基于查询字符串参数进行排序 例如 如果排序参数是价格 则查询需要随价格更改 如果其评级则更改查询以按评级排序 我知道 PredicateBuilder 可以执行 And 和 OR 操作 但是如何进行动态 ordeby l
  • 创建新对话框时出现 NullPointerException

    我有一个 DialogFragment 它创建一个列表视图对话框 并在列表项上单击 我想显示一个警报对话框 但是当我创建该对话框时 它给了我一个NullPointerException出现我以前从未见过的错误 08 05 11 40 42
  • F# 的 timeit 函数

    我想写一些类似的东西 let timeit x a gt b let start System DateTime Now x let duration System DateTime Now start printfn time usage
  • Dtrace 中的局部变量

    如何使用 dtrace 访问函数的本地变量 例如 在下面的代码片段中 我想使用 dtrace 了解变量 x 的值 void foo int a int x some fun a 对于内核代码来说 跟踪局部变量是不可能的 因为没有检测任意内核