簡體   English   中英

C ++如何在Ubuntu中解釋gdb backtrace日志

[英]C++ How to interpret gdb backtrace log in Ubuntu

我寫了一個相當大的C ++程序。 作為序言,每次保存程序時,只要存在退出錯誤,free()無效指針通常會導致核心轉儲,就可以很好地運行; 除此之外,該程序每次都會執行我需要做的事情。 該程序沒有任何指針對象或初始化。 盡管程序很長(大約3000行),但編寫起來卻很簡單(主要是int變量和一些2D矢量數組)。 我的第一個想法是某些FOR循環正在寫矢量邊界之外的內容,因此我運行Valgrind內存檢查以查看是否存在任何內存泄漏,但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,但是沒有其他與之相關的錯誤。 我認為堆棧錯誤#0-8是調用庫中的錯誤嗎? 我可以調用gdb中的某種方法或某些選項來幫助查明錯誤以及此追溯中錯誤的來源嗎? 我一般來說對使用gdb還是比較陌生的,因此任何建議都將受到贊賞。

編輯示例代碼:

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

如何解釋此回溯?

很簡單:您的程序在破壞向量時崩潰,該向量在您的main函數中聲明。

最可能的原因是堆棧損壞。

我運行了Valgrind內存檢查,看是否有內存泄漏

內存泄漏與您的問題無關 ,並且Valgrind在檢測堆棧溢出方面非常虛弱。

您應該嘗試使用Address Sanitizer (在最近的GCC和Clang中可用)。 很可能會直接指出問題所在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM