gpt4 book ai didi

dtrace - 如何在 DTrace 操作中打印 CFStringRef?

转载 作者:行者123 更新时间:2023-12-02 08:11:13 28 4
gpt4 key购买 nike

我有一个 DTrace 探针捕获对函数的调用,该函数的参数之一是 CFStringRef。这是保存指向 unicode 字符串的指针的私有(private)结构。但 CFStringRef 本身并不是 char*,因此像 copyinstr() 这样的普通 DTrace 方法只会返回 ?cp? >,这并不完全有帮助。

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

最佳答案

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

解决方案(与在 C++ 中使用的转储 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

只需根据您运行的是 32 位还是 64 位二进制文​​件,取消注释正确的 typedef 即可。我已经在 10.6 上针对两种架构进行了测试,效果很好。

关于dtrace - 如何在 DTrace 操作中打印 CFStringRef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1413623/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com