如何在 DTrace 操作中打印 CFStringRef?

2023-12-22

我有一个 DTrace 探针捕获对函数的调用,该函数的参数之一是CFStringRef。这是保存指向 unicode 字符串的指针的私有结构。但是CFStringRef本身不是一个char*,所以普通的 DTrace 方法如copyinstr()就回来?cp?,这并不完全有帮助。

那么如何打印 DTrace 操作中的字符串呢?


据我所知,没有内置支持这种事情。通常,图书馆会发布一个探针来为您解码字符串(正如 Brad 提到的)。因此,由于在您的情况下您无法修改库,因此您需要使用pid提供者并挂钩到用户函数中,然后自己对其进行解码。

解决方案(与您在 C++ 中使用的转储 a 的方法非常相似)std::string) 是转储存储在距基址 2 个字偏移处的指针CFStringRef指针。请注意,自从CFString可以以各种格式和表示形式在内部存储字符串,这可能会发生变化。

考虑到简单的测试应用程序:

#include <CoreFoundation/CoreFoundation.h>

int mungeString(CFStringRef someString)
{
    const char* str = CFStringGetCStringPtr(someString, kCFStringEncodingMacRoman);
    if (str)
        return strlen(str);
    else
        return 0;
}

int main(int argc, char* argv[])
{
    CFStringRef data = CFSTR("My test data");

    printf("%u\n", mungeString(data));

    return 0;
}

下列dtrace脚本将打印第一个参数的字符串值,假设它是CFStringRef:

#!/usr/sbin/dtrace -s

/*
    Dumps a CFStringRef parameter to a function,
    assuming MacRoman or ASCII encoding.
    The C-style string is found at an offset of
    2 words past the CFStringRef pointer.
    This appears to work in 10.6 in 32- and 64-bit
    binaries, but is an implementation detail that
    is subject to change.

    Written by Gavin Baker <gavinb.antonym.org>
*/

#pragma D option quiet

/* Uncomment for LP32 */
/* typedef long ptr_t; */
/* Uncomment for LP64 */
typedef long long ptr_t;

pid$target::mungeString:entry
{
    printf("Called mungeString:\n");
    printf("arg0 = 0x%p\n",arg0);

    this->str = *(ptr_t*)copyin(arg0+2*sizeof(ptr_t), sizeof(ptr_t));
    printf("string addr = %p\n", this->str);
    printf("string val  = %s\n", copyinstr(this->str));

}

输出将类似于:

$ sudo dtrace -s dump.d -c ./build/Debug/dtcftest 
12
Called mungeString:
arg0 = 0x2030
string addr = 1fef
string val  = My test data

直接取消右边的注释即可typedef取决于您运行的是 32 位还是 64 位二进制文​​件。我已经在 10.6 上针对两种架构进行了测试,效果很好。

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

如何在 DTrace 操作中打印 CFStringRef? 的相关文章

