C ++如何在Ubuntu

时间:2017-09-26 14:51:08

标签: c++ debugging gdb backtrace

我写了一个相当大的C ++程序。作为前言,程序运行良好每次保存为退出错误,free()无效指针通常导致核心转储;除此之外,该程序每次都做我需要做的事情。程序没有任何指针对象或初始化;尽管程序很长(大约3000行),但它的编写非常简单(主要是int变量和一些2D矢量数组)。我的第一个想法是一些FOR循环写入超出向量边界所以我运行Valgrind mems检查以查看是否有任何内存泄漏但Valgrind返回了一个干净的报告。我的下一个倾向是使用gdb并查看它是否返回任何错误。它确实返回了一个SEGABRT,所以我回溯了它,gdb返回了以下内容,

> #0  0x00007ffff7018c37 in __GI_raise (sig=sig@entry=6)
>     at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
> #1  0x00007ffff701c028 in __GI_abort () at abort.c:89
> #2  0x00007ffff70552a4 in __libc_message (do_abort=do_abort@entry=1, 
>     fmt=fmt@entry=0x7ffff7167310 "*** Error in `%s': %s: 0x%s ***\n")
>     at ../sysdeps/posix/libc_fatal.c:175
> #3  0x00007ffff706182e in malloc_printerr (ptr=<optimized out>, 
>     str=0x7ffff716345e "free(): invalid pointer", action=1) at malloc.c:4998
> #4  _int_free (av=<optimized out>, p=<optimized out>, have_lock=0)
>     at malloc.c:3842
> #5  0x000000000040f152 in __gnu_cxx::new_allocator<int>::deallocate (
>     this=0x7fffff85cf60, __p=0x6c1f40)
>     at /usr/include/c++/4.8/ext/new_allocator.h:110
> #6  0x000000000040ef54 in std::_Vector_base<int, std::allocator<int> >::_M_deallocate (this=0x7fffff85cf60, __p=0x6c1f40, __n=32)
>     at /usr/include/c++/4.8/bits/stl_vector.h:174
> #7  0x000000000040ebc2 in std::_Vector_base<int, std::allocator<int> >::~_Vector_base (this=0x7fffff85cf60, __in_chrg=<optimized out>)
>     at /usr/include/c++/4.8/bits/stl_vector.h:160
> #8  0x000000000040e928 in std::vector<int, std::allocator<int> >::~vector (
>     this=0x7fffff85cf60, __in_chrg=<optimized out>)
>     at /usr/include/c++/4.8/bits/stl_vector.h:416
> #9  0x000000000040e3b5 in main ()

我想我的问题是这个。我该如何解释这种回溯?我只看到最后一个堆栈#9调用main函数,但它没有与之关联的其他错误。我认为堆栈错误#0-8是被调用库中的失败?我可以调用gdb中的一种方法或一些选项来帮助查明错误以及它在此回溯中的来源吗?我一般都很擅长使用gdb,所以任何建议都会非常受欢迎。

编辑示例代码:

for(int k = 4; k < 7; k++)
{
    if(TFNCWS[k] == 1)
    {
        TFNCWS[k] = 0;
        TIM[k] = 1;
    }
}

1 个答案:

答案 0 :(得分:0)

  

如何解释此回溯?

非常简单:您的程序在破坏向量时崩溃,在main函数的某处声明了。

最可能的原因是堆栈损坏。

  

我跑Valgrind mems检查是否有任何内存泄漏

内存泄漏 nothing 与您的问题无关,而Valgrind在检测到堆栈溢出时非常弱。

您应该尝试Address Sanitizer(最近的GCC和Clang中提供)。有可能直接指出你的问题。