我正在使用具有Linux的嵌入式系统。 客户端线程正在向套接字中写入一些数据,但是另一端正在读取的服务器线程与所写的不同。导致线程(和父进程)崩溃。
我是网络和Linux的新手。 我已转储正在写入的所有数据,一切都很好。
gdb中的函数跟踪显示以下信息。
(gdb)
#0 0x00007f62be8e8670 in getenv () from /lib/libc.so.6
#1 0x00007f62be92057a in __libc_message () from /lib/libc.so.6
#2 0x00007f62be99f927 in __fortify_fail () from /lib/libc.so.6
#3 0x00007f62be99f8f0 in __stack_chk_fail () from /lib/libc.so.6
#4 0x0000000000406471 in reading (sockFd=15) at __line_number_in_the_program__
#5 0x793bcf318b18bb01 in ?? ()
#6 0x117d0300942ff567 in ?? ()
#7 0x0000000100000000 in ?? ()
..
..
..
直到#785,并带有一些[随机]地址。
reading()是用于处理服务器线程中读取的数据的函数。
我怀疑套接字内部有问题。 有什么办法可以不读取套接字(客户机/服务器)缓冲区中的数据? 还是使用gdb进一步调试它的其他方法?
已经有一些检查可以正确处理读取的数据,但这些检查也无济于事。
答案 0 :(得分:1)
您有堆栈缓冲区溢出问题。如果您从未听说过GCC堆栈保护器,那么现在该进行查找了。虽然Wireshark是查看飞行数据的显而易见的工具,但这不是问题的根源。您的服务器应提供针对从网络读取的所有恶意数据的证据。这是基本的良好服务器设计和实施实践。 您有堆栈缓冲区溢出问题。