La compréhension de “corrompu taille et prev_size” glibc erreur
J'ai mis en place un JNA pont de FDK-AAC. Le code Source peut être trouvé dans ici
Lorsque le bench-marking mon code, je peux faire des centaines de succès s'exécute sur la même entrée, et puis à l'occasion d'un C-niveau de l'accident qui va tuer l'ensemble du processus, ce qui entraîne un core dump être généré:
En regardant le vidage du noyau, il ressemble à ceci:
#1 0x00007f3e92e00f5d in __GI_abort () at abort.c:90
#2 0x00007f3e92e4928d in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f3e92f70528 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007f3e92e5064a in malloc_printerr (action=<optimized out>, str=0x7f3e92f6cdee "corrupted size vs. prev_size", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5426
#4 0x00007f3e92e5304a in _int_free (av=0x7f3de0000020, p=<optimized out>, have_lock=0) at malloc.c:4337
#5 0x00007f3e92e5744e in __GI___libc_free (mem=<optimized out>) at malloc.c:3145
#6 0x00007f3e113921e9 in FDKfree (ptr=0x7f3de009df60) at libSYS/src/genericStds.cpp:233
#7 0x00007f3e1130d7d3 in Free_AacEncoder (p=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:407
#8 0x00007f3e1130fbb3 in aacEncClose (phAacEncoder=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:1395
Ce retour/trace de la pile d'erreur est reproductible si je lance répéter de référence suffisamment de fois , mais je vais avoir un moment difficile la compréhension de ce que pourrait être la cause de cette erreur? La mémoire allouée à pointeur 0x7f3de009df60
est allouée à l'intérieur de la RPC/C le code et je peux garantir que la même instance qui est alloué est libéré. L'indice de référence est, bien sûr - single-threaded.
Après la lecture de ces:
les contrôles de sécurité &&
fonctions internes
Je suis encore avoir du mal à comprendre - ce qui pourrait être un réel (non-exploitation, mais plutôt d'erreur)) scénario qui m'amène à obtenir l'erreur ci-dessus? et pourquoi faut-il se produire très peu?
Actuel de suspicion:
À effectuer un backtrace, je reçois cette entrée:
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
set = {__val = {4, 6378670679680, 645636045657660056, 90523359816, 139904561311072, 292199584, 139903730612120, 139903730611784, 139904561311088, 1460617926600, 47573685816, 4119199860131166208,
139904593745464, 139904553224483, 139904561311136, 288245657}}
pid = <optimized out>
tid = <optimized out>
#1 0x00007f3e92e00f5d in __GI_abort () at abort.c:90
save_stage = 2
act = {__sigaction_handler = {sa_handler = 0x7f3de026db10, sa_sigaction = 0x7f3de026db10}, sa_mask = {__val = {139903730540556, 19, 30064771092, 812522497172832284, 139903728706672, 1887866374039011357,
139900298780168, 3775732748407067896, 763430436865, 35180077121538, 4119199860131166208, 139904561311552, 139904553065676, 1, 139904561311584, 139904561312192}}, sa_flags = 4096,
sa_restorer = 0x14}
sigs = {__val = {32, 0 <repeats 15 times>}}
#2 0x00007f3e92e4928d in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f3e92f70528 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:181
ap = {{gp_offset = 40, fp_offset = 32574, overflow_arg_area = 0x7f3e11adf1d0, reg_save_area = 0x7f3e11adf160}}
fd = <optimized out>
list = <optimized out>
nlist = <optimized out>
cp = <optimized out>
written = <optimized out>
#3 0x00007f3e92e5064a in malloc_printerr (action=<optimized out>, str=0x7f3e92f6cdee "corrupted size vs. prev_size", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5426
buf = "00007f3de009e9f0"
cp = <optimized out>
ar_ptr = <optimized out>
ptr = <optimized out>
str = 0x7f3e92f6cdee "corrupted size vs. prev_size"
action = <optimized out>
#4 0x00007f3e92e5304a in _int_free (av=0x7f3de0000020, p=<optimized out>, have_lock=0) at malloc.c:4337
size = 2720
fb = <optimized out>
nextchunk = 0x7f3de009e9f0
nextsize = 736
nextinuse = <optimized out>
prevsize = <optimized out>
bck = <optimized out>
fwd = <optimized out>
errstr = 0x0
locked = <optimized out>
#5 0x00007f3e92e5744e in __GI___libc_free (mem=<optimized out>) at malloc.c:3145
ar_ptr = <optimized out>
p = <optimized out>
hook = <optimized out>
#6 0x00007f3e113921e9 in FDKfree (ptr=0x7f3de009df60) at libSYS/src/genericStds.cpp:233
No locals.
#7 0x00007f3e1130d7d3 in Free_AacEncoder (p=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:407
No locals.
#8 0x00007f3e1130fbb3 in aacEncClose (phAacEncoder=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:1395
hAacEncoder = 0x7f3de009df60
err = AACENC_OK
- Dans le cadre #6, vous pouvez voir le pointeur en question est
0x7f3de009df60
. - Dans le cadre #4, vous pouvez voir que la taille est 2720, qui est en effet la taille attendue de la structure d'être libéré.
- Cependant l'adresse de
nextchunk
est0x7f3de009e9f0
, qui est à seulement 2704 octets après le pointeur courant qui est publié. - Je peux confirmer que c'est toujours le cas lorsque l'erreur se reproduit.
- Cela pourrait être une forte indication de l'erreur que je suis face ??
- Je vous recommande de prendre un peu de recul, et la construction d'un un minimum de reproductibles exemple pour trouver la gestion de la mémoire bug dans votre code. Alors qu'il n'est pas impossible que l'analyse des adresses révèle le problème, ce bas-niveau pitreries devrait être un dernier recours, en particulier compte tenu de la probabilité que votre programme a UB (et que, par conséquent, ces adresses ne peuvent même pas être digne de confiance). De toute façon, sans une telle MCVE, nous ne serons pas de débogage ici....
- Utiliser valgrind ou de l'Adresse de Désinfectant.
- je vous remercie pour votre réponse détaillée. Comme la génération d'un MCVE serait assez difficile (encore une fois, cette erreur n'est pas toujours reproductible), peut-être que nous devrions commencer par une question plus simple - en ce qui concerne la pratique de la compréhension de l'erreur "corrompu taille et prev_size" - avez-vous une idée de ce qui aurait pu déclencher cette erreur dans un programme?
- Oui, la génération de MCVEs est dur, mais rien ne vaut de faire est jamais facile. C'est le travail que vous avez à faire. Le débogage est la première étape. J'ai pleinement conscience que c'est tentant d'essayer de sauter cette étape en revenant plus des lignes directrices générales, mais ce n'est tout simplement pas pratique jusqu'à ce que vous avez repéré sur le problème. Bonne chance!
Vous devez vous connecter pour publier un commentaire.
OK, donc j'ai réussi à surmonter ce problème.
Tout d'abord, Une mise en pratique cause de "corrompu taille et prev_size" est assez simple - mémoire morceau de contrôle de la structure des champs dans les zones adjacentes suivantes morceau sont en train d'être remplacé à cause des limites d'accès par le code. si vous allouer
x
octets pour pointeurp
mais la liquidation de l'écriture au-delà dex
en ce qui concerne le pointeur de même, cette erreur peut s'afficher, indiquant l'actuelle allocation de mémoire (morceau) la taille n'est pas la même chose que ce que l'on trouve dans la partie suivante de la structure de contrôle (à cause d'écrasement).Que pour la cause de cette fuite de mémoire - de la structure de la cartographie réalisée dans le Java/JNA couche implicite différents
#pragma
liées rembourrage/alignement de ce que dll/so a été compilé avec. Cela, à son tour, a provoqué l'écriture des données au-delà de la répartition de la structure de la frontière. La désactivation de l'alignement fait de la question de s'en aller. (En milliers d'exécutions sans un seul accident!).#pragma pack(pop)
à la fin à la place?#pragma
: stackoverflow.com/questions/33437269/...