【发布时间】:2023-03-16 17:39:01
【问题描述】:
我尝试过使用 GDB 和 Valgrind,但我似乎无法确定问题所在。 有趣的是,程序在正常执行和 GDB 期间会崩溃,但 Valgrid 不会。
为了帮助您跟随代码,以下是程序的基本点: 通过套接字和 UDP 与服务器通信以传输文件,并处理一些基本的数据包丢失。
我不会分享服务器的代码,因为我知道问题不存在。 可能会让一些人感到困惑的一点是,我自己正在使用数字生成器来实现数据包丢失。现在它实际上并没有做任何事情,除了让程序使用另一个recvfrom。
为了引导您完成程序输出,客户端告诉服务器它想要什么文件,服务器告诉客户端它要发送的文件有多大,然后以块的形式发送(一次 10 个字符) .
输出显示发送了什么块,接收了多少个字符,以及连接的字符串是什么。
据我所知,文件传输成功了,只是我用来编写接收到的文件的 fopen 调用给我带来了麻烦。不确定这是否与我的 malloc 调用有关。
这里是源代码:
pastebin.com/Z79hvw6L
以下是 CLI 执行和 Valgrind 的输出(GDB 似乎没有提供更多信息):
注意 CLI 给出了 malloc 内存损坏错误,而 Valgrind 没有。
CLI:http://pastebin.com/qdTKMCD2
VALGRIND:http://pastebin.com/8inRygnU
感谢您的帮助!
添加了 GDB 回溯结果
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0x19a961]
/lib/i386-linux-gnu/libc.so.6(+0x6e15d)[0x19d15d]
/lib/i386-linux-gnu/libc.so.6(__libc_malloc+0x63)[0x19ef53]
/lib/i386-linux-gnu/libc.so.6(+0x5c2b8)[0x18b2b8]
/lib/i386-linux-gnu/libc.so.6(fopen+0x2c)[0x18b38c]
/home/---/client[0x8048dc2]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x145e37]
/home/---/client[0x8048871]
也许这可以让某人了解错误在程序的哪个部分?
【问题讨论】:
-
一般来说,如果您不能在帖子的上下文中发布相关的来源子集,您将不会收到很多回复。
-
你为什么不发布它在 valgrind 中崩溃的回溯?我敢打赌,如果你得到那个回溯,然后在损坏的内存(崩溃点)上设置一个内存观察点,它会导致你遇到问题。
-
乔是什么意思?我认为问题出在哪个区域?
-
@dbeer,除非我误解了 valgrind 输出,否则它在 valgrind 中根本不会崩溃?
-
添加了回溯。我一直在观察我的绳子,它容纳了所有的块,结果似乎很好。它就在 fopen 崩溃。
标签: c sockets udp malloc fopen