1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Improvements to memory leak detection. The --backtrace=NNN option is now

recognized by tester.tcl.  Memory leak summaries are automatically written
to the file ./memleak.txt and each leak is tagged with the test in which
it occurred.  The quick.test script runs on Linux with no errors and
no leaks. (CVS 4273)

FossilOrigin-Name: 21f6b31097692171c6493e6ca6de6acbd62dc595
This commit is contained in:
drh
2007-08-23 02:47:53 +00:00
parent ed138fb3bc
commit 4a50aac564
20 changed files with 212 additions and 108 deletions

View File

@@ -13,7 +13,7 @@
** This file contains code used to implement test interfaces to the
** memory allocation subsystem.
**
** $Id: test_malloc.c,v 1.3 2007/08/22 22:04:37 drh Exp $
** $Id: test_malloc.c,v 1.4 2007/08/23 02:47:53 drh Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@@ -27,7 +27,16 @@
static void pointerToText(void *p, char *z){
static const char zHex[] = "0123456789abcdef";
int i, k;
sqlite3_uint64 n = (sqlite3_uint64)p;
unsigned int u;
sqlite3_uint64 n;
if( sizeof(n)==sizeof(p) ){
memcpy(&n, &p, sizeof(p));
}else if( sizeof(u)==sizeof(p) ){
memcpy(&u, &p, sizeof(u));
n = u;
}else{
assert( 0 );
}
for(i=0, k=sizeof(p)*2-1; i<sizeof(p)*2; i++, k--){
z[k] = zHex[n&0xf];
n >>= 4;
@@ -46,6 +55,7 @@ static int hexToInt(int h){
static int textToPointer(const char *z, void **pp){
sqlite3_uint64 n = 0;
int i;
unsigned int u;
for(i=0; i<sizeof(void*)*2 && z[0]; i++){
int v;
v = hexToInt(*z++);
@@ -53,7 +63,14 @@ static int textToPointer(const char *z, void **pp){
n = n*16 + v;
}
if( *z!=0 ) return TCL_ERROR;
*pp = (void*)n;
if( sizeof(n)==sizeof(*pp) ){
memcpy(pp, &n, sizeof(n));
}else if( sizeof(u)==sizeof(*pp) ){
u = (unsigned int)n;
memcpy(pp, &u, sizeof(u));
}else{
assert( 0 );
}
return TCL_OK;
}
@@ -289,6 +306,38 @@ static int test_memdebug_pending(
}
/*
** Usage: sqlite3_memdebug_settitle TITLE
**
** Set a title string stored with each allocation. The TITLE is
** typically the name of the test that was running when the
** allocation occurred. The TITLE is stored with the allocation
** and can be used to figure out which tests are leaking memory.
**
** Each title overwrite the previous.
*/
static int test_memdebug_settitle(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
const char *zTitle;
if( objc!=2 ){
Tcl_WrongNumArgs(interp, 1, objv, "TITLE");
return TCL_ERROR;
}
zTitle = Tcl_GetString(objv[1]);
#ifdef SQLITE_MEMDEBUG
{
extern int sqlite3_memdebug_settitle(const char*);
sqlite3_memdebug_settitle(zTitle);
}
#endif
return TCL_OK;
}
/*
** Register commands with the TCL interpreter.
*/
@@ -306,6 +355,7 @@ int Sqlitetest_malloc_Init(Tcl_Interp *interp){
{ "sqlite3_memdebug_dump", test_memdebug_dump },
{ "sqlite3_memdebug_fail", test_memdebug_fail },
{ "sqlite3_memdebug_pending", test_memdebug_pending },
{ "sqlite3_memdebug_settitle", test_memdebug_settitle },
};
int i;
for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){