You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下gethostbyname()与getaddrinfo()调用永久阻塞问题求助

故障排查与解决步骤

  • 优先检查/etc/nsswitch.conf中hosts配置行的顺序
    确认配置优先读取hosts文件,正常配置应为hosts: files dns,如果dns顺序在files之前,就算修改了/etc/hosts也会优先走DNS解析,可能因为DNS查询卡住导致阻塞。如果配置中存在nis、ldap、mdns等你未部署的服务项,直接删除这些项再测试。
  • 排查静态编译glibc问题
    如果你编译程序时加了-static参数静态链接glibc,会无法正常加载glibc的NSS动态解析模块,大概率会出现域名解析永久阻塞的问题,去掉静态编译参数改用动态链接glibc即可解决。
  • 用strace定位卡位点
    安装strace后执行strace ./你的可执行程序名,观察程序最后阻塞的系统调用,就能明确是卡在读取配置文件、连接DNS服务器还是其他系统调用环节。
  • 修正getaddrinfo的标志位配置
    你当前代码设置了AI_PASSIVE标志,该标志仅用于解析本机监听用的地址,解析外部域名时无需传入,同时可以新增AI_ADDRCONFIG标志,避免glibc查询当前网络不支持的地址族(比如无IPv6环境下查询AAAA记录)导致额外超时。
  • 检查解析器超时配置
    查看/etc/resolv.conf,确认是否存在多台不可达的nameserver,或者配置了过长的超时/重试次数,可以修改为公共DNS测试,配置示例:
    nameserver 8.8.8.8
    options timeout:2 attempts:1
    
  • 检查AppArmor限制
    Debian 11默认启用AppArmor,可临时执行systemctl stop apparmor后再运行程序测试,确认是否是安全策略限制了进程的域名解析权限。

注:gethostbyname属于已废弃的不安全接口,生产环境建议统一使用getaddrinfo实现域名解析。

内容的提问来源于stack exchange,提问作者Boris L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:39:02