通过strace来分析go域名解析过程

strace用于跟踪进程运行时系统调用和接收的信号,支持跟踪要启动和已运行的进程。

参数

含义

-T

显示系统调用消耗时间

-tt

显示毫秒级别时间

-p

指定跟踪的进程

-v

输出环境变量等上下文内容

例如,查看进程对应的线程系统调用。

strace -fp [pid] -T -tt 2>&1

 

package main

import (
	"net"

	"k8s.io/klog/v2"
)

func main() {
	dns := "cn.bing.com"
	if ip, err := net.LookupHost(dns); err != nil {
		klog.Errorf("lookup %s failed, err is %v", dns, err)
	} else {
		klog.Infof("%s ip is %s", dns, ip)
	}
}

 

[root@node1 use-k8s-queue]# strace ./lookup_dns
...
读取/etc/resolv.conf,保存nameserver
openat(AT_FDCWD, "/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
epoll_ctl(4, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=4247555832, u64=139693763890936}}) = -1 EPERM (Operation not permitted)
fstat(3, {st_mode=S_IFREG|0644, st_size=74, ...}) = 0
read(3, "# Generated by NetworkManager\nse"..., 65536) = 74
read(3, "", 65462)                      = 0
read(3, "", 65536)                      = 0
close(3)                                = 0
读取/etc/hosts,确认是否有记录匹配
newfstatat(AT_FDCWD, "/etc/hosts", {st_mode=S_IFREG|0644, st_size=199, ...}, 0) = 0
openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
epoll_ctl(4, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=4247555832, u64=139693763890936}}) = -1 EPERM (Operation not permitted)
read(3, "127.0.0.1   localhost localhost."..., 65536) = 199
read(3, "", 65337)                      = 0
read(3, "", 65536)                      = 0
close(3)                                = 0
基于nameserver进行解析
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.0.1")}, 16) = 0
epoll_ctl(4, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=4247555832, u64=139693763890936}}) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(43297), sin_addr=inet_addr("192.168.0.105")}, [16]) = 0
getpeername(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.0.1")}, [16]) = 0
write(3, "\255Y\1\0\0\1\0\0\0\0\0\1\2cn\4bing\3com\0\0\34\0\1\0\0)"..., 40) = 40
read(3, 0xc000184000, 1232)             = -1 EAGAIN (Resource temporarily unavailable)
futex(0x6046a8, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0x6046a8, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
epoll_pwait(4, [], 128, 0, NULL, 1)     = 0
I0131 07:56:54.420358   26473 lookup_dns.go:14] cn.bing.com ip is [202.89.233.100 202.89.233.101]
epoll_pwait(4,  <ptrace(SYSCALL):No such process>
+++ exited with 0 +++

 

posted on 2024-01-31 08:11  王景迁  阅读(46)  评论(0)    收藏  举报

导航