找到哪个函数导致gdb中的“Address out of bounds”

时间:2013-08-20 06:53:07

标签: c gdb

我的项目中存在严重错误。当我使用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我猜,但由于这已经是工作代码我很困惑,我是对的,我的猜测还是我错过了什么?

3 个答案:

答案 0 :(得分:4)

要检测“内存错误”,您可能希望在Valgrind下运行该程序:http://valgrind.org

如果使用符号编译程序(-g用于gcc),您可以非常可靠地检测到出现错误的代码行的“越界”条件,以及已分配的代码行记忆(如果有的话)。

答案 1 :(得分:2)

  

问题出在packet_handler_http我猜

这种猜测不太可能是正确的:如果packet_handler_http确实收到了无效指针,那么腐败就发生在它的“上游”。

  

这是很长时间没有问题的代码非常成熟的部分

经常在代码中找到“无问题”10年以上的错误。此外,损坏可能发生在新添加的代码中,但在其他地方引起问题。堆和堆栈缓冲区溢出通常就是这样。

正如已建议的那样,在ValgrindAddress Sanitizer(也包含在GCC-4.8中)下运行您的可执行文件,并解决他们发现的任何问题。

答案 2 :(得分:2)

谢谢你们的控制,甚至gdb说相反,结果指针很好。

新代码中有一部分会导致越界问题。

有像::(goodpointer + offset)这样的行,这个偏移量是http块大小,我从网络中获取它(数据嗅探)。并且有一种攻击,这种偏移非常大,导致整数溢出。这导致了界限问题。

我的结论:不要从网络中推出参数,而且gdb可能并不总是在coredump上正确指出参数,因为在粉碎时,事物可能会在堆栈中变得混乱。