我的项目中存在严重错误。当我使用gdb打开.core时,它显示了类似的东西(我没有把所有的gdb输出都放在阅读中):
这是非常非常可疑的,代码的新编写部分::
0x00000000004579fe in http_chunk_count_loop
(f=0x82e68dbf0, pl=0x817606e8a Address 0x817606e8a out of bounds)
这是很长时间没有问题的代码非常成熟的部分::
0x000000000045c8a5 in packet_handler_http
(f=0x82e68dbf0, pl=0x817606e8a Address 0x817606e8a out of bounds)
好了,现在我的想法是pl=0x817606e8a Address 0x817606e8a out of bounds
,gdb显示它在到达新的编写代码之前已经超出界限。这让我想到了调用packet_handler_http
的函数引起的问题。
但是packet_handler_http
非常成熟并且长时间没有问题。这让我误以为是gdb输出。
问题出在packet_handler_http
我猜,但由于这已经是工作代码我很困惑,我是对的,我的猜测还是我错过了什么?
答案 0 :(得分:4)
要检测“内存错误”,您可能希望在Valgrind下运行该程序:http://valgrind.org
如果使用符号编译程序(-g
用于gcc),您可以非常可靠地检测到出现错误的代码行的“越界”条件,以及已分配的代码行记忆(如果有的话)。
答案 1 :(得分:2)
问题出在packet_handler_http我猜
这种猜测不太可能是正确的:如果packet_handler_http
确实收到了无效指针,那么腐败就发生在它的“上游”。
这是很长时间没有问题的代码非常成熟的部分
我经常在代码中找到“无问题”10年以上的错误。此外,损坏可能发生在新添加的代码中,但在其他地方引起问题。堆和堆栈缓冲区溢出通常就是这样。
正如已建议的那样,在Valgrind或Address Sanitizer(也包含在GCC-4.8中)下运行您的可执行文件,并解决他们发现的任何问题。
答案 2 :(得分:2)
谢谢你们的控制,甚至gdb说相反,结果指针很好。
新代码中有一部分会导致越界问题。
有像::(goodpointer + offset)这样的行,这个偏移量是http块大小,我从网络中获取它(数据嗅探)。并且有一种攻击,这种偏移非常大,导致整数溢出。这导致了界限问题。
我的结论:不要从网络中推出参数,而且gdb可能并不总是在coredump上正确指出参数,因为在粉碎时,事物可能会在堆栈中变得混乱。