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

2024-06-09 10:39:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

^{pr2}$

这看起来像是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

我也有同样的错误。在


Tags: thenameinfordbconnect错误chart
2条回答

python(375,0x103980000) malloc: * error for object 0x7fb5a4061000: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug

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

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

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

看起来您在多个线程之间共享一个连接(您为connect()函数中的每个db创建一个连接)。如果不是用C编写的,则可能会导致出现意外的同步问题。尝试将连接对象附加到cherrypy.thread_data,如here所示。在

以下是我的写作方法(未经测试):

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()中:

^{pr2}$

相关问题 更多 >