Une erreur d'exécution de débordement se produit lorsque mon programme C++ essaie d'écrire des images .png dans un répertoire.Echec d'écriture de l'image dans le répertoire
Le répertoire dans lequel les images sont écrites est donné en tant qu'argument de ligne de commande. Le programme est compilé avec gcc -ggdb3 -O3. Il est étrange que l'erreur disparaisse si je change le répertoire en un autre quand je le relance, ou si je compile mon programme sans optimisation. Je suis confus. Même si je peux obtenir les images produites par un exécutable non optimisé ou dans un autre répertoire, je doute que les résultats soient fiables car l'exécutable optimisé peut avoir une erreur d'exécution? Ou est-il possible que l'optimisation produise un exécutable sujet aux erreurs? Quelqu'un pourrait-il expliquer cela?
J'ai essayé de déboguer l'exécutable optimisé car il est compilé avec gcc -ggdb3 -O3, mais l'endroit où il produit une erreur de débordement ne donne pas le code source, que je ne peux pas obtenir une idée de:
(BDG) bt
# 0 0x00007fbd29573fb5 en augmentation() à partir de /lib/libc.so.6
# 1 0x00007fbd29575bc3 dans abort() à partir de /lib/libc.so.6
# 2 0x00007fbd295b3228 dans ??() À partir de /lib/libc.so.6
# 3 0x00007fbd296402c7 dans __fortify_fail() à partir de /lib/libc.so.6
# 4 0x00007fbd2963e170 dans __chk_fail() à partir de /lib/libc.so. 6
# 5 0x00007fbd2963d519 dans ??() À partir de /lib/libc.so.6
# 6 0x00007fbd295b7426 dans _IO_default_xsputn() à partir de /lib/libc.so.6
# 7 0x00007fbd29586fdb dans vfprintf() à partir de /lib/libc.so. 6
# 8 0x00007fbd2963d5b9 dans __vsprintf_chk() à partir de /lib/libc.so.6
# 9 0x00007fbd2963d500 dans __sprintf_chk() à partir de /lib/libc.so.6
# 10 0x0000000000408695 dans principal()
(gdb) f 10
# 10 0x0000000000408695 en main()
Langue actuelle: auto; actuellement asm
(gdb) Liste
1 /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S: Aucun fichier ou répertoire.
dans /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S
(gdb)
Je ne sais pas si la sortie du moteur d'exécution erreur pourrait aider à analyser le problème.Si elle pouvait, voici comment le message d'erreur ressemble, un peu grand temps que:
* débordement de tampon détecté *:/cis/home/tim/recherche/absurde/absurditylinux/binio21/libération/absurdité terminée
[Nouveau fil 0x7fbd2acd9740 (LWP 2347)]
======= Backtrace: =========
/lib/libc.so.6 (__fortify_fail + 0x37) [0x7fbd296402c7]
/lib/libc.so.6[0x7fbd2963e170]
/lib/libc.so.6[0x7fbd2963d519]
/lib/libc.so.6(_IO_default_xsputn+0x96)[0x7fbd295b7426]
/lib/libc.so.6(_IO_vfprintf+0x63b)[0x7fbd29586fdb]
/lib/libc.so.6(__vsprintf_chk+0x99)[0x7fbd2963d5b9]
/lib/libc.so.6 (__sprintf_chk + 0x80) [0x7fbd2963d500]
/cis/home/tim/recherche/absurde/absurditylinux/binio21/release/absurdité [0x408695]
/lib/libc.so.6(__libc_start_main+0xe6)[0x7fbd2955f5a6]
/cis/Accueil/tim/recherche/absurde/absurditylinux/binio21/release/absurdité [0x4045d9]
======= carte mémoire: ========
00400000-00471000 r-xp 00000000 00:39 52084894/cis/home/tim/recherche/absurdité/absurditylinux/binio21/libération/absurdité
00671000-00672000 r - p 00071000 52084894 00h39/cis/home/tim/recherche/absurde/absurditylinux/binio21/release/absurdité
00672000-00673000 rw-p 00072000 52084894 00h39/cis/Accueil/tim/recherche/absurde/absurditylinux/binio21/release/absurdité
00673000-00675000 rw-p 00673000 00:00 0
00943000-00964000 rw-p 00943000 00:00 0 [tas]
7fbd273f7000-7fbd29339000 rw-p 7fbd273f7000 00:00 0
7fbd29339000-7fbd29340000 r-xp 00000000 35791448 08:01 /lib/librt-2.9.so
7fbd29340000-7fbd2953f000 --- p 00007000 35791448 08:01 /lib/librt-2.9.so
7fbd2953f000 -7fbd29540000 r - p 00006000 35791448 08:01 /lib/librt-2.9.so
7fbd29540000-7fbd29541000 rw-p 00007000 35791448 08:01 /lib/librt-2.9.so
7fbd29541000-7fbd296a9000 r -xp 00000000 08:01 35791428 /lib/libc-2.9.si
7fbd296a9000-7fbd298a9000 --- p 00168000 35791428 08:01 /lib/libc-2.9.so
7fbd298a9000-7fbd298ad000 r - p 00168000 35791428 08:01 /lib/libc-2.9.so
7fbd298ad000-7fbd298ae000 rw-p 0016c000 08:01 35791428 /lib/libc-2.9.so
7fbd298ae000-7fbd298b3000 rw-p 7fbd298ae000 00:00 0
7fbd298b3000-7fbd298c9000 r-xp 00.000.000 08: 01 35790870 /lib/libgcc_s.so.1
7fbd298c9000-7fbd29ac9000 --- p 00016000 35790870 08:01 /lib/libgcc_s.so.1
7fbd29ac9000-7fbd29aca000 r - p 00016000 35790870 08:01 /lib/libgcc_s.so.1
7fbd29aca000-7fbd29acb000 rw-p 00017000 35790870 08:01 /lib/libgcc_s.so.1
7fbd29acb000-7fbd29ad3000 r-xp 00000000 71705955 08:01 /usr/lib/libgomp.so.1.0.0
7fbd29ad3000-7fbd29cd2000 --- p 00008000 08:01 71705955 /usr/lib/libgomp.so.1.0.0
7fbd29cd2000-7fbd29cd3000 r - p 00007000 71705955 08h01 /usr/lib/libgomp.so.1.0.0
7fbd29cd3000-7fbd29cd4000 rw-p 00008000 71705955 08h01/usr/lib/libgomp. so.1.0.0
7fbd29cd4000-7fbd29d58000 r-xp 00000000 35791436 08:01 /lib/libm-2.9.so
7fbd29d58000-7fbd29f57000 --- p 00084000 35791436 08:01 /lib/libm-2.9 .so
7fbd29f57000-7fbd29f58000 r - p 00083000 08:01 35791436 /lib/libm-2.9.so
7fbd29f58000-7fbd29f59000 rw-p 00084000 35791436 08:01 /lib/libm-2.9.so
7fbd29f59000-7fbd2a04a000 r-xp 00000000 71704918 08:01 /usr/lib/libstdc++.so.6.0.10
7fbd2a04a000-7fbd2a24a000 --- p 000f1000 08:01 71704918 /usr/lib/libstdc++.so.6.0.10
7fbd2a24a000-7fbd2a251000 r - p 000f1000 08:01 71704918/usr/lib/libstdC++ .so.6.0.10
7fbd2a251000-7fbd2a253000 rw-p 000f8000 08:01 71704918 /usr/lib/libstdc++.so.6.0.10
7fbd2a253000-7fbd2a266000 rw-p 7fbd2a253000 00:00 0
7fbd2a266000-7fbd2a27d000 r-xp 00000000 35791446 08:01 /lib/libpthread-2.9.so
7fbd2a27d000-7fbd2a47c000 --- p 00017000 35791446 08h01 /lib/libpthread-2.9.so
7fbd2a47c000-7fbd2a47d000 r - p 00016000 35791446 08h01 /lib/libpthread-2.9.si
7fbd2a47d000-7fbd2a47e000 rw-p 00017000 35791446 08h01 /lib/libpthread-2.9.so
7fbd2a47e000-7fbd2a482000 rw-p 7fbd2a47e000 00:00 0
7F
Programme a reçu signal SIGABRT, abandonné.
[Mise à Enfiler 0x7fbd2acd9740 (LWP 2347)]
0x00007fbd29573fb5 en augmentation() de /lib/libc.so.6
vraiment apprécier votre aide!
Merci pour votre intérêt!
@@ @@ MISE A JOUR: gars vous avez raison! J'ai augmenté la taille de la matrice char pour le nom de fichier long et maintenant c'est bien! L'exécutable est/cis/home/tim/research/absurdity/absurditylinux/binio21/release/absurdity. L'exécutable est/cis/home/tim/research/absurdity/absurditylinux/binio21/release/absurdity. Le répertoire qui ne fonctionne pas est spécifié en tant qu'argument de ligne de commande --result-path = ../results1/FrancContinuity1/noise0/train-imgs, qui est stocké dans global.result_path dans ce qui suit. Pourriez-vous me dire comment vous pensez que c'est le problème que vous avez mentionné? __sprintf_chk() et __vsprintf_chk() sont-ils toujours appelés par sprintf()?
Voici le code.
Partie 1:
char filename[50];
sprintf(filename, "%s/%d_%d.png", global.result_path, train_samples[n].label, train_samples[n].label==1 ? ++nb_pos : ++nb_neg);
train_samples[n].write_png(filename);
Partie 2:
class Global { //parameters of program
public:
int niceness; //The process scheduling priority
int random_seed; //The seed for the random sequence used in the computation
char result_path[1024]; //Where to store the generated results (images, logs, etc.)
...
}
Global global;
Avez-vous du code disponible? Il me semble que vous avez un problème avec les arguments d'un appel à sprintf. comme peut-être la chaîne que vous imprimez aussi est trop petite? – Matt
Hungry ... besoin de code! – count0
Merci! S'il vous plaît voir mon édition à la fin de l'article original. – Tim