2017-07-17 74 views
0

我用Google搜索,froogled,moogled和doogled :-(解釋GDB分段錯誤

raspian

如果我在gdb下運行我的程序,我得到:

(gdb) run 
Starting program: /home/pi/axcept/a 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/arm-linux- 
gnueabihf/libthread_db.so.1". 
axcept v:1.0 20170710 
running 
[New Thread 0x768e3450 (LWP 6671)] 
[Thread 0x768e3450 (LWP 6671) exited] 
*** Error in `/home/pi/axcept/a': double free or corruption (out): 
0x00025178 *** 

Program received signal SIGABRT, Aborted. 
0x76a1af70 in __GI_raise ([email protected]=6) at 
../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or 
directory. 
(gdb) where 
#0 0x76a1af70 in __GI_raise ([email protected]=6) at 
../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x76a1c324 in __GI_abort() at abort.c:89 
#2 0x76a56954 in __libc_message (do_abort=<optimized out>, 
fmt=0x76b0c6e8 "*** Error in `%s': %s: 0x%s ***\n") at 
../sysdeps/posix/libc_fatal.c:175 
#3 0x76a5cb80 in malloc_printerr (action=1, str=0x76b0c860 "double 
free or corruption (out)", ptr=<optimized out>) at malloc.c:4996 
#4 0x76a5db24 in _int_free (av=<optimized out>, p=<optimized out>, 
have_lock=1992996040) at malloc.c:3840 
#5 0x76a7d72c in tzset_internal (always=0, explicit=1991424272) at 
tzset.c:443 
#6 0x76a7db5c in __tz_convert (timer=0x7efff1e0, use_localtime=1, 
tp=0x76b2d2cc <_tmbuf>) at tzset.c:632 
#7 0x00011190 in get_today() at today.c:17 
#8 0x00012f14 in main (argc=1, argv=0x7efff374) at axcept.c:333 
(gdb) list 
51 in ../nptl/sysdeps/unix/sysv/linux/raise.c 
(gdb) 

在axcept.c各地333我有:

... 
initialise_db(); 
read_parameters(0); 
get_today(); 
.... 

但是read_parameters和get_today都或多或少被官方gnu e xamples。

從我的makefile:

CC=gcc 
CCFLAGS= -fgnu89-inline -g -v -da -Q -std=c99 -I/usr/local/include - 
L/usr/local/lib -lwiringPi -I/usr/include/mysql/ -I/home/pi/logging/ 
`mysql_config --cflags --libs` -lwiringPi -lwiringPiDev -lpthread -lm 
-lcrypt -lrt 

我已經試過的valgrind -v --track-起源= YES MYPROG,但它讓我不聰明。

現在喝醉了!

+0

雙倍免費或腐敗意味着您可以「免費」兩次,或者某處覆蓋「malloc」對象之外的簿記。這個問題可以在以後出現。 'valgrind'應該是解決方案... –

+0

代碼示例的錯誤選擇。今天發生了什麼c:17似乎比axcept.c:333更有幫助。我總是通過我所擁有的最內在的呼喚開始調試。 – flaviodesousa

+0

valgrind顯示什麼? – dlmeetei

回答

3

雙倍免費或腐敗意味着您要兩次做某件事,或者在某處覆蓋了某個物品以外的簿記。問題可以在稍後體現出來 - 這裏是malloc,它注意到了問題,所以實際的堆損壞發生在之前。

如果valgrind似乎沒有幫助(好,它應該),嘗試如果您可以通過用無用的malloc替換get_today()調用來複制此錯誤,如果它有效,那麼你可以嘗試通過移動和刪除部分代碼來追蹤代碼,直到你將擁有一個MCVE(它可能會自行解析)。

+0

知道了!我在read_parameters()中遇到了一個數組越界的問題。非常感謝大家。 – tangent