Comment déboguer les erreurs du compilateur C en Python? (erreur malloc)

Je fais du développement web en utilisant Cherrypy en Python.

J’avais une page Web opérationnelle ne contenant pas d’erreurs, mais après avoir commencé à utiliser Mako pour les codes frontaux pour le paramétrer, le message d’erreur suivant s’affiche.

 Python quit unexpectedly while using the libmysqlclient.18.dylib plug-in. 

De plus, il génère l’erreur suivante sur la console.

 127.0.0.1 - - [09/Apr/2014:11:20:00] "GET /submit_data?idx=2 HTTP/1.1" 200 5990 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36" python(375,0x103980000) malloc: *** error for object 0x7fb5a4061000: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug Abort trap: 6 

Cela ressemble à une erreur du compilateur C, et peut-être à MySQL, mais je ne peux pas comprendre ce qui ne va pas.

Que puis-je faire? J’imagine que j’utilise peut-être MySQL de manière erronée, en joignant l’extrait de code Python dans lequel je me connecte à des bases de données MySQL et l’utilise.

 dbdict = {} for name in params["dashboards"]: for chart in params["dashboards"][name]: dbdict[chart["dbname"]] = None def connect(thread_index): for name in dbdict: db = params["db"][name] dbdict[name] = MySQLdb.connect(db["host"], db["user"], db["password"], db["dbname"]) cherrypy.engine.subscribe('start_thread', connect) class AjaxApp(object): @cherrypy.expose @cherrypy.tools.mako(filename="index.html", directories=MEDIA_DIR) def index(name=None): return {'size': len(params["dashboards"]["first"])} @cherrypy.expose def submit_data(self, idx): idx = int(idx) chart = params["dashboards"]["first"][idx] # Sample page that displays the number of records in "table" # Open a cursor, using the DB connection for the current thread c = dbdict[chart["dbname"]].cursor() print 'query being executed......' c.execute(chart["command"]) print 'query being fetched......' res = c.fetchall() c.close() # construct a JSON object from query result jsres = [] jsres.append(chart["selected"]) q_result = [] for x in res: tmp_arr = [] for i in x: if type(i) is datetime.datetime: tmp_arr.append(str(i)) else: tmp_arr.append(i) q_result.append(tmp_arr) jsres.append(q_result) return json.dumps(jsres) 

Ici, je me connecte à toutes les bases de données utilisées et les mets dans un dictionnaire python. Chaque fois que j’exécute une commande de requête, je cherche l’object de firebase database correspondant et effectue des requêtes à l’aide de cette commande.


Maintenant, ma fonction de connect ressemble à ceci

 def connect(thread_index): for name in dbdict: print name db = params["db"][name] cherrypy.thread_data.db = MySQLdb.connect(db["host"], db["user"], db["password"], db["dbname"]) dbdict[name] = cherrypy.thread_data.db 

J’ai la même erreur.

Il semble que vous partagiez une seule connexion entre plusieurs threads (vous créez une seule connexion pour chaque firebase database dans votre fonction connect() ). Cela peut entraîner des problèmes de synchronisation inattendus, en particulier si une bibliothèque C n’est pas écrite pour la gérer. Essayez de joindre vos objects de connexion à cherrypy.thread_data comme indiqué ici .

Voici comment je l’écrirais (non testé):

 def connect(thread_index): cherrypy.thread_data.dbdict = dbdict = {} for name in params["dashboards"]: for chart in params["dashboards"][name]: dbdict[chart["dbname"]] = None for name in dbdict db = params["db"][name] dbdict[name] = MySQLdb.connect(db["host"], db["user"], db["password"], db["dbname"]) 

Et ensuite dans submit_data() :

 @cherrypy.expose def submit_data(self, idx): ... c = cherrypy.thread_data.dbdict[chart["dbname"]].cursor() 

python (375,0×103980000) malloc: * erreur pour l’object 0x7fb5a4061000: le pointeur en cours de libération n’a pas été alloué * définir un point d’arrêt dans malloc_error_break pour déboguer

Oui, c’est l’erreur de programme C que vous avez mentionnée qui pourrait être due à MYSQL. L’erreur indique que quelque part dans votre programme, vous transmettez l’adresse qui n’est pas allouée et reçue par l’appel dynamic malloc / calloc / realloc. free () attend la mémoire reçue par malloc / calloc / realloc. Lors de l’appel de free (), le gestionnaire de mémoire vérifie la cohérence de l’adresse d’entrée et, s’il le fait, s’il ne passe pas, il envoie un tel message d’erreur et abandonne le programme.

Dans votre programme, pour une raison quelconque, une mémoire incorrecte est passée à free (). Maintenant, il serait un peu difficile de comprendre la raison possible de votre code PHP / MYSQL. Je vous suggérerais que vous souhaitiez peut-être associer votre programme à un outil dynamic et déterminer la cause de ce problème. Vous voudrez peut-être vous référer à mon précédent article sur ces articles.

https://stackoverflow.com/a/22658693/2724703