2017-05-09 3 views
4

J'ai un thread en cours d'exécution (OS X 10.10.5) qui se bloque avec cette trace de pile. C'est après environ 20 heures de fonctionnement, probablement lié à une condition de mémoire faible. Mais, la question est, pourquoi malloc ne retourne-t-il pas juste null? Pourquoi l'exécution du thread doit-elle s'arrêter? Le nombre réel d'octets requis est petit (pour une opération de chaîne sur un chemin).Pourquoi malloc ne revient-il pas?

std::wstring finalPath = itsPath.substr(0,ls+1); 

    1 operator new(unsigned long) + 37 (libc++abi.dylib + 124485) [0xa0339645] 2 
    1 malloc + 29 (libsystem_malloc.dylib + 3997) [0xa1829f9d] 2 
    1 malloc_zone_malloc + 116 (libsystem_malloc.dylib + 7243) [0xa182ac4b] 2 
    1 default_zone_malloc + 3 (libsystem_malloc.dylib + 67909) [0xa1839945] 2 
    *1 thread_exception_return + 0 (kernel + 632362) [0xffffff800029a62a] (runnable) 2 

Le but de l'opération qui n'est d'effacer un répertoire temporaire de sorte que le disque de démarrage ne remplit pas les fichiers temporaires générés par le programme. Ce processus échoue, le disque se remplit en effet, le thread s'arrête (comme dans vraiment arrête, et le thread principal est joint à lui), et le processus de suppression des fichiers du disque s'arrête. En outre, le processus doit être arrêté car le thread est arrêté. Je ne sais pas si vous pourriez vraiment appeler cela un bug puisque le processus qui échoue est une tentative pour empêcher ce qui se passe réellement.

Nous vous remercions de vos commentaires.

+1

* probablement lié à une condition de mémoire faible * - En d'autres termes, un bug dans votre programme. – PaulMcKenzie

+7

@PaulMcKenzie, pourquoi sur Terre? Il existe de nombreux scénarios qui conduisent à des conditions de mémoire faible sans aucun bogue. – SergeyA

+0

Il ne semble pas que vous appeliez 'malloc' directement mais à la place vous appelez' new'. 'new' est autorisé à lancer à moins que vous n'utilisiez' no throw', ce qui pourrait être le problème. – NathanOliver

Répondre

0

Vous mentionnez que le disque est plein, donc le noyau essaie probablement d'échanger la mémoire vers le disque et d'échouer. Dans cette situation, macOS suspend, plutôt que de tuer des processus hors de contrôle. L'idée est de libérer de l'espace et/ou de fermer d'autres applications, puis de reprendre le processus suspendu, par exemple en utilisant kill -CONT <PID>. Par le son, le vrai problème est que vous allouer trop de mémoire, ou une fuite de mémoire.