首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在d桁架输出中看到完整的字符串?

如何在d桁架输出中看到完整的字符串?
EN

Stack Overflow用户
提问于 2013-11-09 22:37:13
回答 1查看 1.4K关注 0票数 3

我在SSLX10.8.5上使用dtruss,试图查看正在运行的应用程序与与其对话的MacOS服务器之间的对话。与Linux上的strace不同,我在输出中没有看到完整的数据字符串,就像程序在文件描述符上执行sendrecv一样。

如何让dtruss显示应用程序在SSL服务器上发送和接收的数据?

在有人告诉我要代理到我控制的SSL服务器的连接之前,是的,我知道这个技巧,而且这个特定的应用程序太聪明了,不会让它上当的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-10 22:54:07

dtruss既是为DTrace编写的脚本的优雅示例,也是DTrace可以完成的任务的演示。然而,尽管它与trussstrace的相似之处在相对贫乏的OS上是非常受欢迎的,但我怀疑dtruss从来没有完全替代任何一种。

无论如何,您的问题有点模棱两可:我不确定您是否担心您看到的字符串被截断,还是您根本没有看到sendto()recvfrom() (DTrace显示的底层接口)的任何字符串。我两个人都来。

首先,DTrace在内核中收集数据;在记录和传输回消费者--通常是dtrace(1)命令之前,使用D语言的copyin()copyinstr()获取用户土地缓冲区。DTrace要求在编译时知道其内核缓冲区大小,因此对字符串不可预测的长度施加了限制。默认情况下,此限制为256字节;如果您正在看到截断,则可以通过添加(例如,

代码语言:javascript
复制
#pragma D option strsize=512

dtruss现有的pragma下面。

其次,dtruss是硬编码的,以了解各种系统调用的格式要求。在它的输出中看不到对sendto()recvfrom()的任何缓冲区解释,因为它们在源中没有显式处理。没有什么可以阻止您找到适合添加它们的位置,但是您可以编写自己的脚本:

代码语言:javascript
复制
bash-3.2# cat sr.d
#pragma D option rawbytes

syscall::sendto:entry,
syscall::recvfrom:entry
/pid == $target/
{
    self->bufp = arg1;
    self->size = arg2;
}

syscall::sendto:return,
syscall::recvfrom:return
/pid == $target && self->bufp && self->size/
{
    printf("%s():\n", probefunc);
    tracemem(copyin(self->bufp, self->size), 64);
    printf("\n");
    self->bufp = self->size = NULL;
}
bash-3.2# dtrace -qs ./sr.d -p 16988
sendto():

             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
         0: 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00  hello...........
        10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

^C

bash-3.2#

请注意,对于字符串,我们有义务为tracemem()使用DTrace的数据记录缓冲区提供一个严格的限制。如果这个限制很少接近,那么这会产生一个令人恼火的结果,即输出结果可能是压倒性的,而且大部分是多余的。如果您知道您正在寻找字符串,那么您可以直接使用copyinstr();如果您的DTrace实现比我的OS X 10.6.8更现代化,那么您可能会发现您可以编写。

代码语言:javascript
复制
tracemem(copyin(self->bufp, self->size), 64, self->size);

其中,第二个参数仍然是对记录的字节数的硬限制,但是显示的字节数受到可选的第三个参数的限制。

最后,请注意,用户的土地地址是记录在进入系统调用,但只有在出口使用。这是一个常见的成语,它允许系统调用错误--如果有必要的话,在数据中-- DTrace本身不会这样做,如果被要求跟踪非常驻地址,会在运行时产生错误。

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

https://stackoverflow.com/questions/19883966

复制
相关文章

相似问题

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