2017-07-17 4 views
0

Je googled, froogled, moogled et doogled :-(interprétation erreur de segmentation gdb

raspian

Si je lance mon programme sous gdb je reçois:

(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) 

dans axcept.c autour 333 Je:

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

mais les deux read_parameters et get_today sont plus ou moins volé de gnu officiel e xamples.

de mon 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 

J'ai essayé valgrind -v --track-origines = oui myprog, mais il ne me laisse pas plus sage.

Maintenant punch ivre!

+0

double free ou la corruption signifie que vous «libérez quelque chose deux fois, ou que quelque part quelque chose a écrasé la comptabilité en dehors de l'objet' malloc'ated. Le problème peut se manifester plus tard. 'valgrind' devrait être la solution ... –

+0

Mauvais choix d'échantillon de code. Qu'est-ce qui se passe à aujourd'hui.c: 17 semble être plus utile que axcept.c: 333. Je commence toujours à déboguer par l'appel le plus intime que j'ai. – flaviodesousa

+0

Que montre 'valgrind'? – dlmeetei

Répondre

3

La double suppression ou la corruption signifie que vous êtes à deux reprises ou que quelque part quelque chose a écrasé la comptabilité en dehors de l'objet malloc. Le problème peut se manifester plus tard - ici c'est malloc qui a remarqué le problème, de sorte que la corruption de tas réelle se produit avant. Si valgrind ne semble pas aider (enfin, ça devrait), essayez de répliquer ce bug en remplaçant l'appel get_today() par un malloc inutile par exemple; Si cela fonctionne, alors vous pouvez essayer de le tracer dans le code en déplaçant et en supprimant des parties du code jusqu'à ce que vous ayez un MCVE (qui sera probablement résolu par lui-même).

+0

J'ai compris! Je souffrais d'un tableau hors limites dans read_parameters(). Merci beaucoup à tous. – tangent