尝试调用 getsockopt 时出现 gdb 错误

问题描述 投票:0回答:1

我正在尝试获取通过 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)

sockets tcp gdb
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.