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

调用getsockopt时GDB报错,如何获取已有TCP连接的套接字选项?

获取外部TCP连接套接字选项的问题解决

修复GDB调用getsockopt的报错

报错“Attempt to extract a component of a value that is not a structure.”的核心原因是GDB中直接调用getsockopt时参数传递或结果处理不符合系统调用规范,按以下步骤调整即可:

  • 先attach到目标进程:gdb -p 6681
  • 以获取TCP_NODELAY选项为例,手动构造系统调用参数(x86_64架构下getsockopt的syscall号为54):
    1. 定义存储结果的变量:set $val = 0,set $len = sizeof($val)
    2. 执行系统调用:call (int)syscall(54, 3, 6, &$val, &$len)
      参数说明:syscall号、目标fd(3)、TCP_NODELAY选项标识(6)、结果指针、长度指针
    3. 查看结果:print $val,返回0表示调用成功,$val即为选项值

获取外部TCP连接套接字选项的其他方法

方法1:利用ss命令直接输出

ss工具支持直接展示部分套接字选项,执行以下命令即可:
ss -ti dst <远程服务器IP>:<目标端口>
其中-t指定TCP连接,-i会输出TCP_NODELAY、拥塞控制算法等核心选项;加上-o还能查看计时器相关信息。

方法2:Python结合ptrace调用目标进程的getsockopt

借助python-ptrace库可以更便捷地attach进程并调用函数:

  1. 安装依赖:pip install python-ptrace
  2. 示例脚本:
from ptrace.debugger import PtraceDebugger
from ptrace.syscall.socketenum import SOL_TCP, TCP_NODELAY

debugger = PtraceDebugger()
process = debugger.addProcess(6681, False)

# 调用目标进程的getsockopt获取选项
fd = 3
result = process.syscall("getsockopt", fd, SOL_TCP, TCP_NODELAY, 0)
print(f"TCP_NODELAY: {result}")

debugger.quit()

该库会自动适配不同架构的系统调用规则,无需手动记忆syscall号。

方法3:读取proc文件系统信息

部分套接字基础信息可通过proc文件直接读取:
cat /proc/6681/fdinfo/3
文件中会包含套接字的inode、状态等信息,部分选项(如缓冲区大小)可结合/proc/sys/net/core/下的系统参数推断,但能获取的选项范围有限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:32:03