如何解决在 macOS 上与 dtrace 连接打印 IP/端口
我正在尝试使用 dtrace 打印出子进程中所有 connect
调用的 IP 和端口。经过一些试验和错误,我想出了这个 DTrace 脚本
syscall::connect:entry,syscall::connect_nocancel:entry
/
pid == $target
/
{
this->sockaddr_in_var = (struct sockaddr_in*) args[1];
trace(inet_ntop(this->sockaddr_in_var->sin_family,&this->sockaddr_in_var->sin_addr))
}
我希望为每次调用 connect
和 connect_nocancel
打印出套接字地址。当我尝试通过这个运行 telnet
时(只是为了建立一个非常简单的 TCP),它失败了。
λ sudo dtrace -s traceconn.d -c 'telnet localhost 8080'
dtrace: system integrity protection is on,some features will not be available
dtrace: script 'traceconn.d' matched 2 probes
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
dtrace: pid 53014 has exited
dtrace: error on enabled probe ID 2 (ID 977: syscall::connect_nocancel:entry): invalid kernel access in action #2 at DIF offset 12
dtrace: error on enabled probe ID 2 (ID 977: syscall::connect_nocancel:entry): invalid kernel access in action #2 at DIF offset 12
dtrace: error on enabled probe ID 1 (ID 355: syscall::connect:entry): invalid kernel access in action #2 at DIF offset 12
dtrace: error on enabled probe ID 1 (ID 355: syscall::connect:entry): invalid kernel access in action #2 at DIF offset 12
错误意味着我正在取消引用无效的指针地址,但是 connect
的文档说它的第二个参数应该是 sockaddr *
,所以我不明白为什么这会是无效的取消引用。这与SIP有关吗? DTrace 脚本中我的逻辑是否有错误?
编辑:我认为这可能与在 macOS 中启用 SIP 有关,但我为 dtrace 禁用了它,但仍然遇到同样的问题。
λ csrutil status
System Integrity Protection status: unkNown (Custom Configuration).
Configuration:
Apple Internal: disabled
Kext Signing: enabled
Filesystem Protections: enabled
Debugging Restrictions: enabled
DTrace Restrictions: disabled
NVRAM Protections: enabled
BaseSystem Verification: enabled
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。