Issue 155: crash while trying to run a query against a SQL 2008 R2 server (Mac OSX)
Status:  NoFix
Owner: ----
Closed:  Feb 2011
Reported by amsi...@gmail.com, Feb 7, 2011
What steps will reproduce the problem?
1.  The function below is run in a loop, it runs successfully 14 times, then the crash below happens

What is the expected output? 
Checking staging table to see if we have already started downloading Answers.ask.com...
   9263 pages and 926268 rows previously read
Domain: Answers.ask.com, Markets: set([u'Answerbag']), Names: set([u'Answers.ask.com'])
Saving to: ccinterface.txt
Received 926200/926268 rows, page 9263
Answers.ask.com Already read all 926268 rows
2011-02-07 15:55:00.772270: Completed Answers.ask.com

What do you see instead?
Checking staging table to see if we have already started downloading THISNEXT.COM...
Python(36888,0x7fff70eb9ca0) malloc: *** error for object 0x102402890: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap


What version of the product are you using? On what operating system?
I have Python 2.7.1 installed, pyodbc-2.1.8, Actual Technologies "Actual SQL Driver".   OS is Mac OS X 10.6.6 (10J567).  I realize that this could be a driver problem, but would like to confirm that this is not a known pyodbc issue.  Dump info is attached.


Please provide any additional information below.

def get_highest_page_number(cxn, competitor):
    querytxt = """SELECT MAX(Page) AS max_page_number
                  , MAX(RowNumber) AS max_row_number
                  FROM dbo.StagingCCInterface WHERE TargetDomain = CAST(? AS NVARCHAR(MAX))"""
    max_page_number = 0
    max_row_number = 0
    try:
        cursor = cxn.cursor()
        cursor.execute(querytxt, ( competitor ))
        row = cursor.fetchone()
        if (row != None):
            max_page_number, max_row_number = row.max_page_number, row.max_row_number
            if ( max_page_number == None ):
                max_page_number = 1
            if ( max_row_number == None):
                max_row_number = 0
        else:
            max_page_number, max_row_number = 1, 0
    except Exception, x:
        print 'Failed to execute query:\n{0}\n----Error: {1}'.format(querytxt,x.message)
        exit(-1)
    finally:
        if (cursor != None):
            cursor.nextset()
            cursor.close()
    return max_page_number, max_row_number


dumpinfo.txt
29.0 KB   View   Download
Feb 7, 2011
#1 amsi...@gmail.com
Doh!  Still getting used to Python and its garbage collector.  I altered the function slightly to have the variable "cursor" assume a value of "None" before the try block.  This seems to have resolved the issue, presumably because it is no longer dropping out of scope at the time the "finally" block executes. 
Feb 27, 2011
Project Member #2 mkleehammer
I'm glad you found a work around.  (Actually, not just a work around - you would need that change for memory, presumably.)

I hate to point fingers, but from the dump I'm suspecting a FreeTDS issue.  I'm going to close this for now, but please let me know if you see any new issues.  Thanks for the report.

Status: NoFix