更好的GDB可用性调用堆栈溢出

时间:2011-06-27 17:32:25

标签: recursion gdb usability stack-overflow infinite-loop

GDB是否可以检测到无限递归错误中的调用堆栈溢出并打印一些不错的错误和上下文消息,而不是下面给出的代码,对于新手来说很难理解,对我们所有人来说非常不方便。在这种情况下,如果GDB可以通过检查(member-)函数或变量指针中的重复模式来检测无限递归循环中涉及哪些对象(指针),那么它将是超酷 。我在Ubuntu上使用gdb-7.3-dev。输出如下:

Program received signal SIGSEGV, Segmentation fault.
0x008577e9 in _int_malloc (av=0x9483c0, bytes=4) at malloc.c:4249
4249    malloc.c: Filen eller katalogen finns inte.
    in malloc.c
(gdb) up
#1  0x00859f53 in __libc_malloc (bytes=4) at malloc.c:3660
3660    in malloc.c
(gdb) 
#2  0x00788b87 in operator new(unsigned int) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
(gdb) 
#3  0x0809cb7e in __gnu_cxx::new_allocator<Ob*>::allocate (this=0xbf80025c, __n=1)
    at /usr/include/c++/4.6/ext/new_allocator.h:92
92      return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
(gdb) 
#4  0x0809c7c8 in std::_Vector_base<Ob*, std::allocator<Ob*> >::_M_allocate (
    this=0xbf80025c, __n=1) at /usr/include/c++/4.6/bits/stl_vector.h:150
150       { return __n != 0 ? _M_impl.allocate(__n) : 0; }
(gdb) 
#5  0x0809c931 in std::vector<Ob*, std::allocator<Ob*> >::_M_insert_aux<Ob*> (
    this=0xbf80025c, __position=Cannot access memory at address 0x0
) at /usr/include/c++/4.6/bits/vector.tcc:324
324       pointer __new_start(this->_M_allocate(__len));
(gdb) up
#6  0x0809c65a in std::vector<Ob*, std::allocator<Ob*> >::emplace_back<Ob*> (
    this=0xbf80025c, __args#0=@0xbf800190) at /usr/include/c++/4.6/bits/vector.tcc:102
102       _M_insert_aux(end(), std::forward<_Args>(__args)...);
(gdb) 
#7  0x0809c5c4 in std::vector<Ob*, std::allocator<Ob*> >::push_back (this=0xbf80025c, 
    __x=@0xbf800190) at /usr/include/c++/4.6/bits/stl_vector.h:840
840       { emplace_back(std::move(__x)); }
(gdb) 

/每

1 个答案:

答案 0 :(得分:1)

Gdb无法真正做到这一点,因为堆栈溢出检测通常由编译器实现。编译器实现这一点的一般方式是使用金丝雀。金丝雀是堆栈上的值(位置在局部变量和堆栈帧之间),如果它被覆盖则会被检查。堆栈溢出的问题是您以堆栈损坏结束,并且调用堆栈通常没用。解决这个问题的方法是使用br命令在金丝雀位置设置观察点。因此,当金丝雀被覆盖时,它会突破正确的