Option to skip slow addr2line resolution in leak-detective

This commit is contained in:
Martin Willi
2010-05-20 17:37:18 +02:00
parent 36c1650b19
commit 091d178060
7 changed files with 80 additions and 53 deletions
+37 -31
View File
@@ -233,39 +233,45 @@ static bool is_whitelisted(backtrace_t *backtrace)
/**
* Report leaks at library destruction
*/
void report_leaks()
static void report(private_leak_detective_t *this, bool detailed)
{
memory_header_t *hdr;
int leaks = 0, whitelisted = 0;
for (hdr = first_header.next; hdr != NULL; hdr = hdr->next)
if (lib->leak_detective)
{
if (is_whitelisted(hdr->backtrace))
{
whitelisted++;
}
else
{
fprintf(stderr, "Leak (%d bytes at %p):\n", hdr->bytes, hdr + 1);
/* skip the first frame, contains leak detective logic */
hdr->backtrace->log(hdr->backtrace, stderr);
leaks++;
}
}
memory_header_t *hdr;
int leaks = 0, whitelisted = 0;
switch (leaks)
for (hdr = first_header.next; hdr != NULL; hdr = hdr->next)
{
if (is_whitelisted(hdr->backtrace))
{
whitelisted++;
}
else
{
fprintf(stderr, "Leak (%d bytes at %p):\n", hdr->bytes, hdr + 1);
/* skip the first frame, contains leak detective logic */
hdr->backtrace->log(hdr->backtrace, stderr, detailed);
leaks++;
}
}
switch (leaks)
{
case 0:
fprintf(stderr, "No leaks detected");
break;
case 1:
fprintf(stderr, "One leak detected");
break;
default:
fprintf(stderr, "%d leaks detected", leaks);
break;
}
fprintf(stderr, ", %d suppressed by whitelist\n", whitelisted);
}
else
{
case 0:
fprintf(stderr, "No leaks detected");
break;
case 1:
fprintf(stderr, "One leak detected");
break;
default:
fprintf(stderr, "%d leaks detected", leaks);
break;
fprintf(stderr, "Leak detective disabled\n");
}
fprintf(stderr, ", %d suppressed by whitelist\n", whitelisted);
}
/**
@@ -395,7 +401,7 @@ void free_hook(void *ptr, const void *caller)
fprintf(stderr, "freeing invalid memory (%p)", ptr);
}
backtrace = backtrace_create(3);
backtrace->log(backtrace, stderr);
backtrace->log(backtrace, stderr, TRUE);
backtrace->destroy(backtrace);
}
else
@@ -454,7 +460,7 @@ void *realloc_hook(void *old, size_t bytes, const void *caller)
"header magic 0x%x, tail magic 0x%x:\n",
old, hdr->magic, tail->magic);
backtrace = backtrace_create(3);
backtrace->log(backtrace, stderr);
backtrace->log(backtrace, stderr, TRUE);
backtrace->destroy(backtrace);
}
/* clear tail magic, allocate, set tail magic */
@@ -487,7 +493,6 @@ static void destroy(private_leak_detective_t *this)
if (installed)
{
uninstall_hooks();
report_leaks();
}
free(this);
}
@@ -499,6 +504,7 @@ leak_detective_t *leak_detective_create()
{
private_leak_detective_t *this = malloc_thing(private_leak_detective_t);
this->public.report = (void(*)(leak_detective_t*,bool))report;
this->public.destroy = (void(*)(leak_detective_t*))destroy;
if (getenv("LEAK_DETECTIVE_DISABLE") == NULL)