随机推荐

  • 在 OpenGL 引擎中组织 GLSL 着色器

    哪个更好 To 拥有一个包含大量制服的着色器程序指定 要使用的灯光或要执行的映射 例如 我需要一个网格进行视差映射 另一个网格进行视差 镜面映射 我会为延迟传输创建一个制服的缓存列表 并且如果需要的话 只需为每个下一个网格更改几个制服 To
  • java中的matchTemplate与openCV

    我有这样的代码 Mat img Highgui imread inFile Mat templ Highgui imread templateFile int result cols img cols templ cols 1 int re
  • 如果表中的值满足条件,Vba 宏将从表中复制行

    我正在尝试制作一个宏 遍历一张桌子 查看该表的 B 列中的值是否具有特定值 如果有 则将该行复制到另一个工作表中的范围 结果类似于过滤表 但我想避免隐藏任何行 我对 vba 有点陌生 真的不知道从哪里开始 非常感谢任何帮助 这正是您使用高级
  • 从 genymotion 访问 homestead 主机

    我如何从genymotion模拟器访问homestead 我将这一行添加到模拟器中hosts文件 但不起作用 192 168 10 10 myapp app 以下是我在 Windows 10 上的操作方法 检查宅基地是否有效 我的宅基地在该
  • [NSMutableDictionary setValue: value forKey: key] 是否保留 NSString key?

    添加项目时NSMutableDictionary使用setValue forKey 方法 我想这可以推广到任何NSObject 字典是否保留第二个参数 即NSString 例如 NSAutoreleasePool pool NSAutore
  • Gradle:将 jar 依赖项包含到 Ear/libs 中

    我正在使用 Gradle 创建耳朵 但我很难弄清楚如何正确地将依赖项包含在 lib 文件夹中 我知道我可以使用 earlib project group name version 在那里包含罐子 这些 jar 的编译依赖项也将添加到 Ear
  • 将 JSON 单个字符串反序列化为数组

    我正在尝试反序列化我的 json 数据 但是我的类未正确设置 我无权更改 json 响应 因此我需要编写一个函数来正确处理 json 这是数据 blabla Score 1 Ref 50 foo colour Yellow ref y50
  • 字符串超过 maxJsonLength 且小于 250kb

    我将实体与ajax 一起使用 我想要在使用 JavaScript 创建的网格中使用实体框架提供的完整表格 我当前发送的表格少于 140 行 如果表中只有 50 行 那么我的代码就可以工作 并且出现以下错误 Message Error dur
  • 从 C 包装器调用 R 函数

    我有一个像这样的函数 callFunc lt function f f 1 f可以是 例如 f lt function x x 为了简化事情 假设我知道 f 应该返回一个数字并接受一个数字 我想搬家callFunc到C 但仍然有功能f在 R
  • 循环从节点 Promise 返回的对象并提供给下一个 .then

    我似乎永远被这个问题困扰了 我刚刚进入节点 并开始思考承诺等 我想做的是从 Spotify API 获取数据 我做的第一件事就是获取我自己的播放列表 function getPlaylists access token var option
  • 如何使用 jQuery 从文件添加内容?

    我有主要的html文档 div div 我还有一个内容文件 不是 html 文档 只是 html 代码 div class CodeRay div class code pre span class no 1 span require pr
  • 神经网络初始化 - Nguyen Widrow 实现?

    我尝试过实现 Nguyen Widrow 算法 如下 它似乎运行正常 但我有一些后续问题 这看起来像一个正确的实现吗 Nguyen Widrow 初始化是否适用于任何网络拓扑 尺寸 即5层自动编码器 Nguyen Widrow 初始化对任何
  • 性能和耐久性存储API(块存储)

    我们是 DST India 团队的一员 目前我们正在为客户提供一项产品 我们尝试使用 SoftLayer 提供的 REST API 将 SoftLayer 的性能和耐用存储功能集成到 ICO 中 我已经浏览了 SoftLayer 文档 但找
  • 在电子邮件中附加多种图像格式,而不仅仅是 JPG

    这就是我到目前为止所拥有的 MemoryStream imgStream new MemoryStream System Drawing Image img System Drawing Image FromStream fuImage P
  • 如何在Python中连接字符串和数字? [复制]

    这个问题在这里已经有答案了 我试图在Python 中连接一个字符串和一个数字 当我尝试这样做时 它给了我一个错误 abc 9 错误是 Traceback most recent call last File
  • HashMap 和 int 作为键

    我正在尝试构建一个 HashMap 它将整数作为键 将对象作为值 我的语法是 HashMap
  • Win2008 R2 上的 MSMQ 不会接收来自旧客户端的消息

    我在这里遇到一个非常奇怪的问题 我有一台安装了消息队列的 Windows 2008 R2 服务器 在另一台计算机上 运行 Windows 2003 的服务被设置为将消息发送到 2008 服务器上的公共队列 但是 消息永远不会显示在服务器上
  • 视频文件的下载链接

    我有一个视频想要提供下载链接 然而 创建了一个简单的 a href myvideo mp4 Download a 标签 当我点击它 在 Firefox 和 Chrome 中 时 它开始播放视频而不是允许下载视频 有没有一种方法可以在所有当前
  • 在 PHP 中如何不允许用户在注销后返回?

    我刚刚编写了一个PHP登录脚本 我想要完成的是 当用户单击注销链接时 在注销后 无论单击浏览器的后退按钮 他们都无法访问该页面 这是注销功能 Start the Session session start session destroy h
  • 如何在 DTrace 操作中打印 CFStringRef?

    我有一个 DTrace 探针捕获对函数的调用 该函数的参数之一是CFStringRef 这是保存指向 unicode 字符串的指针的私有结构 但是CFStringRef本身不是一个char 所以普通的 DTrace 方法如copyinstr