我正在尝试获取通过 telnet 到远程服务器的现有 TCP 连接的 TCP 套接字选项。
我尝试使用 gdb 并调用 getsockopt 函数,但出现错误:
尝试提取不是结构的值的组成部分。
有办法解决这个问题吗?是否有其他方法可以获取现有 TCP 连接的 TCP 套接字选项。我可以让 getsockopt 在 Python 中在我在 Python 代码中创建的 TCP 套接字上运行。但我想获取在 python 套接字编程之外创建的现有 TCP 连接的详细信息?
我得到了我的 fd 和 pid:
#ss -tanope dst xx.xx.xx.xx
状态 Recv-Q Send-Q 本地地址:端口 对等地址:端口进程 ESTAB 0 0 172.31.37.109:50970 xx.xx.xx.xx:80 个用户:(("telnet",pid=6681,fd=3)) ino:74309 sk:17 cgroup:unreachable:1 <->
然后我用 gdb 执行了以下操作(我是 gdb 新手),但出现了此错误:
#gdb
GNU gdb (GDB) 红帽企业 Linux 8.0.1-36.amzn2.0.1 版权所有 (C) 2017 自由软件基金会, Inc. 许可证 GPLv3+:GNU GPL 版本 3 或更高版本 http://gnu.org/licenses/gpl.html 这是免费软件:您可以自由更改和重新分发它。 在法律允许的范围内,不提供任何保证。输入“显示复制” 并“显示保修”以了解详细信息。 该 GDB 被配置为“x86_64-redhat-linux-gnu”。 键入“显示配置”以获取配置详细信息。 有关错误报告说明,请参阅: http://www.gnu.org/software/gdb/bugs/。 在线查找 GDB 手册和其他文档资源: http://www.gnu.org/software/gdb/documentation/。 如需帮助,请输入“帮助”。 输入“apropos word”来搜索与“word”相关的命令。
(gdb)文件/bin/telnet
从 /bin/telnet 读取符号...从 /usr/lib/debug/usr/bin/telnet.debug 读取符号...完成。 完成了。
(gdb)附加6681
附加程序:/usr/bin/telnet,进程 6681
从 /lib64/libutil.so.1 读取符号...从 /usr/lib/debug/usr/lib64/libutil-2.26.so.debug 读取符号...完成。 完成了。
从 /lib64/libncurses.so.6 读取符号...从 /usr/lib/debug/usr/lib64/libncurses.so.6.0.debug 读取符号...完成。 完成了。
从 /lib64/libtinfo.so.6 读取符号...从 /usr/lib/debug/usr/lib64/libtinfo.so.6.0.debug 读取符号...完成。 完成了。
从 /lib64/libc.so.6 读取符号...从 /usr/lib/debug/usr/lib64/libc-2.26.so.debug 读取符号...完成。 完成了。
从 /lib64/libdl.so.2 读取符号...从 /usr/lib/debug/usr/lib64/libdl-2.26.so.debug 读取符号...完成。 完成了。
从 /lib64/ld-linux-x86-64.so.2 读取符号...从 /usr/lib/debug/usr/lib64/ld-2.26.so.debug 读取符号...完成。 完成了。
__GI___select 中的0x00007f1309a00397 (nfds=nfds@entry=4, readfds=0x55923c2b3800, writefds=0x55923c2b3820, exceptfds= exceptfds@entry=0x55923c2b3840, 超时=timeout@entry=0x0)位于../sysdeps/unix/sysv/linux/select.c:41 41 return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,
(gdb) 调用 getsockopt(3, socket.IPPROTO_TCP, socket.TCP_QUICKACK)
尝试提取不是结构的值的组成部分。
(gdb)
call getsockopt(3, socket.IPPROTO_TCP, socket.TCP_QUICKACK)
您希望 GDB 对
socket.IPPROTO_TCP
做什么?
就GDB而言,
socket
是socket
内部libc.so
符号的地址,而表达式socket.IPPROTO_TCP
作为C
表达式没有任何意义(这正是GDB告诉你的)。
您可能想要的是:
(gdb) call getsockopt(3, 6, 12)