2013-01-08 88 views
1

我無法前進去查看核心轉儲。如何查看細分故障(核心轉儲)

我有這個當我輸入

gdb normal_estimation core 


Reading symbols from /home/sai/Documents/pcl_learning/normal_estimation/build/normal_estimation...(no debugging symbols found)...done. 

warning: core file may not match specified executable file. 
[New LWP 11816] 

warning: Can't read pathname for load map: Input/output error. 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1". 
Core was generated by `./normal_estimation'. 
Program terminated with signal 11, Segmentation fault. 
#0 0xb53101d6 in free() from /lib/i386-linux-gnu/libc.so.6 
(gdb) 

請讓我知道我應該怎麼辦?

+0

'沒有找到調試符號':這是一個提示。在編譯代碼時啓用調試(禁用優化對調試也有很大幫助)。 – vanza

+0

我已經編譯使用make的文件。我如何給調試符號 – Sai

+0

不,你已經使用編譯器(最可能gcc)編譯你的代碼。閱讀其文檔以瞭解如何使用它。 – vanza

回答

3

程序以信號11終止,分段故障。
#0 0xb53101d6 in free() from /lib/i386-linux-gnu/libc.so.6

你需要學習的第一個命令是backtrace(或它的同義詞:where)。

這會告訴你哪個代碼調用了free,哪個崩潰了。

但是,該代碼可能與實際問題無關:free中的任何崩潰總是由某種類型的堆損壞引起的(釋放未分配的內存,釋放相同的內存兩次,寫入內存已被釋放,或溢出分配的緩衝區)。

診斷Linux上堆損壞最有用的工具是ValgrindAddressSanitizer。很有可能這些工具會告訴你究竟是你做錯了什麼。

+0

這是GDB報告。 [使用libthread_db啓用線程調試] 使用主機libthread_db庫「/lib/i386-linux-gnu/libthread_db.so.1」。核心是由'./normal_estimation'生成的。 程序以信號11結束,分段故障。在obstack.c中的_obstack_allocated_p(h = 0xb5498d18,obj = 0xbfe6ca90)中的 #0 0xb53101d6:341 obstack.c:沒有這樣的文件或目錄。(gdb)bt #0 0xb53101d6在_obstack_allocated_p(h = 0xb5498d18,obj = 0xbfe6ca90)在obstack.c:341 #1 0xbfe6cab0在? () #2 0x08087c5c main() (gdb) – Sai

+0

我試過valgrind,它給出了這個總結。錯誤摘要:從0的上下文中0錯誤(壓制:0從0) 非法指令(核心傾銷) – Sai

+0

還有一件事...當我在網上看到,所有程序都使用g ++或gcc編譯,但在這裏我有一個CMakeLists。 TXT,因此我做cmake然後製作。所以我無法正確使用網絡資源 – Sai