如何在Python中调试C编译器错误? (malloc错误)

我正在使用Python中的Cherrypy进行Web开发。

我有一个没有错误的工作网页,但在我开始使用Mako作为前端代码进行参数化之后,会弹出以下错误消息。

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

它也在控制台上抛出以下错误。

 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 

这似乎是来自C编译器的错误,也许是由于MySQL,但我无法弄清楚出了什么问题。

我能做什么? 我猜可能是我以错误的方式使用MySQL,我附加了Python代码片段,我在其中连接MySQL数据库并使用它。

 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) 

在这里,我连接到所有使用的dbs,并将它们放在python字典中,每当我运行查询命令时,我查找相应的db对象,并使用它进行查询。


现在我的connect函数看起来像这样

 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 

我有同样的错误。

看起来你在多个线程之间共享一个连接(你在connect()函数中为每个数据库创建一个连接)。 这可能会导致意外的同步问题,尤其是在未编写C库来处理它的情况下。 尝试将连接对象附加到cherrypy.thread_data ,如下所示。

这是我写它的方式(未经测试):

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

然后在submit_data()

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

python(375,0×103980000)malloc: *对象0x7fb5a4061000的错误:未释放指针被释放*在malloc_error_break中设置断点以进行调试

是的,这是您提到的C程序错误可能是由于MYSQL。 该错误表明程序中的某个位置,您正在传递未分配的地址,并通过malloc / calloc / realloc动态调用接收。 free()需要malloc / calloc / realloc接收的内存。 当free()调用时,内存管理器会对输入地址进行一些健全性检查,如果没有通过则会执行此操作,它会抛出此类错误消息并中止程序。

在你的程序中,由于某种原因,错误的内存被传递给free()。 现在,从PHP / MYSQL代码中了解可能的原因有点困难。 我建议你,你可能想在动态工具中附加你的程序,并找出导致这个问题的原因。 您可能想参考我之前关于这些文章的post。

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