erreur de segmentation dans g_slice_alloc

J’appelle une fonction avec les lignes suivantes:

void call_system_command(const char *command_params) { GSsortingng *cmd = g_ssortingng_sized_new(1024); g_ssortingng_append_printf(cmd, "/bin/bash /path/to/my/script '%s'", command_params); system(cmd->str); g_ssortingng_free(cmd, TRUE); } 

Je suis segfault dans la ligne avec g_ssortingng_sized_new. La trace de gdb montre:

 (gdb) bt #0 0x000000320ce56264 in g_slice_alloc () from /lib64/libglib-2.0.so.0 #1 0x000000320ce5c3db in g_ssortingng_sized_new () from /lib64/libglib-2.0.so.0 .... 

J’ai essayé d’exporter G_SLICE = always-malloc, de sorte qu’au lieu de l’allocateur de glib, malloc est utilisé. Cependant le problème rest le même. Je me fais toujours segfault dans g_slice_alloc. Aussi, j’appelle cette fonction ‘call_system_command’ à partir de plusieurs threads. Cela pourrait-il être un problème?

La fonction fait partie du plugin appelé par cron toutes les 15 minutes. Le segfault ne se produit pas à chaque fois que le plugin est exécuté, mais tous les 3-4 jours.

Tout pointeur sur le débogage ultérieur sera utile.

Merci d’avance.

Vous devez exécuter votre application sous Valgrind pour vous aider à résoudre ce problème. Cela ressemble à de la corruption de tas.

Vous parlez de sujets, ce qui bien sûr est une bonne information, car il peut être plus facile d’avoir des problèmes.

La documentation glib indique:

GLib lui-même est totalement thread-safe en interne (toutes les données globales sont automatiquement verrouillées), mais les instances de structure de données individuelles ne sont pas automatiquement verrouillées pour des raisons de performances.

Et comme l’API de tranche n’expose aucune instance de structure de données, vous devez pouvoir appeler à partir de plusieurs threads.

J’ai trouvé le problème. A écrit le programme de test suivant pour identifier le problème.

 #include  #include  #include  #pragma GCC optimize("O0") #define NUM 20 void* run(void *d) { int i; for (i = 0; i < 1000000; i++) { GString *str = g_string_sized_new(1024); g_string_append_printf(str, "%s", "hello hello\n"); fprintf(stdout, "%s", str->str); g_ssortingng_free(str, TRUE); } pthread_exit(NULL); } int main() { pthread_t threads[NUM]; int j; for (j = 0; j < NUM; j++) { pthread_create(&threads[j], NULL, run, (void*) NULL); } pthread_exit(NULL); return 0; } 

Le segfault suivant se produit régulièrement

Programmer le signal reçu SIGSEGV, Erreur de segmentation. [Passage au thread 0x7fffecdfa700 (LWP 11277)] 0x000000320ce56257 dans g_slice_alloc () à partir de /lib64/libglib-2.0.so.0 Absence de débogage séparé, utilisez: debuginfo-install glib2-2.22.5-6.el6.x86_64. 1.47.el6.x86_64 libgcc-4.4.6-3.el6.x86_64

Où se trouve votre déclaration pthread_join ? Votre fonction principale pourrait en fait se terminer avant le retour de vos fonctions de thread, ce qui pourrait détruire les objects de thread eux-mêmes. Autant que je sache, pthread_exit est censé être utilisé uniquement dans les threads générés, et non dans le thread principal ( http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.html , http: // man7. org / linux / man-pages / man3 / pthread_exit.3.html ) Votre démo n’est donc pas optimale et peut intégrer le même problème que votre programme.

Avez-vous essayé de malloc manuellement une mémoire de même taille et de vérifier à nouveau avec valgrind et gdb.