¿Cómo depurar compiler errors de C en Python? (error malloc)

Estoy haciendo desarrollo web usando Cherrypy en Python.

Tenía una página web en funcionamiento que no tenía errores, pero después de que comencé a usar Mako para los códigos de usuario para parametrizarla, aparece el siguiente mensaje de error.

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

También está lanzando el siguiente error en la consola.

 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 

Parece un error del comstackdor de C, y tal vez debido a MySQL, pero no puedo entender qué está mal.

¿Que puedo hacer? Supongo que tal vez estoy usando MySQL de una manera incorrecta, estoy adjuntando el fragmento de código Python en el que hago conexiones a las bases de datos MySQL y las uso.

 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) 

Aquí me estoy conectando a todos los dbs que se utilizan, y los coloco en un diccionario de python, y cada vez que ejecuto un comando de consulta, busco el objeto db correspondiente y hago consultas al usarlo.


Ahora mi función de connect ve así

 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 

Estoy teniendo el mismo error.

Parece que estás compartiendo una única conexión entre varios subprocesos (estás creando una única conexión para cada db en tu función connect() ). Esto puede causar problemas de sincronización inesperados, especialmente si no se escribe una biblioteca de C para manejarlo. Intente adjuntar sus objetos de conexión a cherrypy.thread_data como se muestra aquí .

Así es como lo escribiría (no probado):

 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"]) 

Y luego en submit_data() :

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

python (375,0×103980000) malloc: * error para el objeto 0x7fb5a4061000: no se asignó el puntero que se liberó * establecer un punto de interrupción en malloc_error_break para depurar

Sí, este es el error del progtwig C que usted mencionó podría deberse a MYSQL. El error indica que en algún lugar de su progtwig está pasando la dirección que no es asignada ni recibida por malloc / calloc / realloc dynamic call. free () espera la memoria recibida por malloc / calloc / realloc. Mientras se realiza la llamada gratuita (), el administrador de memoria realiza algunas comprobaciones de seguridad en la dirección de entrada y, al hacerlo, si no pasa, emite ese mensaje de error y cancela el progtwig.

En su progtwig, debido a alguna razón, la memoria incorrecta se pasa a free (). Ahora sería un poco difícil entender la posible razón de su código PHP / MYSQL. Le sugiero que desee adjuntar su progtwig en una herramienta dinámica y averiguar cuál está causando este problema. Es posible que desee consultar mi publicación anterior en este artículo.

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